The Tech Stack Behind This Site
Why I chose Astro, Cloudflare, and Drizzle ORM — and how they fit together.
Overview
This site is built with a minimal stack:
- Astro — static-first framework with server-side rendering where needed
- Cloudflare Pages + Workers — hosting and edge compute
- Cloudflare D1 — SQLite database at the edge
- Drizzle ORM — type-safe database access
- TypeScript — throughout
No component framework. No build-time CSS tooling. Just Astro components, plain CSS with custom properties, and markdown content.
Why Astro
Most pages on this site are static — notes, playgrounds, the index page. They don’t need JavaScript or server-side rendering. Astro’s default of shipping zero JS to the client is exactly right for this.
For the few parts that do need a server (API endpoints, dynamic routes), Astro supports per-route opt-in to SSR. One config, one framework, both modes.
Content Collections handle markdown with typed frontmatter, which keeps notes structured without a CMS.
Why Cloudflare
Cloudflare Pages deploys static assets to a global CDN. Workers handle server-side routes at the edge. D1 provides a SQLite database without managing infrastructure.
The free tier covers everything a personal site needs. And the integration between Pages, Workers, and D1 is seamless — no glue code, no separate deploy steps.
Why Drizzle
D1 is SQLite. Drizzle speaks SQLite natively, with full TypeScript type inference from schema definitions. The schema is the source of truth — no separate type files, no runtime validation layer.
For a site this size, it might seem like overkill. But having typed queries from day one means I never have to wonder what shape the data is in.
Branching and deploy
The repository uses two branches:
- develop — default branch for day-to-day work
- main — production. Merging to main triggers a Cloudflare Pages deploy
This keeps the deployed site stable while allowing work-in-progress on develop.
What’s next
The site currently has two sections — notes and play. Both will grow over time, with content in English, Japanese, and Korean as needed. The stack is intentionally simple so adding content is the only bottleneck.