# aweft > A full-stack toolkit for applications whose state is a document. An observable document is the model, the wire and the storage format at once: assign to it, and the change is a commit that a page renders, a peer receives and a store keeps. Every piece is a package with one job, and a package that does not need another does not know it exists. Every page of https://aweft.dev is also served as markdown at its URL with `.md` on the end; those are the links below. The pages are rendered from the aweft repository at one commit, so what they say is what the npm packages say. ## Home - [aweft](https://aweft.dev/index.md): A full-stack toolkit for applications whose state is a document. An observable document is the model, the wire and the storage format at once: assign to it, and the change is a commit that a page renders, a peer receives and a store keeps. Every piece is a package with one job, and a package that does not need another does not know it exists. ## Guides - [Documentation](https://aweft.dev/docs.md): The guides read in order, then one page per package, per recipe and per component, and the spec. Every page here is also served as markdown at its URL with .md on the end, and /llms.txt lists them all. - [Start](https://aweft.dev/docs/start.md): Install two packages, render a page, boot a server, then put the two in one directory. Each step is a program you can run, and each one is the first half of something the recipes finish. - [The three ideas](https://aweft.dev/docs/three-ideas.md): Everything in the stack sits on three ideas. A reader who holds them can predict what a package does before reading its README, and a reader who does not will find every package surprising in the same way. - [Building with aweft](https://aweft.dev/docs/building.md): The rules an application holds, and the loop for a page. Read start first; this is what comes after the scaffold. - [Translation](https://aweft.dev/docs/translation.md): A page is written once, in one language, and launched in as many as it needs. The build finds every string, an agent or a person fills a catalog per language, and the site writes one tree of pages per language. Nothing in the page changes between one language and three. - [Security](https://aweft.dev/docs/security.md): The stack's security standard is the OWASP Application Security Verification Standard (ASVS), version 5.0, at level 2, the way its components hold to WCAG 2.2 AA. This file says what that claim means, what the stack owns, what an application built on it still owns, and the rules that keep the second list short. - [Deploying](https://aweft.dev/docs/deploying.md): One Node process is the whole deployment: it serves the pages the build wrote and answers the health check a deploy polls. This is how this site is deployed, and it is one shape among several; the stack decides none of it. ## Packages - [Packages](https://aweft.dev/docs/packages.md): Everything from codec to modules runs anywhere, and so does a sandbox compute room. dom, ui, icons and client are the page, and the two page halves of sandbox sit over them; server and jobs are the Node side; auth has a half on each. A package imports only from its own tier or below, never across that line. - [@aweftjs/codec](https://aweft.dev/docs/packages/codec.md): The wire format: values, deltas and commits to bytes, and back. - [@aweftjs/core](https://aweft.dev/docs/packages/core.md): Observables, the deltas they produce, commits, scopes and identity. - [@aweftjs/schema](https://aweft.dev/docs/packages/schema.md): The shape a document keeps, and the answer to whether a commit keeps it. - [@aweftjs/sync](https://aweft.dev/docs/packages/sync.md): Commits between documents over any channel. Both ends of a link run the same code, and the link decides nothing about what it carries. - [@aweftjs/store](https://aweft.dev/docs/packages/store.md): Keeping a document, and keeping it as it changes. - [@aweftjs/modules](https://aweft.dev/docs/packages/modules.md): Modules from a directory, a bundle or a document, loaded in dependency order with their dependencies injected. Tools to load and unload. No opinion about which, when, or for whom. - [@aweftjs/sandbox](https://aweft.dev/docs/packages/sandbox.md): A room for modules the host does not trust: an @aweftjs/modules loader on the far end of an @aweftjs/sync link, fed a module document, props, and a list of granted names. Everything a module inside can reach came through that link, by name. - [@aweftjs/dom](https://aweft.dev/docs/packages/dom.md): The DOM binding: state from @aweftjs/core onto real nodes, with no virtual tree. h makes an element the moment it runs, a slot binds straight to a node, and a list binds straight to the commits its array produces. The same page mounts in a browser, renders to markup with no browser, and takes over that markup in place. - [@aweftjs/ui](https://aweft.dev/docs/packages/ui.md): Components and theming on top of @aweftjs/dom. h is dom's h plus the handful of things that need to know where the element sits: its theme, its state cells, its listeners. A theme is data you define once and match against, not a stylesheet you write. Everything one page owns is one object made per render, so a build can render two pages at the same time and neither can see the other's classes. - [@aweftjs/icons](https://aweft.dev/docs/packages/icons.md): Icon sets as modules. Name an icon in your source and the build puts that one icon in your page; name one when the page runs and a resolver fetches it. This package holds no drawings of its own and never will. - [@aweftjs/client](https://aweft.dev/docs/packages/client.md): One connection to an aweft server, for the life of a page. It makes the socket, attaches the sync link and the request channel before the socket opens, shares documents, asks server modules, and comes back on its own after a drop with the same document objects the page is already holding. - [@aweftjs/server](https://aweft.dev/docs/packages/server.md): Connections and requests behind a gate. A listener you supply hands over web-standard requests and WebSocket handshakes; the server asks the gate who each one is and what it may reach, turns each accepted socket into a sync link plus a call channel, and runs the hooks of the modules the gate allows. It opens nothing, mints nothing, and knows no user. - [@aweftjs/auth](https://aweft.dev/docs/packages/auth.md): The first battery: server modules for who is on a connection. A gate that reads public, sessions as documents in your store, sign-in and sign-up by email and password, and a per-user state document shared on every connection of theirs. @aweftjs/auth/client is the browser half: who the page is, signing in and out, that state document, and two page modules a stage loads by name. - [@aweftjs/health](https://aweft.dev/docs/packages/health.md): The health battery: one server module, health/Check, that answers GET /api/health (and HEAD) with whether the process and its store are up. It is what a deploy script polls to tell a release that came up from one that did not, what a load balancer reads, and what you curl from off the box. - [@aweftjs/static](https://aweft.dev/docs/packages/static.md): The static battery: one server module, static/Files, that answers every HTTP request no route matched with a file from a directory. It makes the process that runs your application the host that serves your generated site, so a deployment is one server rather than two. - [@aweftjs/logs](https://aweft.dev/docs/packages/logs.md): The logs battery: what a page and the server did, per visit, in the application's own store. A crash, a bad state, a regression in one account: the visit that hit it is a document you read back, by hand or with an agent. @aweftjs/logs/client is the browser half that records the page; the readers this package exports are for any process, an agent or a job among them. - [@aweftjs/uploads](https://aweft.dev/docs/packages/uploads.md): The uploads battery: a file from a page or a module, kept as bytes in a directory or an S3-compatible bucket and as a record in the application's own store, served back at /files/. The rules an application varies (which types, how large, what a file must pass before it is kept, who may read one, who may upload) are configuration, not a fork. @aweftjs/uploads/client is the browser half that posts a file with progress; @aweftjs/uploads/s3 is the bucket adapter; the readers this package exports are for any process. - [@aweftjs/notify](https://aweft.dev/docs/packages/notify.md): The notify battery: one send to a person, over the channels its level picks. An inbox per user in the application's own store, shared live on every connection of theirs; email through Resend; push through Firebase Cloud Messaging; what each channel did written into the answer and onto the item, and a channel that fails never losing the message. @aweftjs/notify/client is the browser half: the inbox as a live list, an unread count, marking read, and registering the device. - [@aweftjs/jobs](https://aweft.dev/docs/packages/jobs.md): A scheduler over an array of rows you hand in. Each row says when; you say what runs. It writes one thing back onto a row, last, and decides nothing else: not what a job is, not who may schedule one, not whether the list is stored, and nothing about retries, queues or catching up. - [@aweftjs/ssg](https://aweft.dev/docs/packages/ssg.md): Pages from a routed site, at build time and at run time. It renders every page a site declares, writes each one as a file a static host can serve with no configuration, once per language when the site has more than one, and hands the browser one function that takes the page over in place. - [@aweftjs/build](https://aweft.dev/docs/packages/build.md): The transforms. It compiles markup and JSX to h calls, replaces a static subtree with a template made once and cloned per use, removes assert calls from a release build, and, when asked, finds every string a page shows so it can be looked up in the reader's language. It decides nothing else: not which bundler you use, not whether you write JSX, markup or h by hand, not what a custom h does, and not when source that arrives at run time is compiled. - [@aweftjs/testing](https://aweft.dev/docs/packages/testing.md): The checks the rest of the stack is held to: the conformance suite, a model reading of the format to check real implementations against, the tier rule, and seeded randomness. - [@aweftjs/debug](https://aweft.dev/docs/packages/debug.md): Reads a running document or commit back as text. ## Recipes - [Recipes](https://aweft.dev/docs/recipes.md): Everything in this stack that works, as programs you can run. - [recipes/full-stack](https://aweft.dev/docs/recipes/full-stack.md): A page and a server in one directory, with the seam between them wired the way development needs. - [recipes/full-stack/backend/main.ts](https://aweft.dev/docs/recipes/full-stack/files/backend/main.ts.md): One file of recipes/full-stack, at commit 9a5bb24. - [recipes/full-stack/backend/modules/board/Board.ts](https://aweft.dev/docs/recipes/full-stack/files/backend/modules/board/Board.ts.md): One file of recipes/full-stack, at commit 9a5bb24. - [recipes/full-stack/backend/modules/board/Mine.ts](https://aweft.dev/docs/recipes/full-stack/files/backend/modules/board/Mine.ts.md): One file of recipes/full-stack, at commit 9a5bb24. - [recipes/full-stack/backend/modules/board/Notice.ts](https://aweft.dev/docs/recipes/full-stack/files/backend/modules/board/Notice.ts.md): One file of recipes/full-stack, at commit 9a5bb24. - [recipes/full-stack/main.ts](https://aweft.dev/docs/recipes/full-stack/files/main.ts.md): One file of recipes/full-stack, at commit 9a5bb24. - [recipes/full-stack/page/entry.tsx](https://aweft.dev/docs/recipes/full-stack/files/page/entry.tsx.md): One file of recipes/full-stack, at commit 9a5bb24. - [recipes/full-stack/page/index.html](https://aweft.dev/docs/recipes/full-stack/files/page/index.html.md): One file of recipes/full-stack, at commit 9a5bb24. - [recipes/full-stack/page/text/source.json](https://aweft.dev/docs/recipes/full-stack/files/page/text/source.json.md): One file of recipes/full-stack, at commit 9a5bb24. - [recipes/full-stack/page/vite.config.ts](https://aweft.dev/docs/recipes/full-stack/files/page/vite.config.ts.md): One file of recipes/full-stack, at commit 9a5bb24. - [recipes/full-stack/tests/board.test.ts](https://aweft.dev/docs/recipes/full-stack/files/tests/board.test.ts.md): One file of recipes/full-stack, at commit 9a5bb24. - [recipes/full-stack/tests/security.test.ts](https://aweft.dev/docs/recipes/full-stack/files/tests/security.test.ts.md): One file of recipes/full-stack, at commit 9a5bb24. - [recipes/todo-list](https://aweft.dev/docs/recipes/todo-list.md): A list you add to, toggle, filter and reorder, with the list following each edit rather than being rebuilt. - [recipes/todo-list/main.ts](https://aweft.dev/docs/recipes/todo-list/files/main.ts.md): One file of recipes/todo-list, at commit 9a5bb24. - [recipes/two-clients](https://aweft.dev/docs/recipes/two-clients.md): Two people editing one document at once, including what happens when they write the same slot and who yields. - [recipes/two-clients/main.ts](https://aweft.dev/docs/recipes/two-clients/files/main.ts.md): One file of recipes/two-clients, at commit 9a5bb24. - [recipes/optimistic-write](https://aweft.dev/docs/recipes/optimistic-write.md): A write that applies locally before the server sees it, is refused, and is rolled back. - [recipes/optimistic-write/main.ts](https://aweft.dev/docs/recipes/optimistic-write/files/main.ts.md): One file of recipes/optimistic-write, at commit 9a5bb24. - [recipes/debug](https://aweft.dev/docs/recipes/debug.md): Finding a bug in a document you did not write. - [recipes/debug/main.ts](https://aweft.dev/docs/recipes/debug/files/main.ts.md): One file of recipes/debug, at commit 9a5bb24. - [recipes/ui](https://aweft.dev/docs/recipes/ui.md): Three pages. - [recipes/ui/browser.d.ts](https://aweft.dev/docs/recipes/ui/files/browser.d.ts.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/catalogue-entry.tsx](https://aweft.dev/docs/recipes/ui/files/catalogue-entry.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/catalogue.html](https://aweft.dev/docs/recipes/ui/files/catalogue.html.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/catalogue.tsx](https://aweft.dev/docs/recipes/ui/files/catalogue.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/entry.tsx](https://aweft.dev/docs/recipes/ui/files/entry.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/example.ts](https://aweft.dev/docs/recipes/ui/files/example.ts.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/alert.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/alert.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/avatar.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/avatar.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/badge.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/badge.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/breadcrumb.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/breadcrumb.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/button.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/button.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/card.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/card.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/checkbox.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/checkbox.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/color-picker.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/color-picker.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/country.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/country.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/drop-down.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/drop-down.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/empty.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/empty.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/field.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/field.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/file-drop.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/file-drop.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/icon.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/icon.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/loading-dots.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/loading-dots.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/markdown.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/markdown.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/menu.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/menu.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/modal.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/modal.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/pagination.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/pagination.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/popup.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/popup.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/progress.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/progress.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/radio.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/radio.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/region.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/region.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/select.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/select.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/skeleton.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/skeleton.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/slider.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/slider.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/table.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/table.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/tabs.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/tabs.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/text-area.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/text-area.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/text-field.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/text-field.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/toggle.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/toggle.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/tooltip.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/tooltip.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/typography.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/typography.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/examples/validate.example.tsx](https://aweft.dev/docs/recipes/ui/files/examples/validate.example.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/index.html](https://aweft.dev/docs/recipes/ui/files/index.html.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/main.ts](https://aweft.dev/docs/recipes/ui/files/main.ts.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/page.tsx](https://aweft.dev/docs/recipes/ui/files/page.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/preview-entry.tsx](https://aweft.dev/docs/recipes/ui/files/preview-entry.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/preview.html](https://aweft.dev/docs/recipes/ui/files/preview.html.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/preview.tsx](https://aweft.dev/docs/recipes/ui/files/preview.tsx.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/ui/vite.config.ts](https://aweft.dev/docs/recipes/ui/files/vite.config.ts.md): One file of recipes/ui, at commit 9a5bb24. - [recipes/icons](https://aweft.dev/docs/recipes/icons.md): One page, three ways of naming an icon, and the bundle weighed after. - [recipes/icons/entry.tsx](https://aweft.dev/docs/recipes/icons/files/entry.tsx.md): One file of recipes/icons, at commit 9a5bb24. - [recipes/icons/index.html](https://aweft.dev/docs/recipes/icons/files/index.html.md): One file of recipes/icons, at commit 9a5bb24. - [recipes/icons/main.ts](https://aweft.dev/docs/recipes/icons/files/main.ts.md): One file of recipes/icons, at commit 9a5bb24. - [recipes/icons/page.tsx](https://aweft.dev/docs/recipes/icons/files/page.tsx.md): One file of recipes/icons, at commit 9a5bb24. - [recipes/icons/vite.config.ts](https://aweft.dev/docs/recipes/icons/files/vite.config.ts.md): One file of recipes/icons, at commit 9a5bb24. - [recipes/routed-site](https://aweft.dev/docs/recipes/routed-site.md): A small site with real URLs: nested pages, a page with a parameter, a page that arrives later, a dialog the back button dismisses, and a title per page. - [recipes/routed-site/entry.tsx](https://aweft.dev/docs/recipes/routed-site/files/entry.tsx.md): One file of recipes/routed-site, at commit 9a5bb24. - [recipes/routed-site/index.html](https://aweft.dev/docs/recipes/routed-site/files/index.html.md): One file of recipes/routed-site, at commit 9a5bb24. - [recipes/routed-site/main.ts](https://aweft.dev/docs/recipes/routed-site/files/main.ts.md): One file of recipes/routed-site, at commit 9a5bb24. - [recipes/routed-site/modules/About.tsx](https://aweft.dev/docs/recipes/routed-site/files/modules/About.tsx.md): One file of recipes/routed-site, at commit 9a5bb24. - [recipes/routed-site/site.tsx](https://aweft.dev/docs/recipes/routed-site/files/site.tsx.md): One file of recipes/routed-site, at commit 9a5bb24. - [recipes/routed-site/vite.config.ts](https://aweft.dev/docs/recipes/routed-site/files/vite.config.ts.md): One file of recipes/routed-site, at commit 9a5bb24. - [recipes/ssg](https://aweft.dev/docs/recipes/ssg.md): A routed site written out as files, served by anything that can serve a directory, and taken over in place when the reader's browser gets to it. - [recipes/ssg/banner.tsx](https://aweft.dev/docs/recipes/ssg/files/banner.tsx.md): One file of recipes/ssg, at commit 9a5bb24. - [recipes/ssg/browser.d.ts](https://aweft.dev/docs/recipes/ssg/files/browser.d.ts.md): One file of recipes/ssg, at commit 9a5bb24. - [recipes/ssg/entry.tsx](https://aweft.dev/docs/recipes/ssg/files/entry.tsx.md): One file of recipes/ssg, at commit 9a5bb24. - [recipes/ssg/index.html](https://aweft.dev/docs/recipes/ssg/files/index.html.md): One file of recipes/ssg, at commit 9a5bb24. - [recipes/ssg/main.ts](https://aweft.dev/docs/recipes/ssg/files/main.ts.md): One file of recipes/ssg, at commit 9a5bb24. - [recipes/ssg/page.tsx](https://aweft.dev/docs/recipes/ssg/files/page.tsx.md): One file of recipes/ssg, at commit 9a5bb24. - [recipes/ssg/vite.config.ts](https://aweft.dev/docs/recipes/ssg/files/vite.config.ts.md): One file of recipes/ssg, at commit 9a5bb24. - [recipes/translated-site](https://aweft.dev/docs/recipes/translated-site.md): A site written in one language and launched in three. - [recipes/translated-site/browser.d.ts](https://aweft.dev/docs/recipes/translated-site/files/browser.d.ts.md): One file of recipes/translated-site, at commit 9a5bb24. - [recipes/translated-site/entry.tsx](https://aweft.dev/docs/recipes/translated-site/files/entry.tsx.md): One file of recipes/translated-site, at commit 9a5bb24. - [recipes/translated-site/index.html](https://aweft.dev/docs/recipes/translated-site/files/index.html.md): One file of recipes/translated-site, at commit 9a5bb24. - [recipes/translated-site/main.ts](https://aweft.dev/docs/recipes/translated-site/files/main.ts.md): One file of recipes/translated-site, at commit 9a5bb24. - [recipes/translated-site/site.tsx](https://aweft.dev/docs/recipes/translated-site/files/site.tsx.md): One file of recipes/translated-site, at commit 9a5bb24. - [recipes/translated-site/stored.ts](https://aweft.dev/docs/recipes/translated-site/files/stored.ts.md): One file of recipes/translated-site, at commit 9a5bb24. - [recipes/translated-site/text/fr.json](https://aweft.dev/docs/recipes/translated-site/files/text/fr.json.md): One file of recipes/translated-site, at commit 9a5bb24. - [recipes/translated-site/text/source.json](https://aweft.dev/docs/recipes/translated-site/files/text/source.json.md): One file of recipes/translated-site, at commit 9a5bb24. - [recipes/translated-site/text/uk.json](https://aweft.dev/docs/recipes/translated-site/files/text/uk.json.md): One file of recipes/translated-site, at commit 9a5bb24. - [recipes/translated-site/vite.config.ts](https://aweft.dev/docs/recipes/translated-site/files/vite.config.ts.md): One file of recipes/translated-site, at commit 9a5bb24. - [recipes/static](https://aweft.dev/docs/recipes/static.md): The site from recipes/ssg, built, written out, and then served by the stack's own server in the same process. One program is the whole deployment: no second server in front of the first, and no host configuration anywhere. - [recipes/static/browser.d.ts](https://aweft.dev/docs/recipes/static/files/browser.d.ts.md): One file of recipes/static, at commit 9a5bb24. - [recipes/static/main.ts](https://aweft.dev/docs/recipes/static/files/main.ts.md): One file of recipes/static, at commit 9a5bb24. - [recipes/static/modules/static/Files.ts](https://aweft.dev/docs/recipes/static/files/modules/static/Files.ts.md): One file of recipes/static, at commit 9a5bb24. - [recipes/health](https://aweft.dev/docs/recipes/health.md): A deploy's verification against the stack's own health endpoint. A release built from new is shipped, and the script that shipped it polls /api/health until the build answering is the one it shipped, with no cookie, through the auth gate. - [recipes/health/main.ts](https://aweft.dev/docs/recipes/health/files/main.ts.md): One file of recipes/health, at commit 9a5bb24. - [recipes/health/modules/health/Check.ts](https://aweft.dev/docs/recipes/health/files/modules/health/Check.ts.md): One file of recipes/health, at commit 9a5bb24. - [recipes/logs](https://aweft.dev/docs/recipes/logs.md): A page recorded end to end in a browser and the visit read back: an error, a rejection, a console line, a failed call on both sides, a commit's shape with a private slot absent, a typed character never stored, sign-in mid-visit. - [recipes/logs/backend/main.ts](https://aweft.dev/docs/recipes/logs/files/backend/main.ts.md): One file of recipes/logs, at commit 9a5bb24. - [recipes/logs/backend/modules/board/Board.ts](https://aweft.dev/docs/recipes/logs/files/backend/modules/board/Board.ts.md): One file of recipes/logs, at commit 9a5bb24. - [recipes/logs/backend/modules/board/Boom.ts](https://aweft.dev/docs/recipes/logs/files/backend/modules/board/Boom.ts.md): One file of recipes/logs, at commit 9a5bb24. - [recipes/logs/main.ts](https://aweft.dev/docs/recipes/logs/files/main.ts.md): One file of recipes/logs, at commit 9a5bb24. - [recipes/logs/page/entry.tsx](https://aweft.dev/docs/recipes/logs/files/page/entry.tsx.md): One file of recipes/logs, at commit 9a5bb24. - [recipes/logs/page/index.html](https://aweft.dev/docs/recipes/logs/files/page/index.html.md): One file of recipes/logs, at commit 9a5bb24. - [recipes/logs/page/vite.config.ts](https://aweft.dev/docs/recipes/logs/files/page/vite.config.ts.md): One file of recipes/logs, at commit 9a5bb24. - [recipes/uploads](https://aweft.dev/docs/recipes/uploads.md): A page uploads pictures under the gate and they paint from /files/; each refusal reaches the page with its reason, a module makes a file of its own, and the static battery behind it never sees a file. - [recipes/uploads/backend/main.ts](https://aweft.dev/docs/recipes/uploads/files/backend/main.ts.md): One file of recipes/uploads, at commit 9a5bb24. - [recipes/uploads/backend/modules/gallery/Export.ts](https://aweft.dev/docs/recipes/uploads/files/backend/modules/gallery/Export.ts.md): One file of recipes/uploads, at commit 9a5bb24. - [recipes/uploads/backend/modules/static/Files.ts](https://aweft.dev/docs/recipes/uploads/files/backend/modules/static/Files.ts.md): One file of recipes/uploads, at commit 9a5bb24. - [recipes/uploads/backend/modules/uploads/Files.ts](https://aweft.dev/docs/recipes/uploads/files/backend/modules/uploads/Files.ts.md): One file of recipes/uploads, at commit 9a5bb24. - [recipes/uploads/main.ts](https://aweft.dev/docs/recipes/uploads/files/main.ts.md): One file of recipes/uploads, at commit 9a5bb24. - [recipes/uploads/page/entry.tsx](https://aweft.dev/docs/recipes/uploads/files/page/entry.tsx.md): One file of recipes/uploads, at commit 9a5bb24. - [recipes/uploads/page/index.html](https://aweft.dev/docs/recipes/uploads/files/page/index.html.md): One file of recipes/uploads, at commit 9a5bb24. - [recipes/uploads/page/vite.config.ts](https://aweft.dev/docs/recipes/uploads/files/page/vite.config.ts.md): One file of recipes/uploads, at commit 9a5bb24. - [recipes/notify](https://aweft.dev/docs/recipes/notify.md): Two pages of one user hear a send live and mark it read for each other, a device registered from the page, email and push against two fakes, a failed mail kept, a forged write refused, a restart, and a server with no store sending a contact form's mail. - [recipes/notify/backend/main.ts](https://aweft.dev/docs/recipes/notify/files/backend/main.ts.md): One file of recipes/notify, at commit 9a5bb24. - [recipes/notify/backend/modules/notify/Send.ts](https://aweft.dev/docs/recipes/notify/files/backend/modules/notify/Send.ts.md): One file of recipes/notify, at commit 9a5bb24. - [recipes/notify/backend/modules/orders/Ship.ts](https://aweft.dev/docs/recipes/notify/files/backend/modules/orders/Ship.ts.md): One file of recipes/notify, at commit 9a5bb24. - [recipes/notify/main.ts](https://aweft.dev/docs/recipes/notify/files/main.ts.md): One file of recipes/notify, at commit 9a5bb24. - [recipes/notify/page/entry.tsx](https://aweft.dev/docs/recipes/notify/files/page/entry.tsx.md): One file of recipes/notify, at commit 9a5bb24. - [recipes/notify/page/index.html](https://aweft.dev/docs/recipes/notify/files/page/index.html.md): One file of recipes/notify, at commit 9a5bb24. - [recipes/notify/page/vite.config.ts](https://aweft.dev/docs/recipes/notify/files/page/vite.config.ts.md): One file of recipes/notify, at commit 9a5bb24. - [recipes/room](https://aweft.dev/docs/recipes/room.md): An act module stored on the server, run in a frame on the page: the board it shares reaches the server, its ask carries the page's identity, its own stage navigates on the page's URL under the host act, an error inside reaches the page's logs, and the frame paints but cannot fetch. - [recipes/room/backend/acts/app/Main.jsx](https://aweft.dev/docs/recipes/room/files/backend/acts/app/Main.jsx.md): One file of recipes/room, at commit 9a5bb24. - [recipes/room/backend/main.ts](https://aweft.dev/docs/recipes/room/files/backend/main.ts.md): One file of recipes/room, at commit 9a5bb24. - [recipes/room/backend/modules/app/Rooms.ts](https://aweft.dev/docs/recipes/room/files/backend/modules/app/Rooms.ts.md): One file of recipes/room, at commit 9a5bb24. - [recipes/room/main.ts](https://aweft.dev/docs/recipes/room/files/main.ts.md): One file of recipes/room, at commit 9a5bb24. - [recipes/room/page/entry.tsx](https://aweft.dev/docs/recipes/room/files/page/entry.tsx.md): One file of recipes/room, at commit 9a5bb24. - [recipes/room/page/index.html](https://aweft.dev/docs/recipes/room/files/page/index.html.md): One file of recipes/room, at commit 9a5bb24. - [recipes/room/page/names/core.ts](https://aweft.dev/docs/recipes/room/files/page/names/core.ts.md): One file of recipes/room, at commit 9a5bb24. - [recipes/room/page/names/ui.ts](https://aweft.dev/docs/recipes/room/files/page/names/ui.ts.md): One file of recipes/room, at commit 9a5bb24. - [recipes/room/page/room.config.ts](https://aweft.dev/docs/recipes/room/files/page/room.config.ts.md): One file of recipes/room, at commit 9a5bb24. - [recipes/room/page/room.tsx](https://aweft.dev/docs/recipes/room/files/page/room.tsx.md): One file of recipes/room, at commit 9a5bb24. - [recipes/room/page/vite.config.ts](https://aweft.dev/docs/recipes/room/files/page/vite.config.ts.md): One file of recipes/room, at commit 9a5bb24. - [recipes/documents-on-postgres](https://aweft.dev/docs/recipes/documents-on-postgres.md): Documents kept in Postgres: a writer killed mid-edit, eight processes opening one name at once, and a path declared after the data was there. - [recipes/documents-on-postgres/main.ts](https://aweft.dev/docs/recipes/documents-on-postgres/files/main.ts.md): One file of recipes/documents-on-postgres, at commit 9a5bb24. - [recipes/posts-to-pages](https://aweft.dev/docs/recipes/posts-to-pages.md): A small publication whose pages are written while it is running. Someone publishes a post over a socket, the module that takes it puts the row in the store and writes that one page, and the page is live before the call has answered. - [recipes/posts-to-pages/entry.tsx](https://aweft.dev/docs/recipes/posts-to-pages/files/entry.tsx.md): One file of recipes/posts-to-pages, at commit 9a5bb24. - [recipes/posts-to-pages/index.html](https://aweft.dev/docs/recipes/posts-to-pages/files/index.html.md): One file of recipes/posts-to-pages, at commit 9a5bb24. - [recipes/posts-to-pages/main.ts](https://aweft.dev/docs/recipes/posts-to-pages/files/main.ts.md): One file of recipes/posts-to-pages, at commit 9a5bb24. - [recipes/posts-to-pages/site.tsx](https://aweft.dev/docs/recipes/posts-to-pages/files/site.tsx.md): One file of recipes/posts-to-pages, at commit 9a5bb24. - [recipes/posts-to-pages/vite.config.ts](https://aweft.dev/docs/recipes/posts-to-pages/files/vite.config.ts.md): One file of recipes/posts-to-pages, at commit 9a5bb24. - [recipes/accessible-page](https://aweft.dev/docs/recipes/accessible-page.md): A page everyone can use, and the three places the stack says so. - [recipes/accessible-page/entry.tsx](https://aweft.dev/docs/recipes/accessible-page/files/entry.tsx.md): One file of recipes/accessible-page, at commit 9a5bb24. - [recipes/accessible-page/faults/nameless-button.html](https://aweft.dev/docs/recipes/accessible-page/files/faults/nameless-button.html.md): One file of recipes/accessible-page, at commit 9a5bb24. - [recipes/accessible-page/faults/nameless-button.tsx](https://aweft.dev/docs/recipes/accessible-page/files/faults/nameless-button.tsx.md): One file of recipes/accessible-page, at commit 9a5bb24. - [recipes/accessible-page/faults/no-language.html](https://aweft.dev/docs/recipes/accessible-page/files/faults/no-language.html.md): One file of recipes/accessible-page, at commit 9a5bb24. - [recipes/accessible-page/faults/no-language.tsx](https://aweft.dev/docs/recipes/accessible-page/files/faults/no-language.tsx.md): One file of recipes/accessible-page, at commit 9a5bb24. - [recipes/accessible-page/faults/unreadable.html](https://aweft.dev/docs/recipes/accessible-page/files/faults/unreadable.html.md): One file of recipes/accessible-page, at commit 9a5bb24. - [recipes/accessible-page/faults/unreadable.tsx](https://aweft.dev/docs/recipes/accessible-page/files/faults/unreadable.tsx.md): One file of recipes/accessible-page, at commit 9a5bb24. - [recipes/accessible-page/index.html](https://aweft.dev/docs/recipes/accessible-page/files/index.html.md): One file of recipes/accessible-page, at commit 9a5bb24. - [recipes/accessible-page/main.ts](https://aweft.dev/docs/recipes/accessible-page/files/main.ts.md): One file of recipes/accessible-page, at commit 9a5bb24. - [recipes/accessible-page/page.tsx](https://aweft.dev/docs/recipes/accessible-page/files/page.tsx.md): One file of recipes/accessible-page, at commit 9a5bb24. - [recipes/accessible-page/vite.config.ts](https://aweft.dev/docs/recipes/accessible-page/files/vite.config.ts.md): One file of recipes/accessible-page, at commit 9a5bb24. - [recipes/backend](https://aweft.dev/docs/recipes/backend.md): The boot pattern to copy: a twelve-line boot file and a folder of modules, one holding a document, one the rules, one a scheduler, one the gate, and one configuring a battery module. - [recipes/backend/checks.ts](https://aweft.dev/docs/recipes/backend/files/checks.ts.md): One file of recipes/backend, at commit 9a5bb24. - [recipes/backend/main.ts](https://aweft.dev/docs/recipes/backend/files/main.ts.md): One file of recipes/backend, at commit 9a5bb24. - [recipes/backend/modules/app/Board.ts](https://aweft.dev/docs/recipes/backend/files/modules/app/Board.ts.md): One file of recipes/backend, at commit 9a5bb24. - [recipes/backend/modules/app/Digest.ts](https://aweft.dev/docs/recipes/backend/files/modules/app/Digest.ts.md): One file of recipes/backend, at commit 9a5bb24. - [recipes/backend/modules/app/Gate.ts](https://aweft.dev/docs/recipes/backend/files/modules/app/Gate.ts.md): One file of recipes/backend, at commit 9a5bb24. - [recipes/backend/modules/app/Log.ts](https://aweft.dev/docs/recipes/backend/files/modules/app/Log.ts.md): One file of recipes/backend, at commit 9a5bb24. - [recipes/backend/modules/app/Rules.ts](https://aweft.dev/docs/recipes/backend/files/modules/app/Rules.ts.md): One file of recipes/backend, at commit 9a5bb24. - [recipes/backend/modules/app/Wipe.ts](https://aweft.dev/docs/recipes/backend/files/modules/app/Wipe.ts.md): One file of recipes/backend, at commit 9a5bb24. - [recipes/backend/modules/auth/Session.ts](https://aweft.dev/docs/recipes/backend/files/modules/auth/Session.ts.md): One file of recipes/backend, at commit 9a5bb24. - [recipes/codec](https://aweft.dev/docs/recipes/codec.md): A validator for a stored commit log, built on the encoding package alone. - [recipes/codec/main.ts](https://aweft.dev/docs/recipes/codec/files/main.ts.md): One file of recipes/codec, at commit 9a5bb24. - [recipes/core](https://aweft.dev/docs/recipes/core.md): A headless issue tracker, built on core, that checks itself. - [recipes/core/main.ts](https://aweft.dev/docs/recipes/core/files/main.ts.md): One file of recipes/core, at commit 9a5bb24. - [recipes/schema](https://aweft.dev/docs/recipes/schema.md): A task board that two nodes share, and neither of them will hold wrongly. - [recipes/schema/main.ts](https://aweft.dev/docs/recipes/schema/files/main.ts.md): One file of recipes/schema, at commit 9a5bb24. - [recipes/sync](https://aweft.dev/docs/recipes/sync.md): A shared task board, over four different channels, with the same code on top of each. - [recipes/sync/main.ts](https://aweft.dev/docs/recipes/sync/files/main.ts.md): One file of recipes/sync, at commit 9a5bb24. - [recipes/sync/worker.ts](https://aweft.dev/docs/recipes/sync/files/worker.ts.md): One file of recipes/sync, at commit 9a5bb24. - [recipes/store](https://aweft.dev/docs/recipes/store.md): A document that outlives the process that wrote it, and a name two openers cannot both take. - [recipes/store/driver-file.ts](https://aweft.dev/docs/recipes/store/files/driver-file.ts.md): One file of recipes/store, at commit 9a5bb24. - [recipes/store/main.ts](https://aweft.dev/docs/recipes/store/files/main.ts.md): One file of recipes/store, at commit 9a5bb24. - [recipes/modules](https://aweft.dev/docs/recipes/modules.md): An application assembled from three places, then extended while it runs by an operator who writes modules into a document that a second node receives over a link. - [recipes/modules/app/clock/Tick.ts](https://aweft.dev/docs/recipes/modules/files/app/clock/Tick.ts.md): One file of recipes/modules, at commit 9a5bb24. - [recipes/modules/app/greet/Format.ts](https://aweft.dev/docs/recipes/modules/files/app/greet/Format.ts.md): One file of recipes/modules, at commit 9a5bb24. - [recipes/modules/app/greet/Say.ts](https://aweft.dev/docs/recipes/modules/files/app/greet/Say.ts.md): One file of recipes/modules, at commit 9a5bb24. - [recipes/modules/app/lib/Log.ts](https://aweft.dev/docs/recipes/modules/files/app/lib/Log.ts.md): One file of recipes/modules, at commit 9a5bb24. - [recipes/modules/main.ts](https://aweft.dev/docs/recipes/modules/files/main.ts.md): One file of recipes/modules, at commit 9a5bb24. - [recipes/sandbox](https://aweft.dev/docs/recipes/sandbox.md) - [recipes/sandbox/main.ts](https://aweft.dev/docs/recipes/sandbox/files/main.ts.md): One file of recipes/sandbox, at commit 9a5bb24. - [recipes/server](https://aweft.dev/docs/recipes/server.md): The proof for @aweftjs/server and @aweftjs/auth: a full-stack notes app, over a real port. - [recipes/server/main.ts](https://aweft.dev/docs/recipes/server/files/main.ts.md): One file of recipes/server, at commit 9a5bb24. - [recipes/jobs](https://aweft.dev/docs/recipes/jobs.md): A content site's backend, dry-run by its operator: a nightly digest, an hourly cleanup, a reminder that was due before the process started, and a report an agent wrote as a module that runs in a sandbox. The schedule is a document in the store, so it survives the process; what the jobs do lands in a second document. The operator drives the clock, which is how you find out what a schedule will do next week without waiting for next week. - [recipes/jobs/main.ts](https://aweft.dev/docs/recipes/jobs/files/main.ts.md): One file of recipes/jobs, at commit 9a5bb24. - [recipes/dom](https://aweft.dev/docs/recipes/dom.md): A todo page, built on dom, that checks what it did to the tree. - [recipes/dom/main.ts](https://aweft.dev/docs/recipes/dom/files/main.ts.md): One file of recipes/dom, at commit 9a5bb24. - [recipes/build](https://aweft.dev/docs/recipes/build.md): A page that goes through the transforms, and then does its job. - [recipes/build/main.ts](https://aweft.dev/docs/recipes/build/files/main.ts.md): One file of recipes/build, at commit 9a5bb24. - [recipes/client](https://aweft.dev/docs/recipes/client.md): The proof for @aweftjs/client and the auth battery's client half: a small application. - [recipes/client/app.tsx](https://aweft.dev/docs/recipes/client/files/app.tsx.md): One file of recipes/client, at commit 9a5bb24. - [recipes/client/entry.tsx](https://aweft.dev/docs/recipes/client/files/entry.tsx.md): One file of recipes/client, at commit 9a5bb24. - [recipes/client/index.html](https://aweft.dev/docs/recipes/client/files/index.html.md): One file of recipes/client, at commit 9a5bb24. - [recipes/client/main.ts](https://aweft.dev/docs/recipes/client/files/main.ts.md): One file of recipes/client, at commit 9a5bb24. - [recipes/client/modules/Current.ts](https://aweft.dev/docs/recipes/client/files/modules/Current.ts.md): One file of recipes/client, at commit 9a5bb24. - [recipes/client/modules/Gate.ts](https://aweft.dev/docs/recipes/client/files/modules/Gate.ts.md): One file of recipes/client, at commit 9a5bb24. - [recipes/client/modules/Home.tsx](https://aweft.dev/docs/recipes/client/files/modules/Home.tsx.md): One file of recipes/client, at commit 9a5bb24. - [recipes/client/modules/Page.tsx](https://aweft.dev/docs/recipes/client/files/modules/Page.tsx.md): One file of recipes/client, at commit 9a5bb24. - [recipes/client/trace.ts](https://aweft.dev/docs/recipes/client/files/trace.ts.md): One file of recipes/client, at commit 9a5bb24. - [recipes/client/vite.config.ts](https://aweft.dev/docs/recipes/client/files/vite.config.ts.md): One file of recipes/client, at commit 9a5bb24. ## Components - [Components](https://aweft.dev/components.md): Every component @aweftjs/ui ships, one page each: the catalogue's example in light and dark, every state and size, and the example's source. The rules every one of them follows are on the @aweftjs/ui page. - [Alert](https://aweft.dev/components/Alert.md): From the Display section of @aweftjs/ui. - [Avatar](https://aweft.dev/components/Avatar.md): From the Display section of @aweftjs/ui. - [Badge](https://aweft.dev/components/Badge.md): From the Display section of @aweftjs/ui. - [Breadcrumb](https://aweft.dev/components/Breadcrumb.md): From the Navigation and data section of @aweftjs/ui. - [Button](https://aweft.dev/components/Button.md): From the Controls section of @aweftjs/ui. - [Card](https://aweft.dev/components/Card.md): From the Grouping section of @aweftjs/ui. - [Checkbox](https://aweft.dev/components/Checkbox.md): From the Controls section of @aweftjs/ui. - [ColorPicker](https://aweft.dev/components/ColorPicker.md): From the Composites section of @aweftjs/ui. - [Country](https://aweft.dev/components/Country.md): From the Composites section of @aweftjs/ui. - [DropDown](https://aweft.dev/components/DropDown.md): From the Composites section of @aweftjs/ui. - [Empty](https://aweft.dev/components/Empty.md): From the Display section of @aweftjs/ui. - [FileDrop](https://aweft.dev/components/FileDrop.md): From the Composites section of @aweftjs/ui. - [Form](https://aweft.dev/components/Form.md): The ui README has no table row for Form; the example below is its whole description here. - [Icon](https://aweft.dev/components/Icon.md): From the Controls section of @aweftjs/ui. - [LoadingDots](https://aweft.dev/components/LoadingDots.md): From the Controls section of @aweftjs/ui. - [Markdown](https://aweft.dev/components/Markdown.md): From the Markdown section of @aweftjs/ui. - [Menu](https://aweft.dev/components/Menu.md): From the Composites section of @aweftjs/ui. - [Modal](https://aweft.dev/components/Modal.md): From the Composites section of @aweftjs/ui. - [Pagination](https://aweft.dev/components/Pagination.md): From the Navigation and data section of @aweftjs/ui. - [Popup](https://aweft.dev/components/Popup.md): The ui README has no table row for Popup; the example below is its whole description here. - [Progress](https://aweft.dev/components/Progress.md): From the Display section of @aweftjs/ui. - [Radio](https://aweft.dev/components/Radio.md): From the Controls section of @aweftjs/ui. - [Region](https://aweft.dev/components/Region.md): From the Composites section of @aweftjs/ui. - [Select](https://aweft.dev/components/Select.md): From the Controls section of @aweftjs/ui. - [Skeleton](https://aweft.dev/components/Skeleton.md): From the Display section of @aweftjs/ui. - [Slider](https://aweft.dev/components/Slider.md): From the Controls section of @aweftjs/ui. - [Table](https://aweft.dev/components/Table.md): From the Navigation and data section of @aweftjs/ui. - [Tabs](https://aweft.dev/components/Tabs.md): From the Navigation and data section of @aweftjs/ui. - [TextArea](https://aweft.dev/components/TextArea.md): From the Controls section of @aweftjs/ui. - [TextField](https://aweft.dev/components/TextField.md): From the Controls section of @aweftjs/ui. - [Toggle](https://aweft.dev/components/Toggle.md): From the Controls section of @aweftjs/ui. - [Tooltip](https://aweft.dev/components/Tooltip.md): From the Composites section of @aweftjs/ui. - [Typography](https://aweft.dev/components/Typography.md): From the Text section of @aweftjs/ui. - [Validate](https://aweft.dev/components/Validate.md): From the Composites section of @aweftjs/ui. ## The spec - [The spec](https://aweft.dev/spec.md): What a second implementation in another language would be held to: the state format, the id scheme, the replication protocol, and the changelog of every normative change. The conformance fixtures are in spec/fixtures. - [aweft state format, v0](https://aweft.dev/spec/format.md): Status: draft. Normative, and not yet frozen. - [aweft identity, v0](https://aweft.dev/spec/identity.md): Status: draft. Normative for the parts marked so; the encoding is open. - [aweft replication protocol, v1](https://aweft.dev/spec/replication.md): Status: not frozen. No deployed implementation depends on it yet. Changes go in spec/CHANGELOG.md. v1 replaces v0 whole: v0 had a host and a client, and this protocol has two equal ends (design 053). - [Format changelog](https://aweft.dev/spec/changelog.md): Append-only. Every change to a normative statement or a fixture gets an entry.