Validation
Every write checked against the field rules in the schema.
autoValidate()
One starting source of truth. Get your database, API and UI …with validation, authorization, pagination, live updates, migrations, typed clients and forms derived, not written.
Why
Code is cheap now. An agent writes a route, a validator and a form in a minute. What it can't do is make them agree with each other.
Writing code stopped being the hard part. Keeping an app coherent didn't.
Every duplicated truth eventually becomes a duplicated mental model.
db/schema.lite, and derives the rest. Access is enforced at the data, so code an agent writes can't route around it. The long version →When not to use it: pre-alpha, Bun and SQLite only →
FrontierJS is assembled out of 27 other projects. Each word is one of them, sized by how close it is; hover one to see what was taken and where it stops.
TakenDirect ancestor of Junction. find/get/create/patch/remove, before/after/around/error hooks, channels + publish, $limit/$skip.
Stops atNever closed the Data gap — service is not derived from schema.
TakenSpec-driven, batteries-included, explicit whole-app declaration. Nearest thesis twin.
Stops atDropped its custom DSL for a TypeScript spec in June 2026 after 5 years. Read the post-mortem before touching .lite.
Takenschema.ts to reactive queries to real-time by default. Live-by-default is core, not bolt-on.
Stops atPush-from-query rather than push-from-mutation-event. Costlier than FJS, correct more often.
TakenPrisma schema plus access policies declared in the schema. Literally gates. Record-level auth reference.
Stops atPolicy language grew a full expression grammar — schema overreach.
Takenschema to SDL to cells to UI, Prisma-rooted. Source of the Cell pattern.
Stops atRedwood GraphQL wound down; CedarJS is the maintained fork. The Redwood name now means RedwoodSDK (Cloudflare/RSC), unrelated.
TakenOriginal live-by-default and isomorphic stack.
Stops atDied of coupling. Read as autopsy — what happens when intentional gaps get closed too.
TakenSource of the Channel vocabulary. Contexts map closely to realms.
Stops atEcto changesets — validation as a value that travels, not a hook side-effect. Not yet adopted in FJS.
TakenTS entity as single source of truth to REST plus frontend client plus admin. Same thesis, tiny surface.
Stops atNot yet studied. Closest thing to a control experiment for the FJS thesis.
TakenClosest Node analog for structure, CLI, and conventions. fli should feel like ace.
Stops atSchema is not the seed — models are classes.
Takenschema to API plus realtime plus RLS, generated. RLS is the gate system in Postgres form.
Stops atProof that declared access scales. No application realm above it.
TakenConfig-as-code collections to REST/GraphQL/admin, with hooks and per-operation access functions. Near-identical shape to Model plus Service plus Gate.
Stops atAccess is imperative functions, not declared attributes.
TakenThe zero-API thesis. Mostly dead.
Stops atRemoving the API realm entirely was the wrong cut. FJS kept it as an intentional gap — that was right.
TakenBlueprint routes auto-generated from models, realtime blueprints over sockets. The 2014 version of this idea.
Stops atLost because the ORM had no schema authority. Study the failure directly.
TakenModel to API automatically, with ACLs declared on the model. Same gate instinct.
Stops atDrowned in decorators. Cautionary case for declaration ergonomics.
TakenInfrastructure declared in code, provisioned from the declaration. Best available model for the Manifest to Release pattern.
Stops atNobody else does declaration to realization this cleanly at the infra level. Under-studied.
TakenDatabase to GraphQL API to role permissions, with no controllers in between. Row filters keyed on session variables are a gate by another name.
Stops atPermissions live in metadata beside the schema, not in it. A separate engine in front of the database; no application realm of its own.
TakenA data model becomes a whole app surface: REST/GraphQL API, role permissions, an admin studio and forms.
Stops atThe surface it reaches is an admin panel, and the model is configured through the studio and stored in the database rather than written in a file.
TakenOne request DTO yields a query API, CRUD, an auto UI (Locode) and typed clients in a dozen languages.
Stops at.NET, and query operators are inferred from property-name suffixes (`AgeOlderThan`, `NameStartsWith`), so the vocabulary is spelled into every field name.
Taken"The schema is the application": REST API, cell-level security, content rendering, messaging, audit trail with rollback and a scheduler, all from the schema.
Stops atHosted, invite-only and closed. Security is records you configure rather than declarations you read, over MySQL or SQL Server.
TakenOne schema file with `@primary`, `@unique`, `@refs()`, `@default()` attributes generates a server, REST API, browser UI, MCP tools and OpenAPI docs.
Stops atA generator over many databases at once; the AI tools are a generated layer, and access rules are not visible in the schema it shows.
TakenConvention over configuration. Kamal 2 is already the FJS deploy model.
Stops atMigrations, not schema-as-seed. Schema is the output, not the input.
TakenForge and Vapor are the Basecamp precedent. Ecosystem-as-product.
Stops atSame schema-as-output problem as Rails.
TakenThe assembled alternative FJS argues against. The honest comparison.
Stops atType safety across the wire, but no runtime coherence. Types are not gates.
TakenTS schema to data plus auth plus API in one declaration. Same radiation.
Stops atWorse ergonomics, vendor-locked. Radiation without coherence.
TakenSierra's direct model. File-system routing, load(), prefetch, layouts. .mesa maps to .svelte, script module maps to Svelte's module context block.
Stops atNo Data or API realm. Sierra inherits the shape but not the seed.
TakenMesa's reactivity model. Fine-grained signals, compile-away components, no virtual DOM. createSignal maps directly to Mesa's runtime primitives.
Stops atLibrary, not framework. Mesa takes the runtime, Sierra supplies everything above it.
TakenRust multi-model content database: YAML NodeTypes at hierarchical paths, graph edges, vector and full-text search, realtime subscriptions, git-like branches of schema and content.
Stops atA database, not an application framework — the frontend maps nodes to components on its own. BSL-licensed.
The full register — what was taken, where it stops, what we did with it →
Every write checked against the field rules in the schema.
autoValidate()
Who can read and write a row is declared on the model.
@@gate
Limits, offsets and cursors on every list, with no slicing in memory.
$after
Lists change on screen when the rows change.
announce()
The schema is diffed against the live database. You never write a migration file.
The browser knows every service, field and filter.
ServiceTypes
The right control, label and options per field, and server errors on the right input.
@label
Every write is logged, with protected fields redacted.
An MCP endpoint over your app, with the gate as the permission model.
mcp()
Sensitive fields are sealed at the data boundary.
@encrypted
The UI shows only the actions allowed now, and the server refuses the rest.
@@transitions
Two people editing one record cannot overwrite each other.
x-version
Who sees what, per field rather than per row.
$readAs
Nobody filters or sorts on a field they cannot read.
$checkWhere
One app, many tenants, each kept to its own data.
resolveTenancy
Browse and edit every model from the schema alone.
Litestone Studio
A real app over a real database, in every test.
createTestEnv