Pegboard documentation
The working manual.
Start your own installation, keep it running and follow what’s being built.
Get startedStart here
Operate & develop
Product & design
Product contract
The destination contract, clause statuses and required acceptance journeys.
Read the guideAcceptance journeys
The public-door journeys required to prove each product clause.
Read the guideTwo homepages: adopting the Lobby and the run site
Every seed has two versions of its homepage (owner, 12 October 2026):
Read the guideTechnical reference
Working on Pegboard
When asked to launch, run or review the app, run rer dev from the checkout root and nothing else.
Read the guideCLAUDE
@AGENTS.md
Read the guidePegboard demo
rer demo opens a fresh, signed-in Pegboard Demo at /app, past first-run setup.
Read the guideFonts
Outfit is self-hosted under the SIL Open Font License 1.1 in outfit/LICENSE.txt.
Read the guideHydration units
Something in a visitor's browser can change a page before React hydrates it: an extension that turns email addresses into links, a translator, Cloudflare's email address obfuscation.
Read the guideHeadless family core
Add domain source only when every edition needs it.
Read the guideAI client
ai implements Base's ai.provider.v1 slot.
Read the guideDemo mode
Import withDemo first in the Worker entry and wrap the worker with withDemo(worker, { seed }).
Read the guideApplication dependency links
To bring existing data into a seed, sign in as the owner and use its import screen.
Read the guideProtected mail proof preparation
Live acceptance is PENDING.
Read the guidePortable mail
index.mjs is the IF-056-MAIL-v1 ESM entry, usable from Node and Workers without a build.
Read the guideCloudflare Email Sending adapter
sendCloudflare(config, message, dependencies = {}) implements IF-056-MAIL-v1 using the structured Email Sending REST endpoint.
Read the guideMessaging v1 wire and Base client
Normative phase-1 wire choices for independent implementations and the concurrent Messaging core.
Read the guideResend outbound adapter
sendResend(config, message, dependencies = {}) exports the portable, single submission adapter from index.mjs.
Read the guideSendGrid outgoing adapter
index.mjs exports the portable ESM functions sendSendGrid(config, message, dependencies = {}) and serializeSendGridMessage(message).
Read the guideMail doctor API
mailDoctor(options, dependencies = {}) is portable ESM.
Read the guideVerified delivery-event intake
Public exports from src/events/index.mjs (re-export these from the mail facade):
Read the guideInbound normalization
Import normalizeInbound from modules/mail/src/inbound/index.mjs (also exposed by the assembled mail facade).
Read the guideOperator-auth conformance
index.mjs exports registerOperatorAuthConformance({ test, adapter }).
Read the guideNative accounts and proof persistence
createOperatorAuth({ db, config, accounts, proofs, ...
Read the guideAdopting operator auth
This module is server-only.
Read the guideTanStack Start adoption
Keep auth, D1, mail construction and Worker bindings in server-owned modules.
Read the guideVite SPA adoption
Keep the auth module, D1 access, sender construction, and every credential in the Worker's server entry.
Read the guideIdentity providers (OpenID Connect)
Server-only portable ESM using Fetch and WebCrypto.
Read the guideOperator auth (IF-055-CORE-v1)
Portable server-only ESM: import createOperatorAuth, createAuthHandler and createSignInHandler from modules/operator-auth/index.mjs.
Read the guideOwner-approved scheduled policies
Design · 19 October 2026
Read the guideSigned owner claim
This optional server-only module lets an installation owner claim an adopted application using a five-minute Run Edit Run signature.
Read the guide