Describe an application in plain language. Read the files it produces. Publish them to your own Cloudflare account.
Every project compiles to one of exactly two shapes, and the shape is read off the files rather than set as a mode you have to remember.
Static site. Pages, styles, browser scripts. Uploaded to Cloudflare Pages as a plain asset bundle. Nothing billable.
Edge app. The same bundle plus a _worker.js and, usually, stored data:
D1, KV, R2, Queues, Vectorize, or Durable Objects, declared in a
cloudflare.manifest.json you can read and edit.
A project becomes an edge app the moment it contains a Worker, a SQL migration,
or a Cloudflare config file. See lib/targets.ts.
- Nothing is created without asking. The deploy dialog shows the exact list
of Cloudflare resources, each labelled
createorreuse, and does nothing until you approve it. - Migrations are guarded. New migrations run automatically only if every
statement is on an allowlist (
CREATE,ALTER TABLE … ADD/RENAME,INSERT); anything else (DROP,DELETE,UPDATE, triggers,PRAGMA) stops the deploy for manual review. An applied migration cannot be edited afterwards. SeedisallowedMigrationStatementsinlib/cloudflare-manifest.ts. - Resources belong to one project. Cloudflare resource names are prefixed with the project's Pages name, and a deploy only reuses resources recorded in that project's own state.
- Every successful build is restorable. The version history shows each build with the request that made it and a diff against your current files.
- The output is portable. Ordinary web files and standard Wrangler config. Export a zip or push to a repo you own; deleting this account does not take your app down.
Owners can invite people as editors (change files, run builds, deploy with
their own GitHub or Netlify accounts) or viewers (read only). Everything
that touches the owner's Cloudflare account (deploys, secrets, domains, D1, R2,
teardown), plus publishing, sharing and deletion, stays with the owner. The
rules live in convex/auth.ts and lib/project-access.ts.
Builds on the shared model keys count against a per-user daily and monthly
allowance (shown in Settings); bringing your own key skips it. See
convex/rateLimits.ts.
| Surface | Hosts | Notes |
|---|---|---|
| Cloudflare | static and edge | The default. Into your own account. |
| Cloudflare preview | static and edge | Throwaway subdomain with preview-suffixed resources. Expires on its own. |
| Factory preview | static only | Served from this app. No account needed. |
| GitHub mirror | neither | Pushes the bundle to a repo. Hosts nothing. |
| Netlify | static only | Mirrors to GitHub, then hosts the assets. No Worker runtime. |
- Framework: Next.js 16, App Router
- Database: Convex
- Auth: Stack Auth
- Models: AI Gateway and OpenCode Zen, fetched live on every visit, never hardcoded
- Styling: Tailwind CSS v4, plus the Plate design system in
app/globals.cssandcomponents/kit/ - Runtime: Bun
The interface is documented in DESIGN.md. The short version:
a drafting plate. Ink on warm paper, hairline rules, dense spec tables, one deep
red-lead accent used only for the primary action, the current selection, and
anything live. Dark by default.
Product intent is in PRODUCT.md.
bun install
bun convex dev # pushes the schema, including the `target` field
bun run devOpen http://localhost:3000.
Environment variables, OAuth scopes, and the decisions still outstanding are all
in REQUIREMENTS.md. The Cloudflare OAuth scope list in
particular is worth reading before the first deploy: a missing scope surfaces as
a runtime failure in the deploy dialog, not at build time.
bun run typecheck
bun run lint # zero warnings allowed
bun run test:ci # unit, route and Convex tests
bun run test:coverage
bun run build
bun run test:e2e # Playwright smoke tests against the buildapp/ routes
components/kit/ the whole component vocabulary
components/shell/ top bar, footer, account, theme, model picker
components/brand/ the mark and lockup
components/landing/ landing page sections
components/editor/ workspace panes
lib/targets.ts build targets and deploy surfaces
lib/cloudflare*.ts manifest parsing, provisioning, deployment
convex/ schema and server functions