Field service, HR, a bike workshop, a CMS, a coffee shop, a support desk — eight demo verticals on one kernel, and four of them run their core domain on the kernel alone. Tenancy, identity, permissions, audit and GDPR come with the foundation instead of with your discipline.
npm create substrat my-appChosen, not accumulated — each one proves a different way of using the platform. The foundation is identical in all eight; the vocabulary, the screens and the shape are not.
Every one of these exists the moment your project does — on the laptop and in production, the same code either way. Nothing here is a checkbox on a pricing page or a module you install.
The list is the argument. Any one of these is a sprint; the identity and audit ones are a quarter and a consultant. They are here because the layer under your app is the same in every business — which is exactly why nobody should be rebuilding it per product.
This is the entire handler. Everything in the right-hand column happened anyway — not because the code asked for it, but because it could not avoid it.
// The vertical's own operation, composing the work-order engine.
const createWorkOrderOp = async (ctx, input) => {
assertAllowed(await ctx.check(WO.create));
const facility = ctx.sql.query(
'SELECT * FROM callout_facilities WHERE id = ?',
[input.facilityId],
)[0];
if (!facility) throw new Error(`facility not found`);
return createWorkOrder(ctx, { // the engine's in-scope
facility: ref('facility', facility.id), // function, inside
customer: ref('customer', facility.customer_id),
kind: input.kind, // YOUR transaction
title: input.title,
});
};The engines in the middle are optional — compose them where your domain matches one, and skip them where it doesn’t.
They own the invariants that are the same in every business: a state machine that can’t skip, an invoice immutable once exported, a booking that can’t double-allocate. Four of the eight demos above need none for their core domain, and three compose none at all — engines are there when your domain matches one, not a tax when it doesn’t. And no engine talks to a sibling: with N engines talking to the kernel there are N contracts to keep compatible; between each other there are N².
None of this depends on the discipline of the code above it — which is the point, because increasingly that code is written by an agent.

The docs answer a question and let you go. The book is the other thing: thirteen chapters, read front to back, on how the pieces actually join. It assumes nothing except that you have written server software before.
EPUB for Apple Books, Kobo and any e-reader · also as one printable page or plain text
The hosted platform — pushes, domains, per-scope databases, the dashboard, the deploy previews — is invite-only while it is onboarded by hand, so that the people running on it are people we can answer. There is no queue number and no launch date attached to this: tell us what you would build and we will tell you honestly whether Substrat is ready for it yet.
The code is not gated.npm create substrat my-app works right now, against SQLite on your laptop, with the same kernel and the same engines the hosted platform runs. An invite is what moves that from your machine to ours.