41554 blogs · [
{
"id": "01a0d4b1-bf4d-7280-befc-21ac3937b0dd",
"title": "I added a TIN index to my Postgres output and found the schema had never been written",
"url": "https://vinayakkulkarni.dev/articles/tin-index-and-a-schema-that-was-never-written",
"published_at": "2026-09-24T17:30:00+00:00"
},
{
"id": "01a0d4b1-bf4d-7280-befc-21ac39b086bc",
"title": "100% coverage, three live bugs: porting a plugin to OpenCode 2",
"url": "https://vinayakkulkarni.dev/articles/porting-a-plugin-to-opencode-2",
"published_at": "2026-09-24T15:30:00+00:00"
},
{
"id": "01a0d4b1-bf4d-7280-befc-21ac3a31f0a3",
"title": "One caret sign, 194 silent 500s: the outage that only broke on the second request",
"url": "https://vinayakkulkarni.dev/articles/one-caret-sign-194-silent-500s",
"published_at": "2026-09-19T15:30:00+00:00"
},
{
"id": "01a08c5d-4aa2-7069-82a5-95cb82e3aa97",
"title": "TIL: Cloudflare was prepending Disallow rules above my robots.txt",
"url": "https://vinayakkulkarni.dev/articles/til-cloudflare-prepends-managed-robots-txt",
"published_at": "2026-07-27T14:30:00+00:00"
},
{
"id": "01a08c5d-4aa2-7069-82a5-95cb830ebb3b",
"title": "Making a Nuxt site agent-ready: from Level 1 to Level 4 on isitagentready.com",
"url": "https://vinayakkulkarni.dev/articles/making-a-nuxt-site-agent-ready",
"published_at": "2026-07-20T07:00:00+00:00"
},
{
"id": "01a08c5d-4aa2-7069-82a5-95cb83942a90",
"title": "Workers Cache on an authenticated tile API: the split-entrypoint pattern",
"url": "https://vinayakkulkarni.dev/articles/workers-cache-on-an-authenticated-tile-api",
"published_at": "2026-07-13T18:15:00+00:00"
},
{
"id": "01a08c5d-4aa2-7069-82a5-95cb8476bb05",
"title": "Encoding elevation into pixels: DEM terrain tiles in Rust",
"url": "https://vinayakkulkarni.dev/articles/encoding-elevation-into-pixels",
"published_at": "2026-07-12T06:00:00+00:00"
},
{
"id": "01a08c5d-4aa2-7069-82a5-95cb84922a6f",
"title": "How I cut a $35 Supabase bill to $0 with Cloudflare D1",
"url": "https://vinayakkulkarni.dev/articles/cutting-a-supabase-bill-to-zero-with-cloudflare-d1",
"published_at": "2026-07-07T13:00:00+00:00"
},
{
"id": "01a08c5d-4aa2-7069-82a5-95cb851a86c1",
"title": "TIL: Shiki multi-theme highlighting does not switch the code-block background",
"url": "https://vinayakkulkarni.dev/articles/til-shiki-multitheme-code-block-background",
"published_at": "2026-07-06T21:00:00+00:00"
},
{
"id": "01a08c5d-4aa2-7069-82a5-95cb85bc4955",
"title": "Generating dynamic Open Graph images on Cloudflare Workers",
"url": "https://vinayakkulkarni.dev/articles/dynamic-og-images-on-cloudflare-workers",
"published_at": "2026-07-06T16:30:00+00:00"
},
{
"id": "01a08c5d-4aa2-7069-82a5-95cb86229f90",
"title": "Migrating a Nuxt site from Cloudflare Pages to Workers",
"url": "https://vinayakkulkarni.dev/articles/migrating-a-nuxt-site-from-cloudflare-pages-to-workers",
"published_at": "2026-07-06T15:30:00+00:00"
},
{
"id": "01a08c5d-4aa2-7069-82a5-95cb86966377",
"title": "TIL: Tailwind v4 mask utilities need the webkit prefix in plain CSS",
"url": "https://vinayakkulkarni.dev/articles/til-tailwind-v4-webkit-mask-prefix",
"published_at": "2026-07-06T14:45:00+00:00"
},
{
"id": "01a08c5d-4aa2-7069-82a5-95cb874700c6",
"title": "TIL: Enabling Workers Cache through Nitro without a native option",
"url": "https://vinayakkulkarni.dev/articles/til-workers-cache-nitro-passthrough",
"published_at": "2026-07-06T09:00:00+00:00"
},
{
"id": "01a08c5d-4aa2-7069-82a5-95cb877647a4",
"title": "Build & Publish Vue 3 Components using Rollup.js",
"url": "https://vinayakkulkarni.dev/articles/build-and-publish-vue-3-components-using-rollup",
"published_at": "2022-07-04T10:50:09+00:00"
}
] posts Claim your blog