Skip to content

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-openapi for 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 toggles
  • pageStore — 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.