Pegboard documentation

The working manual.

Start your own installation, keep it running and follow what’s being built.

Get started

Start here

Operate & develop

Product & design

Technical 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 guide

CLAUDE

@AGENTS.md

Read the guide

Pegboard demo

rer demo opens a fresh, signed-in Pegboard Demo at /app, past first-run setup.

Read the guide

Fonts

Outfit is self-hosted under the SIL Open Font License 1.1 in outfit/LICENSE.txt.

Read the guide

Hydration 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 guide

Headless family core

Add domain source only when every edition needs it.

Read the guide

AI client

ai implements Base's ai.provider.v1 slot.

Read the guide

Demo mode

Import withDemo first in the Worker entry and wrap the worker with withDemo(worker, { seed }).

Read the guide

Application dependency links

To bring existing data into a seed, sign in as the owner and use its import screen.

Read the guide

Protected mail proof preparation

Live acceptance is PENDING.

Read the guide

Portable mail

index.mjs is the IF-056-MAIL-v1 ESM entry, usable from Node and Workers without a build.

Read the guide

Cloudflare Email Sending adapter

sendCloudflare(config, message, dependencies = {}) implements IF-056-MAIL-v1 using the structured Email Sending REST endpoint.

Read the guide

Messaging v1 wire and Base client

Normative phase-1 wire choices for independent implementations and the concurrent Messaging core.

Read the guide

Resend outbound adapter

sendResend(config, message, dependencies = {}) exports the portable, single submission adapter from index.mjs.

Read the guide

SendGrid outgoing adapter

index.mjs exports the portable ESM functions sendSendGrid(config, message, dependencies = {}) and serializeSendGridMessage(message).

Read the guide

Mail doctor API

mailDoctor(options, dependencies = {}) is portable ESM.

Read the guide

Verified delivery-event intake

Public exports from src/events/index.mjs (re-export these from the mail facade):

Read the guide

Inbound normalization

Import normalizeInbound from modules/mail/src/inbound/index.mjs (also exposed by the assembled mail facade).

Read the guide

Operator-auth conformance

index.mjs exports registerOperatorAuthConformance({ test, adapter }).

Read the guide

Native accounts and proof persistence

createOperatorAuth({ db, config, accounts, proofs, ...

Read the guide

Adopting operator auth

This module is server-only.

Read the guide

TanStack Start adoption

Keep auth, D1, mail construction and Worker bindings in server-owned modules.

Read the guide

Vite SPA adoption

Keep the auth module, D1 access, sender construction, and every credential in the Worker's server entry.

Read the guide

Identity providers (OpenID Connect)

Server-only portable ESM using Fetch and WebCrypto.

Read the guide

Operator auth (IF-055-CORE-v1)

Portable server-only ESM: import createOperatorAuth, createAuthHandler and createSignInHandler from modules/operator-auth/index.mjs.

Read the guide

Owner-approved scheduled policies

Design · 19 October 2026

Read the guide

Signed 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