Ultimate

Ultimate wiki

The full-stack framework where the primary developer is an AI agent. Rails' philosophy on Bun + Postgres + SolidJS: everything is one of eight primitives, and one action declaration projects into an HTTP route, an OpenAPI operation, a typed client, a job handle, an MCP tool and a test, all behind one policy. x verify is the contract: green means shippable.

bunx create-ultimate myapp && cd myapp && bun run setup && bun run dev

No Docker and no service: embedded Postgres, in-process NATS, local storage, a seeded database and a dev dashboard at /_x. bun run setup is not optional: x new installs nothing, so x dev straight after cd stops on X_BUILD_FAILED naming bun install → Getting started · Bare VM.

Look first: the live demo, a social network deployed from main on every green push. Fabricated data, every row decided by a policy. Source: dummy/social-media-clone/.

Why pick it, and when not to

Pick it whenDo not pick it when
an agent writes most of your code: one way per task, --json everywhere, every error a code, a cause and a fix: commandyou need Node.js or Deno: Bun only
you want authz written once: one policy guards HTTP, live queries, jobs, MCP and adminyour database is not Postgres, or your UI is not SolidJS
you want jobs, realtime, auth, mail, storage, i18n, SEO, admin and MCP decided and gatedyou deploy to Vercel functions, Lambda or Workers: containers only
the app may grow: the same code from one PaaS process to Kubernetesyou want a plugin API (an app wraps a primitive instead), or multi-node realtime proven today (Known gaps)

Is it for a project this size

Yes at both ends, and that is the design. A homework assignment or a weekend idea gets a running app in four commands with nothing to install and nothing to choose; a very large product gets the scale ladder, the tier boundaries and the same 21-step gate the beginner's app already ran — the list is VERIFY_STEP_NAMES in packages/cli/src/verify-step.ts, whole or not at all. One framework, no lite mode — axiom 1 forbids the second path a lite mode would be.

The measured version of that claim, with the command behind every number: docs/idea/21-the-range.md.

Proof, each with a command: what npm serves is npm view @ultimat3/core version; that every package is published and attested, bun run scripts/registry-audit.ts --json in the repository; the rolling-restart proof is ci.yml's deploy-proof job; realtime recovery on one node is measured in scripts/bench/results/ → Realtime. How each release was published, attestations included: PUBLISHING.md. This wiki is the only public documentation surface.

Those facts are repeated on several pages because the wiki is plain markdown with no build step. Change them at the source first, then here: docs/idea/14-roadmap.md owns milestone status, CHANGELOG.md owns the version, scripts/bench/results/ owns the benchmark, and VERIFY_STEP_NAMES in packages/cli/src/verify-step.ts owns the x verify step list.

If you areRead, in order
Evaluating itGetting started → Bare VM → The eight primitives → FAQ
Moving a production app off another stackMigrating an existing app → Known gaps → Entities and migrations
Building an appInstallation → Project layout → Actions → Testing
An agent driving the frameworkx docs "<question>" first, offline from the install → CLI reference → Error codes → MCP and AI → Agents
Operating itConfiguration → Deployment → Observability → Troubleshooting
Deciding whether to trust itKnown gaps → FAQ → Stability → Upgrading
ContributingContributing → Project layout → Testing

Start

PageWhat it covers
Getting startedzero to a running app, one action, one green x verify
Installationprerequisites, x new, typed env, editor and MCP client setup
Bare VMthe four commands a fresh Ubuntu box with bun and git runs, and why no Docker and no service is needed
Project layoutthe generated monorepo, the four surfaces, feature slices, the hard boundaries
Migrating an existing appstrangler fig off Rails/Node/Django, adopting a live schema, identity during cutover, and what does not work yet
Comparedeach stack this gets compared to: when to pick it instead, what you give up here, and the measured figures with the commands that reproduce them
Shapesx new --shape api, blog and dashboard: what each writes and what it leaves out

Tutorials

Follow in order. Each page states what it was executed against in its own first line — tutorial 1 its own measurement. As of 2026-11-03, 2–4 were re-run by hand, whole, in the app tutorial 1 leaves, and 5 with Docker up to the point a real host is needed. scripts/tutorial-run.ts (workflow tutorial-run.yml, on main) runs 1–4 in order and never 5; it has not yet run green. A workaround for a gap fixed since has been removed rather than left to mislead.

PageYou end with
1 · First appa scaffolded app running on x dev, green gate, no Docker
2 · First featureone action projected into five surfaces, with tests
3 · Auth and adminroles, policies, a real login flow, and the admin's detail pages, actions and batches
4 · Jobs and realtimea durable job, a cron task, a live query
5 · Deploy freethe image running on a free PaaS tier, migrations on release
6 · Growing upthe rung you should be on, and the signal to climb

The primitives

PageWhat it covers
The eight primitivesentity, policy, action, mutator, query, job, route, task — the whole vocabulary
Building your own basewrap a primitive in your own factory: tenantEntity, auditedMutator, the two caveats, and why nothing downstream notices
Actionsevery field, the six generated artifacts, the mutator twin, contract tests
Entities and migrationstables, invariants, tenancy, the typed-handle repo, .sealed() columns, x db gen, the schema dump, drift, branch databases
Policies and authzcan(), where a policy is evaluated, denials, tenancy scoping
Queries and live queriesreads, live: true, per-row policy, bounded SQL
Jobs and workflowstransactional outbox, durable steps, idempotency, keyed concurrency, onSettled, operating a queue, webhook(), drivers
Scheduled taskscron with an explicit tz, leader election, next-run introspection
Routes and render modesfive render modes, hydration timing, budgets, enforced SEO

Capabilities

PageWhat it covers
Realtimechannels → live queries → local-first, the pipeline, the reconnect problem
Caching and invalidationfour tiers, one tag graph, one-hop fanout
Batching and preloadingJIT preload, .preload(), insertAll/upsertAll/updateWhere, inBatches, the tenancy guarantee
N+1 detectionthe two codes, expectedQueryLoop, four surfaces, why prod pays nothing
PWA and offlinegenerated sw.js, precache budgets, version skew
Client datathe one browser transport (browserClient, useQuery), the record store, and the gate that refuses a raw fetch(
Client navigationsoft navigation over server-rendered pages: one config line per surface, swap, prefetch, history, focus
MCP and AIthe dev MCP server, every action as a tool, the llm() gateway, evals
Agentsagent() as an action factory, tools as real actions, hive(), agentJob(), and the at-least-once trap
Admin dashboarddefineAdmin() serving list, detail and form per entity with no host code; filters, scopes, sections, related rows, actions with when and batch, the audit log, the jobs dashboard; zero JavaScript; its MCP surface
Scrapingscrape() as a job factory, the driver-blind page vocabulary, robots and host gates, per-run egress, a rented CDP browser, usage, sealed sessions, mid-run prompts
Authsessions, OAuth, MFA, API keys and service tokens — the output is an Actor
Mailone template renders HTML and text, every string a key, sending is a job
Notifynotifier() as a job factory: fan-out, preference gate, digest window, ledger, inbox
Storage and uploadsnamed disks, safe keys, the three-call signed upload, upload scanning, orphans
Feature flagspermanent switches and temporary ones that cannot be forgotten
SEOenforced meta, typed JSON-LD, sitemaps, fail-closed robots, feeds, responsive images

Cross-cutting

PageWhat it covers
I18nflat catalogs, loud misses, locale routing, hreflang
Theming24 semantic colour roles as RGB channels, every token scale, breakpoint and layout mixins, defineTheme(), what contrast is gated
Interface ruleshow a screen must behave, and which of the app's guards/ refuses each rule
UI componentsthe four page composites, and the generated UI component catalog
Timezones and datesstore UTC, format with an explicit IANA zone, frozen clocks in tests
MoneyMoney = { minor, currency }, never a float
Outbound HTTPoutbound(): one vendor call with a whole-call deadline, the caller's signal, safe-only retry, idle and byte bounds, dial: 'public' pinning, and breaker()
Resource managementDisposable db resources, using/await using, idempotent release, compile-time pins
Migrations and backfillsone migration engine and ledger, concurrent index builds and drops outside a transaction, the destructive-migration rail, backfill() as a job factory
Testingsix test types, cloned databases, sealed network, the coverage floor, silent runs, x verify

Reference

PageWhat it covers
CLI referenceevery x command and flag, with --json examples
Error codesevery X_* code: meaning, cause, exact fix
Configurationevery app.config.ts field and every env var
Adaptersevery swappable backend — one runtime.ts field each: the interface, the reference to copy, the conformance suite, the default
Deploymentone image, six roles, ROLE/PORT, drain, compose, Helm, targets, the prebuilt island store, docs/ops/
Deploy recipesper host — Compose, the chart, Fly.io, Render, Railway, Heroku, bare VM — the build source, port, health path, release command and services, each marked executed or not
Observabilitycounters, gauges, histograms, process and pool gauges, MetricExporter, the Prometheus body, /metrics on its own port, and what the chart still cannot reach
Known gapsevery defect and unfinished seam in the published release, named
Upgradingone section per major with every manual edit, the newest first, each as a checklist, version skew — and how x upgrade walks them, one major per run
Stabilitywhat semver covers and what it does not, one major per 90 days from v30, the support window, deprecation, the security exception
Troubleshootingsymptom → cause → fix
FAQwhy Bun only, why no GraphQL, is it production ready
Contributinga pointer: CONTRIBUTING.md is the one contributor guide

The rules everything else follows

AxiomConsequence
One way to do each thingno adapter zoo, no mode: escape hatches. Removing an alternative is a feature
Define once, project everywhereone action → HTTP route + OpenAPI + typed client + job handle + MCP tool + tests
Enforced, not documenteda convention that isn't a build error doesn't exist
Errors are instructionsstable X_* code + cause + exact fix command + --json
One command means shippablex verify green = deployable
The static path never pays for the app pathsite/ cannot import app/; 0kb JS is structural
Deploy anywhere = containers onlyzero platform primitives
Ultimate ships mechanism; your app ships conventionmechanisms and structural conventions ship; business conventions never do. Tenancy ships, an org model does not — primitives are functions returning values, so an app wraps one → Building your own base
Useful, then efficientworking function first, bytes second. A budget is a measurement, not a ceiling to game: raise it by the measured amount, with the reason, rather than cut a feature. The static path still pays nothing for the app path

Source docs in the repo

WhereWhat it is
docs/idea/why — the design spec
docs/architecture/how — the internals
docs/ops/running an app for real: the PaaS → Compose → Kubernetes ladder, secrets, observability, datastore sizing, disaster recovery, runbooks. Recommendations only — the framework depends on none of it
docs/idea/16-app-targets.mdthree targets, one backend, two view layers — design only, not shipped behaviour
docs/idea/17-scale-ladder.mdwhy the app code is identical at rung 0 and rung 4 — shipped, not design only: 24 of its 26 seam rows are marked shipped, rungs 0–2 are real, and the places the invariant breaks today are named
packages/ui/CATALOG.mdthe full component catalog with every prop, generated from source and drift-tested
framework.manifest.jsonevery package, tier, and X_* code with its owner — generated
llms.txtthe machine-readable repo map for agents

Edit this page on GitHubThis page as markdown