AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Email API project for developers. Inspired by Resend
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Minimal email API for developers, built as a portfolio project for Resend
applications. See CLAUDE.md for engineering rules and
design/design-system/CLAUDE.md for design rules.
• Control plane / data plane split. Hono validates and queues,
Inngest sends. Never call SES synchronously from a route handler.
• Transport interface. ConsoleTransport for tests/dev,
SesTransport for production.
• Resend bridges auth email until the send pipeline exists. Supabase's
default SMTP is rate-limited and not for production. S檢視完整 README ↗Dispatch is an email API for developers: you verify a domain, create a key, and send with one HTTP request, and delivery, bounces and complaints come back to you as signed webhooks. It is a working product, not a mockup, sending real mail through AWS SES, built as a passion project.
The second image is the proof that the pipeline is real: a send through the deployed API to Amazon's bounce simulator, the bounce coming back from SES over SNS, and Dispatch delivering it as a signed email.bounced webhook.
The API that accepts a send never sends anything. It is split into a control plane, which answers the caller, and a data plane, which does the slow and unreliable work afterwards.
Why it is built this way:
POST /v1/emails validates, rate limits per key, writes a queued row and returns 202. The send happens in an Inngest function with retries, so an SES hiccup is a retry, not a failed request.queued before sending, and a redelivered notification finds its own id already stored.queued < sent < delivery_delayed < delivered < bounced/complained), checked in the same SQL statement that writes it.ConsoleTransport in tests and local development, SesTransport in production, so the pipeline and its tests never touch AWS.| Layer | Choice | Why |
|---|---|---|
| API | Hono | Small, typed, and runs unchanged as a Vercel function |
| Web | Next.js 15, App Router | Server components read the database directly, so there is no client fetching library |
| Styling | Tailwind, Radix Primitives, Radix Colors | A dark-first token set in design/design-system, and accessible primitives underneath |
| Validation | Zod | Schemas are the source of truth for types, via z.infer |
| Database | Postgres + Drizzle | SQL that reads as SQL, including the conditional status updates |
| Auth | Supabase | The same project hosts the Postgres database, so deleting an account cascades through every row it owns |
| Rate limiting | Upstash Redis | A sliding window per API key, so one noisy integration cannot starve the others |
| Jobs | Inngest | Durable steps with retries, and step-level idempotency, for the whole data plane |
AWS SES, behind a Transport interface | Real DKIM, real bounces and a real event stream, which is what makes Domains, Metrics and Webhooks honest | |
| Webhooks | Hand-rolled, Standard Webhooks signing | Signatures match the Standard Webhooks reference implementation byte for byte, the scheme Svix and Resend use, with no vendor in the path |
| Flags | PostHog | Large features merge to main in small PRs, dark until finished |
| Infrastructure | Terraform | The SES configuration set and SNS topic, in infra/ |
| Hosting | Vercel, two projects | dispatch for the web app, dispatch-api for the api as one serverless function |
| Lint and format | Biome | One tool and one root config for the whole repo, in place of ESLint and Prettier |
| Logging | Winston | One shared logger writing timestamped JSON, so Vercel's log viewer can filter on any field; console.log is never used |
You need Node 22 (pinned in .nvmrc), pnpm, and a Postgres database. A Supabase project provides both the database and auth.
apps/web/.env.example to apps/web/.env.local and apps/api/.env.example to apps/api/.env.local, and fill them in. Each variable is commented with what breaks without it. For a first run you can leave EMAIL_TRANSPORT=console, which logs a send instead of making one, and skip SES entirely.pnpm install
pnpm --filter @dispatch/db db:migrate
pnpm dev
npx inngest-cli@latest dev -u http://localhost:3001/api/inngest
| Command | What it does |
|---|---|
pnpm dev | Run the web app and the api |
pnpm build | Build everything |
pnpm lint / pnpm format | Biome, checking or fixing |
pnpm typecheck | tsc --noEmit across the repo |
pnpm test | Unit tests |
pnpm e2e | The Playwright suite, against localhost:3000 by default |
CI runs lint, typecheck, unit tests and a build on every pull request. The Playwright suite runs separately against each web preview deploy, so a slow browser suite never holds up the fast checks.
Sixteen phases, each shipped as a series of small pull requests merged to main. This table records what each one delivered.
| Phase | What | Status |
|---|---|---|
00 | IDE, Repo, Turborepo, Biome, TS strict, CLAUDE.md, PR template, CI | |
01 | Design system in Claude Design, tokens, logo | |
02 | Landing page: header, hero, footer | |
03 | Supabase auth, signup and login pages, session middleware | |
04 | Dashboard shell: sidebar, routing, empty states | |
05 | API keys: generation, hashing, one-time reveal, Hono skeleton | |
06 | Domains: SES identity, DKIM records, on-demand verification check | |
07 | Send pipeline + Emails list and detail, domain verification polling, rate limiting | |
08 | Templates: CRUD, variable interpolation, live preview | |
09 | Compatibility checker, shipped behind a PostHog flag | |
10 | Webhooks: signing, retries, delivery log, SNS bounce ingestion | |
11 | Metrics and Logs | |
12 | Settings and Profile | |
13 | Deployment: both apps live, env verified, SNS on a permanent endpoint | |
14 | Polish, Playwright E2E, request log retention, README | |
15 | UI Polish: Landing page, Auth Pages, Dashboard, three.js mp4 |
Engineering rules live in CLAUDE.md, design rules in design/design-system/CLAUDE.md.
apps/
web/ Next.js: landing, auth, dashboard
api/ Hono: the public REST api, v1
packages/
db/ Drizzle schema, migrations, queries
core/ send pipeline, key hashing, webhook signing, SNS verification
compat/ email client compatibility checker, framework-free
ui/ Radix + Tailwind components
e2e/ Playwright suite, run against preview deploys
config/ currently unused
design/ the design system: tokens, foundations, logo
infra/ Terraform for the SES configuration set and SNS topic
| Tests | Vitest, Playwright | Unit tests for the pipeline and signing, and an end-to-end suite against every preview deploy |