Writing on GIS, maps, and shipping from zero to one.
Writing on GIS, MapLibre, vector tiles, PMTiles, and building with Vue.js, from an engineer taking geospatial products from zero to one.
Subscribe via RSSWorkers 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