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 RSS
cloudflare

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.

cloudflareworkerscachepmtilesnitrogis
gis

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.

rustgismaplibredemterraingdal
cloudflare

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.

cloudflared1supabasesqlitedrizzlenuxtmigration
nuxt

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.

nuxtshikinuxt-contentdark-mode
cloudflare

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.

cloudflareworkersopen-graphsatorinuxt
cloudflare

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.

cloudflareworkersnuxtnitrodevops
css

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.

tailwindcsswebkit
cloudflare

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.

cloudflareworkersnitronuxt
vue

Build & Publish Vue 3 Components using Rollup.js

Let's build a reusable Vue 3 component using rollup

vue 3rollup