# Vinayak Kulkarni > GIS Engineer & Co-Founder building geospatial infrastructure — MapLibre, Planetiler, PMTiles, and Vue.js. Open-source cartographer shipping maps, tiling pipelines, and mapping tooling. Vinayak Kulkarni is a GIS engineer and co-founder at Invarya Technologies, where he builds maps.guru and geospatial tooling. He works across the modern web-mapping stack — MapLibre GL for rendering, Planetiler and PMTiles for vector-tile generation and delivery, and Vue.js on the frontend — and maintains open-source Vue mapping packages including v-maplibre and maplibre-gl-starfield. ## Pages - [About](https://vinayakkulkarni.dev/about): Who Vinayak is — a GIS engineer and co-founder focused on geospatial infrastructure, web cartography, and open-source mapping. - [Projects](https://vinayakkulkarni.dev/projects): Selected work across web mapping, vector tiling, and geospatial platforms, including maps.guru. - [Open Source](https://vinayakkulkarni.dev/open-source): Vue and MapLibre open-source packages Vinayak maintains, such as v-maplibre and maplibre-gl-starfield. - [Articles](https://vinayakkulkarni.dev/articles): Writing on GIS, MapLibre, vector tiles, PMTiles, and building with Vue.js. ## Articles - [How I cut a $35 Supabase bill to $0 with Cloudflare D1](https://vinayakkulkarni.dev/articles/cutting-a-supabase-bill-to-zero-with-cloudflare-d1): Moving a live multi-tenant SaaS off Supabase Postgres onto Cloudflare D1 with zero downtime. The schema rewrite was the easy part. The date-coercion bug, the PostGIS audit, and the break-even math were not. - [TIL: Shiki multi-theme highlighting does not switch the code-block background](https://vinayakkulkarni.dev/articles/til-shiki-multitheme-code-block-background): Shiki multi-theme mode swaps token colours per colour scheme but leaves the pre background variable empty, so light-theme text can land on a dark block. You have to theme the container yourself. - [Generating dynamic Open Graph images on Cloudflare Workers](https://vinayakkulkarni.dev/articles/dynamic-og-images-on-cloudflare-workers): Rendering per-page and per-article social cards at the edge with Satori and @cf-wasm/og: how the route works, what Satori refuses to render, and the cold-versus-warm numbers. - [Migrating a Nuxt site from Cloudflare Pages to Workers](https://vinayakkulkarni.dev/articles/migrating-a-nuxt-site-from-cloudflare-pages-to-workers): The full path from the cloudflare-pages preset to a cloudflare_module Worker: the config changes, the custom-domain cutover that no deploy step handles for you, and the gotchas that only show up in CI. - [TIL: Tailwind v4 mask utilities need the webkit prefix in plain CSS](https://vinayakkulkarni.dev/articles/til-tailwind-v4-webkit-mask-prefix): Porting a Tailwind mask-composite utility to scoped CSS quietly breaks in Chrome and Safari unless you also write the -webkit-mask-* properties, because Tailwind was emitting them for you. - [TIL: Enabling Workers Cache through Nitro without a native option](https://vinayakkulkarni.dev/articles/til-workers-cache-nitro-passthrough): Nitro forwards arbitrary keys into the generated wrangler config, so you can turn on Cloudflare Workers Cache with a single line even though there is no dedicated Nitro option for it. - [Build & Publish Vue 3 Components using Rollup.js](https://vinayakkulkarni.dev/articles/build-and-publish-vue-3-components-using-rollup): Let's build a reusable Vue 3 component using rollup ## Optional - [Full content index](https://vinayakkulkarni.dev/llms-full.txt): Plaintext of the most important pages for single-round-trip ingestion.