The website platform on Cloudflare

Same dish.
Your sauce.

Khao Pad is the open-source platform that drives a non-ecommerce website end-to-end — content, SEO, analytics, navigation, and engagement — on Cloudflare Workers, D1, R2, and KV. One SvelteKit app: fast public site at `/`, full admin at `/cms`. Fork it, paste in your Cloudflare IDs, deploy. Lighter than Strapi, cheaper than Supabase, stays on Cloudflare.

⚖️ MIT licensed ⚡ SvelteKit · Cloudflare · D1 🌏 EN + TH out of the box
khaopad-example.codustry.workers.dev/articles
🍳
Classic Khao Pad
/classic-khao-pad
Published
🍤
Khao Pad Goong
/khao-pad-goong
Published
🍍
Pineapple Fried Rice
/khao-pad-sapparot
Draft
🌶️
Khao Pad Krapao
/khao-pad-krapao
Published
🌏
Article schema with locales
EN + TH
⚙️
Setup time
~10 min
Cold start
< 50ms
What ships today

More than a CMS. The whole website.

Khao Pad doesn't stop at write-and-publish. It's growing into the five pillars a real website needs — discoverability, insight, information architecture, performance, and engagement. v1.5 ships the content layer; v1.6 onward delivers the rest.

✍️

A markdown editor that respects your hands

Toolbar, split-pane preview, ⌘B / ⌘I / ⌘K shortcuts, image picker tied to your R2 library, autosave to localStorage with a recovery banner if your laptop dies mid-paragraph.

🌏

Locales as a first-class citizen

Articles, categories, and tags each have per-locale title and body. The slug stays English-only and shared, so URLs don't fork. Paraglide compiles UI strings to type-safe functions — no runtime dictionary lookups.

🗄️

D1 + R2, sub-10ms reads

Articles, categories, and tags live in Cloudflare D1 (SQLite at the edge). Media uploads go to R2. Cached read-throughs sit in KV. No external database to manage, no per-region replicas to configure — it's all on Cloudflare's network and reads return in single-digit milliseconds anywhere on the planet.

🔐

Better Auth, sensible defaults

Email + password, D1-backed sessions, four roles out of the box (super_admin → author). First sign-up auto-promotes to super_admin and locks the door behind it.

🚀

Real staging + production from day one

Push main → staging deploy. Tag v1.2.3 → production deploy. Each environment has its own D1/R2/KV bindings. The workflow runs migrations before the worker goes live.

📦

It's a template, not a framework

Click "Use this template", or fork the example repo for a working demo with sample content. Stay in sync with upstream via a weekly sync PR — review and merge on your schedule.

Where we're going

Five pillars to a complete website.

The CMS is the start. v1.6 → v2.0 layers in everything else a real site needs. Each milestone has a public tracking issue.

🔎

Discoverability (v1.6)

Per-page meta, sitemap, robots, JSON-LD, RSS/Atom, slug redirects. Closes the SEO surface.

🗺️

Information architecture (v1.7)

Static pages, navigation manager, media folders, reusable content blocks.

📈

Insight (v1.8)

Privacy-friendly D1 page-views, top articles, search-term insights, per-article sparkline.

Performance & trust (v1.9)

Cloudflare Images responsive srcsets, cache control, custom 404/500, cookie consent, health check.

💬

Engagement & growth (v2.0)

Forms, newsletter, comments, webhooks, public read-only API.

See it running

A live demo with five fried-rice articles, two locales, one click.

The demo is a real fork of the template, deployed to Cloudflare Workers with the same pipeline you'll use. Browse the public site, sign in to the CMS, edit an article, hit save — refresh the public route and your edit is live.

Boring stack on purpose

Tools we'd reach for anyway.

Khao Pad doesn't ship a runtime, an ORM, or an auth library. It composes the ones you already trust.

  • SvelteKit 2 + Svelte 5 runes
  • ☁︎ Workers · D1 · R2 · KV
  • 💧 Drizzle ORM
  • 🔐 Better Auth
  • 🎨 Tailwind CSS 4
  • 🌐 Inlang Paraglide JS 2

Try it for ten minutes.

Click the demo, sign in, edit a fried-rice recipe. If you like what you feel, fork the template and paste in your Cloudflare IDs. We documented every step.