Roadmap: new packages for AI/SaaS workloads
Tracks the next wave of @workkit/* packages, surfaced while building entryexit.ai. Each package is a reusable workkit primitive — not entryexit-specific. Build philosophy unchanged: composable, thin wrappers, types over docs, Standard Schema, zero runtime overhead.
Build sequence
| Order |
Issue |
Package |
Days |
Unblocks |
| 1 |
#23 |
@workkit/browser |
1 |
Shared Browser Rendering primitive |
| 2 |
#24 |
@workkit/pdf |
1 |
Brief rendering, validates Browser Rendering at scale |
| 3 |
#25 |
@workkit/agent |
3-5 |
Everything LLM-touching |
| 4 |
#26 |
@workkit/notify core |
3-4 |
Notification dispatch foundation |
| 5 |
#27 |
@workkit/notify email adapter |
1 |
Email delivery (Resend + React Email) |
| 6 |
#28 |
@workkit/notify in-app adapter |
1 |
In-app feed + SSE |
| 7 |
#29 |
@workkit/notify WhatsApp adapter |
2 |
WA delivery (parallel with Meta + template approval, 5-10 day lead) |
Cross-cutting
Decisions made
- Build
@workkit/browser first, not after @workkit/pdf. Reasoning: shared primitive (~80-150 LOC) is small, pdf becomes a thin consumer, future screenshot/OG generators drop in clean. Avoids extracting later and breaking pdf internals.
- Agent is provider-agnostic (via
@workkit/ai-gateway), not Claude-only. Compounds across SaaS.
- Handoffs ship in agent v1 (~50 extra LOC, entryexit Research Desk needs it).
@workkit/next deferred. Cloudflare Pages' getCloudflareContext() covers it for now. Revisit only when 2+ projects hit the same boilerplate pain.
Explicit non-goals
@workkit/mcp-server — @modelcontextprotocol/sdk/server already works in a Worker.
@workkit/openapi — @workkit/api already emits OpenAPI.
@workkit/vectorize — defer until a real RAG case lands.
@workkit/billing — keep product-specific until 2+ products need the same shape.
Constitution (cross-cutting, see #30)
- Zero runtime overhead — reject heavy deps without justification
- Standard Schema only for validation (no Zod-hardcoded signatures)
- Every package wires
@workkit/testing
- Single
src/index.ts export per package
- No cross-package imports except declared peer deps
- Changeset required on every public API change
Open questions
- Notify template system — inline v1 fine for entryexit. Promote to D1/R2 registry only when non-engineers need to edit copy.
- Notify WhatsApp BSP — Gupshup vs Interakt vs AiSensy. Build adapter interface first, swap concrete BSP after pricing + template approval UX comparison.
- PDF cost — alert at 50k Browser Rendering sessions/month. Re-evaluate
@react-pdf/renderer if we cross that line.
Roadmap: new packages for AI/SaaS workloads
Tracks the next wave of
@workkit/*packages, surfaced while building entryexit.ai. Each package is a reusable workkit primitive — not entryexit-specific. Build philosophy unchanged: composable, thin wrappers, types over docs, Standard Schema, zero runtime overhead.Build sequence
@workkit/browser@workkit/pdf@workkit/agent@workkit/notifycore@workkit/notifyemail adapter@workkit/notifyin-app adapter@workkit/notifyWhatsApp adapterCross-cutting
chore(constitution): encode workkit rules as Maina verify gatesDecisions made
@workkit/browserfirst, not after@workkit/pdf. Reasoning: shared primitive (~80-150 LOC) is small, pdf becomes a thin consumer, future screenshot/OG generators drop in clean. Avoids extracting later and breaking pdf internals.@workkit/ai-gateway), not Claude-only. Compounds across SaaS.@workkit/nextdeferred. Cloudflare Pages'getCloudflareContext()covers it for now. Revisit only when 2+ projects hit the same boilerplate pain.Explicit non-goals
@workkit/mcp-server—@modelcontextprotocol/sdk/serveralready works in a Worker.@workkit/openapi—@workkit/apialready emits OpenAPI.@workkit/vectorize— defer until a real RAG case lands.@workkit/billing— keep product-specific until 2+ products need the same shape.Constitution (cross-cutting, see #30)
@workkit/testingsrc/index.tsexport per packageOpen questions
@react-pdf/rendererif we cross that line.