FrontierJS

The Frontier
is coming.

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

Why a framework, now that agents write the code?

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.

Our answer

  1. Coherence. An agent learns your rules by reading your code. If one fact lives in the schema, the validator, the type, the middleware and the docs, it learns five versions and copies whichever it read last. FrontierJS states each fact once, in db/schema.lite, and derives the rest. Access is enforced at the data, so code an agent writes can't route around it.
  2. It isn't new. These ideas have run real apps for years, as the glue we wrote to make Prisma, Feathers and Svelte agree about one app. FrontierJS is the same design with the seams taken out: each layer has one owner, so nothing has to be translated between them.
  3. Architecture still matters. An agent multiplies whatever it's handed. A clear design gets more done; a tangled one gets more tangled, faster. Three nouns (Model, Service, Resource) are a model small enough that a person can check what an agent built.

The long version →When not to use it: pre-alpha, Bun and SQLite only →

Nothing here was invented

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.

Direct lineage Partial overlap Ancestors
Feathers.js API · tier 1 · closeness 95 · influence 90

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.

Wasp All · tier 1 · closeness 45 · influence 70

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.

Convex Data + API · tier 1 · closeness 35 · influence 25

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.

ZenStack v3 Data · tier 1 · closeness 60 · influence 85

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.

RedwoodJS All · tier 1 · closeness 40 · influence 65

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.

Meteor All · tier 1 · closeness 25 · influence 50

TakenOriginal live-by-default and isomorphic stack.

Stops atDied of coupling. Read as autopsy — what happens when intentional gaps get closed too.

Phoenix API + Data · tier 1 · closeness 20 · influence 60

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.

Remult All · tier 1 · closeness 55 · influence 10

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.

AdonisJS API · tier 2 · closeness 45 · influence 70

TakenClosest Node analog for structure, CLI, and conventions. fli should feel like ace.

Stops atSchema is not the seed — models are classes.

Supabase Data · tier 2 · closeness 30 · influence 40

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.

Payload CMS Data + API · tier 2 · closeness 50 · influence 20

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.

Blitz.js API · tier 2 · closeness 30 · influence 35

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.

Sails.js / Waterline API + Data · tier 2 · closeness 45 · influence 30

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.

LoopBack 4 API + Data · tier 2 · closeness 35 · influence 25

TakenModel to API automatically, with ACLs declared on the model. Same gate instinct.

Stops atDrowned in decorators. Cautionary case for declaration ergonomics.

Encore.ts Deployment · tier 2 · closeness 25 · influence 15

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.

Hasura Data + API · tier 2 · closeness 25 · influence 10

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.

Directus Data + UI · tier 2 · closeness 15 · influence 5

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.

ServiceStack AutoQuery API + UI · tier 2 · closeness 20 · influence 5

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.

dbo.io All · tier 2 · closeness 25 · influence 5

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.

Schema2AI All · tier 2 · closeness 45 · influence 5

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.

Ruby on Rails All · tier 3 · closeness 20 · influence 85

TakenConvention over configuration. Kamal 2 is already the FJS deploy model.

Stops atMigrations, not schema-as-seed. Schema is the output, not the input.

Laravel All · tier 3 · closeness 20 · influence 80

TakenForge and Vapor are the Basecamp precedent. Ecosystem-as-product.

Stops atSame schema-as-output problem as Rails.

Prisma + tRPC Data + API · tier 3 · closeness 40 · influence 60

TakenThe assembled alternative FJS argues against. The honest comparison.

Stops atType safety across the wire, but no runtime coherence. Types are not gates.

AWS Amplify Gen 2 All · tier 3 · closeness 30 · influence 15

TakenTS schema to data plus auth plus API in one declaration. Same radiation.

Stops atWorse ergonomics, vendor-locked. Radiation without coherence.

SvelteKit UI · tier 3 · closeness 75 · influence 90

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.

SolidJS UI · tier 3 · closeness 70 · influence 85

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.

RaisinDB Data · tier 3 · closeness 15 · influence 0

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 →

Derived from the schema, extended by you

Validation

Every write checked against the field rules in the schema.

autoValidate()

Authorization

Who can read and write a row is declared on the model.

@@gate

Pagination

Limits, offsets and cursors on every list, with no slicing in memory.

$after

Live updates

Lists change on screen when the rows change.

announce()

Migrations

The schema is diffed against the live database. You never write a migration file.

Typed client

The browser knows every service, field and filter.

ServiceTypes

Forms

The right control, label and options per field, and server errors on the right input.

@label

Audit trail

Every write is logged, with protected fields redacted.

AI agent access

An MCP endpoint over your app, with the gate as the permission model.

mcp()

Encryption at rest

Sensitive fields are sealed at the data boundary.

@encrypted

State machines

The UI shows only the actions allowed now, and the server refuses the rest.

@@transitions

Conflict detection

Two people editing one record cannot overwrite each other.

x-version

Field-level redaction

Who sees what, per field rather than per row.

$readAs

Safe filter and sort

Nobody filters or sorts on a field they cannot read.

$checkWhere

Multi-tenancy

One app, many tenants, each kept to its own data.

resolveTenancy

Admin UI

Browse and edit every model from the schema alone.

Litestone Studio

Test environment

A real app over a real database, in every test.

createTestEnv

The packages

Every package, its realm and how far along it is →