Tech Stack
Backend (Worker)
Hono
Hono is the HTTP framework that runs in the Cloudflare Worker. It was chosen for:
- First-class Cloudflare Workers support
- Tiny bundle size (important for Worker cold starts)
- TypeScript-first API
@hono/zod-openapifor typed, validated routes
Routes are defined in src/server/routes/ and mounted in src/server/index.ts.
@hono/zod-openapi
Every route is defined with a Zod schema for both input validation and response typing. This enables:
- Automatic request validation (400 on bad input)
- Type-safe route handlers
- OpenAPI spec generation (not currently exposed as an endpoint, but useful for tooling)
Cloudflare D1
SQLite at the edge. Accessed via the DB binding. All queries use the D1 REST-style API (db.prepare(...).bind(...).all()).
No ORM is used — queries are raw SQL. This keeps the bundle small and avoids ORM-specific footguns in a Worker context.
Cloudflare R2
S3-compatible object storage for media assets. Accessed via the ASSETS binding.
Cloudflare KV
Globally-replicated key-value store used as a delivery cache. KV reads are O(1) with global replication, making it ideal for the high-read, low-write delivery API pattern.
Frontend (React SPA)
React 19
The UI is a client-side SPA built with React 19. It’s built by Vite and served as static assets from the Worker.
React Router 7
Client-side routing. All navigation is handled client-side with no server-rendered HTML (except the initial index.html shell).
Zustand
Lightweight state management. Two stores:
uiStore— Auth state, current org/space/env, UI togglespageStore— Page editing state (current page, zones, selected component)
See State Management for details.
Tiptap
Rich text editor for richtext fields. Based on ProseMirror. Configured with standard formatting extensions (bold, italic, lists, headings, links).
@dnd-kit
Drag-and-drop library for reordering components within zones. Used in the Canvas component.
Tailwind CSS 4
Utility-first CSS. Version 4 uses the new CSS-first configuration (@theme in CSS instead of tailwind.config.js).
Vite 6
Frontend build tool. In development, Vite serves the React app with HMR on :5173. In production, it outputs to dist/ which the Worker serves as static assets.
Shared
Zod
Schema validation used on both the client and server. The shared/ directory contains type definitions and the built-in component schemas (field definitions for Hero, Banner, etc.).
TypeScript
Strict TypeScript throughout. tsconfig.json sets "strict": true.