Define your features.
Get your secure backend.

One TypeScript file per table, written by you or your agent, becomes a production Hono backend: typed API, auth, migrations, admin UI, MCP server. Security is compiled in, so it can't be forgotten.

Free while in beta. Standard Hono + Drizzle + Better Auth on your own Cloudflare account.Read the docs

HonoDrizzleBetter AuthCloudflareNeon

Get started

Three ways in. Same backend out.

Describe the app. The Start agent defines the features, runs the build, walks you through what it generated, and hands you a project you can deploy from the browser or download. No install, no signup to try.

Try it — describe an app, get a real backend

A real build validates every definition. No signup to try it.

How it works

Prompt. Define. Generate.

Describe a feature. Your agent turns it into one TypeScript file, or you write it yourself. Build, and every layer you declared lands in the routes, the migration, the types, the docs, the MCP tools and the admin UI.

1 Prompt you → your agent

Build a hiring pipeline for my side project.Each company is its own organization; nobody ever sees another company's jobs.A job has a title, department, status, salary range and internal notes.Anyone on the team can read jobs, but only hiring managers and admins can create or edit them, and only admins can delete.Salary is set when the job is created, not edited later.Hide internal notes from everyone except admins.Add a “close job” step that moves an open job to closed and records who closed it.

2 Definequickback/features/jobs/jobs.ts
// quickback/features/jobs/jobs.tsimport { feature, q } from "@quickback/compiler"; export default feature("jobs", {  columns: {    id:             q.id(),    title:          q.text().required().searchable(),    department:     q.text().required().filterable("eq"),    status:         q.enum(["draft", "open", "closed"]).default("draft").required(),    salaryMin:      q.int().optional(),    salaryMax:      q.int().optional(),    internalNotes:  q.text().optional(),    closedAt:       q.timestamp().optional(),    closedById:     q.text().optional(),    organizationId: q.scope("organization"),    ...q.audit(),    ...q.softDelete(),  },  // firewall derived from q.scope():  //   WHERE organization_id = ctx.activeOrgId AND deleted_at IS NULL   guards: {    createable: ["title", "department", "salaryMin", "salaryMax", "internalNotes"],    updatable:  ["title", "department", "internalNotes"],    protected:  { status: ["close"], closedAt: ["close"], closedById: ["close"] },  },   masking: {    internalNotes: { type: "redact", show: { roles: ["admin+"] } },  },   read:   { access: { roles: ["member+"] }, pageSize: 25 },  create: { access: { roles: ["hiring-manager", "admin+"] } },  update: { access: { roles: ["hiring-manager", "admin+"] } },  delete: { access: { roles: ["admin+"] }, mode: "soft" },   transitions: {    close: {      field: "status", from: "open", to: "closed",      access: { roles: ["hiring-manager", "admin+"] },      stamp: { at: "closedAt", by: "closedById" },    },  },});
3 Generate
src/index.tsfeatures/jobs/schema.tsjobs.resource.tsjobs.routes.tslib/ · middleware/ · auth/quickback/drizzle/features/0000_initial.sqlquickback.gen.tsopenapi.jsonschema-registry.json
  1. $ quickback build
  2. ✓ parsed 1 feature · 1 table · 1 transition
  3. ✓ firewall: organization scope + soft delete on jobs
  4. ✓ access: 5 operations gated, deny by default
  5. ✓ guards: 5 createable · 3 updatable · 3 protected
  6. ✓ masking: internalNotes redacted below admin
  7. ✓ emitted Hono routes, Drizzle migration, types, OpenAPI, MCP tools, admin registry
  8. done in 2.4s

Real shapes from the complete example in the docs, trimmed to fit. Nothing here runs on our servers: the build emits code, you deploy it.

Faster

The boring 80% is already done.

Everything a backend needs before your first real feature is generated from the same definitions. You spend your time, and your tokens, on what makes your app yours.

All the basics you'd expect

Auth: email, passkeys, magic links, orgsCRUD with pagination, filter, search, sortMigrationsSoft delete + audit columnsBatch operationsRate limitingWebhooks + queuesOpenAPI 3.1Stripe subscriptions

Typed end to end

Every build emits quickback.gen.ts: Row, Insert, Update, view items and action input/output for every table, with branded IDs so a candidate ID can't be passed where a job ID goes. Type-only, no runtime package.

Your agent already knows it

The CLI installs a Claude Code skill, Cursor rules and an MCP server that serves the docs, your config and your definitions to any AI tool. And because the build validates every definition, your agent is told exactly what's wrong instead of guessing at runtime.

An admin UI, for free

Set cms: true and a schema-driven CMS ships inside your Worker. Tables, inline editing, action dialogs, role switching, masked columns. Zero UI code per table. Add a table, rebuild, it's there.

Save your tokens

Your agent writes forty lines of definitions, not two thousand lines of routes, policies, migrations and types. Less to generate, less to review, and nothing security-critical left for a model to improvise. The build catches mistakes before a single request does.

More secure

Secure, because you can't forget.

Security isn't middleware you remember to add. It's declared next to the table and compiled into every route, every MCP tool and every admin button. The build refuses to emit an endpoint without it.

Firewall

Every table is scoped to a tenant. The WHERE clause is compiled into every query, so a cross-org read cannot be written.

Access

Roles gate every operation. Deny by default: no write route exists until you declare one.

Guards

Only the fields you list are writable from the client. Everything else is dropped before it reaches the database.

Masking

PII and notes are redacted below the role you name, in the API, the MCP tools, and the admin UI alike.

Rate limits

Per-operation request caps on every endpoint, backed by Cloudflare. Nothing to install.

Also in the box: end-to-end encryption for chosen columns, workflows with guarded transitions, and a per-view column allowlist so different roles see different fields.How the layers stack

When it doesn't fit

You're never stuck.

Generated code covers the common case. For everything else there are two doors, and both are wide open.

Door one

Drop into code

An action is a typed handler with the firewalled database in hand. Write any TypeScript. Need raw SQL? Opt in on that one action and the build lets it through, on the record.

// quickback/features/jobs/actions/salary-bands.ts
import { z } from "zod";
import { sql } from "drizzle-orm";
import { defineAction } from "../.quickback/define-action";

export default defineAction({
  path: "/salary-bands",              // standalone, not per-record
  access: { roles: ["admin+"] },
  allowRawSql: true,                  // explicit, per action
  output: z.array(z.object({ department: z.string(), median: z.number() })),
  async execute({ db, ctx }) {
    return db.execute(sql`
      SELECT department, AVG(salary_min) AS median
      FROM jobs
      WHERE organization_id = ${ctx.activeOrgId}   -- raw SQL: you scope it
      GROUP BY department
    `);
  },
});

Every automatic rule has an explicit exception, too: firewall exceptions, access overrides, guard opt-outs, one resource at a time.Actions

Door two

Or just fork the code

The output is ordinary TypeScript: Hono routes, Drizzle schema and migrations, Better Auth. No SDK, no runtime, no proprietary anything. Stop running the build tomorrow and you still have a working codebase on libraries you already know.

  • Nothing runs on Quickback's servers. We never see your database or your data.
  • Your action handlers live in your project and are never overwritten.
  • Rebuilds overwrite src/ only. Patch it after a build, or branch off for good.

What gets generated

Define. Build. Ship.

Free while in beta. Your code, your Cloudflare account, our build step.

Questions about rebuilds, lock-in, databases or custom logic? Read the FAQ