RSSAmplifier

Blog

Vinayak Kulkarni - Articles

Writing on GIS, MapLibre, vector tiles, PMTiles, and building with Vue.js.

vinayakkulkarni.devRSS feed ↗11 posts

Latest posts

TIL: Cloudflare was prepending Disallow rules above my robots.txt

I authored a robots.txt that explicitly invited AI crawlers. Production served a Cloudflare-managed block above it that disallowed eight of them. The repo never showed it, no API can turn it off, and RFC 9309 group-merging is the only thing standing between your allowlist and invisibility.

Making a Nuxt site agent-ready: from Level 1 to Level 4 on isitagentready.com

AI agents are starting to operate websites, not just cite them. What it took to move a production Nuxt site on Cloudflare Workers from a score of 21 to Level 4 on the isitagentready scanner: markdown negotiation, API catalogs, agent-skills indexes, WebMCP, and the traps nobody documents.

Workers Cache on an authenticated tile API: the split-entrypoint pattern

How to enable Cloudflare Workers Cache on an API that must authenticate and meter every request, using an uncached gateway entrypoint in front of a cached origin entrypoint. Warm viewport hit rate went from 10% to 100% and median warm tile latency dropped from 874ms to under 100ms.

Encoding elevation into pixels: DEM terrain tiles in Rust

How tileserver-rs turns raw GDAL elevation rasters into Terrarium and Mapbox-RGB terrain tiles that MapLibre renders as 3D terrain. The math, the classic 1-LSB encoding bug, and why the alpha channel will betray you.

How I cut a $35 Supabase bill to $0 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

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

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

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

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

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

Let's build a reusable Vue 3 component using rollup