Getting Started
Run the app locally, understand the key bindings, and know what is public versus protected.
Local development
Use the normal Waku loop for UI work:
npm install
npm run devFor Worker-local validation with Cloudflare bindings:
npm run preview:workerIf you use Wrangler locally, copy .dev.vars.example to .dev.vars and fill in local-only secret values. Do not commit .dev.vars.
Typecheck and build
The docs live in this repo and ship with the normal app build, so validation stays simple:
npm run typecheck
npm run buildWorker bindings
The app still depends on the same Cloudflare resources:
EMAILfor outbound replies and magic-link sign-inINBOX_R2for stored message payloads, attachments, and per-inbox sending settingsSUPPORT_ALIASas the default mailbox fallback for inbound/default mailbox discoveryINTERNAL_SENDER_EMAILfor internal notifications such as magic-link email- optional
INTERNAL_SENDER_NAMEfor internal notification display name FORWARDING_ADDRESS
Public and protected routes
/is public./docsis public./loginis public./appis protected when magic-link auth is configured or whenAUTH_REQUIRED=true.
With AUTH_REQUIRED=true, the app fails closed if required auth dependencies are missing instead of silently making /app public.
Recommended alpha setup
- Configure the Cloudflare bindings first.
- Keep
AUTH_REQUIRED=truein production-like Wrangler config. - Set
AUTH_COOKIE_SECRETas a Worker secret. - Confirm
FORWARDING_ADDRESS,SUPPORT_ALIAS,INTERNAL_SENDER_EMAIL, and theEMAILbinding are configured. - Deploy the Worker.
- Verify
/docs,/login, and/app. - In
/app, open inbox settings for each mailbox and configure its sender alias. Leaving the alias blank sends as the bare inbox email address.
Use a dedicated bearer API_TOKEN secret only if you need the machine /api/* routes.