Personal site and blog for Jayson Knight, built on a modern edge-first stack.
| Layer | Technology |
|---|---|
| Framework | Astro 6 — server-rendered, edge-optimised |
| UI Components | Svelte 5 |
| Styling | Tailwind CSS 4 |
| Language | TypeScript 5 |
| Runtime / Deploy | Cloudflare Workers (via @astrojs/cloudflare) |
| CMS | EmDash — headless blog CMS for Astro |
| Database | Cloudflare D1 (SQLite at the edge) |
| Media Storage | Cloudflare R2 |
| Edge Cache / Sessions | Cloudflare KV |
| Analytics | Cloudflare Analytics Engine |
| Build tooling | Vite 8 w/ Rolldown (Rust compiler, default in Astro 6) |
| Fonts | Google Fonts via Astro's built-in Fonts API (Space Grotesk, JetBrains Mono) |
| API layer | Hono |
| Validation | Zod 4 |
| Syntax highlighting | Shiki 4 |
The blog is powered by EmDash, a headless CMS built for Astro. Content is stored in a Cloudflare D1 database; media assets live in R2.
# Install dependencies
npm install
# Start local dev server
npm run dev
# Build for production
npm run build
# Run unit tests
npm run test
# Deploy to Cloudflare Workers
npm run deployRequires Node ≥ 24 and a Cloudflare account with D1, R2, KV, and Analytics Engine resources provisioned. See
wrangler.jsoncfor binding names andnpm run db:createto initialise the D1 database.
Copy .env.example to .env and populate the required values. Secrets should be set via wrangler secret put for production deployments.