Problem
The sales team needed an internal CRM with full control over data residency and integration surface. Off-the-shelf options either locked away the data or required a heavier ERP layer than the team had any use for.
Approach
Monorepo with pnpm workspaces + Turborepo. Frontend is a full React 19 app on Cloudflare Pages (Vite + TanStack Router + TanStack Query + shadcn/ui + Tailwind v4) — no Astro, deliberately, because every screen is authenticated and stateful. Backend is Hono on Cloudflare Workers with D1 + Drizzle.
Delivery was spec-driven: 13 capability specs written, reviewed, then implemented against a hybrid (engram + openspec) artifact store. 5 implementation batches, dependency-ordered.
What I shipped
- 13 CRM capabilities: auth-rbac, contacts-crud, companies-crud, deals-kanban, activities-timeline, tasks-management, attachments, calendar/appointments, forms/lead-capture, and supporting modules
- Verification: 90/94 requirements satisfied at pre-archive, 0 CRITICAL findings
- Drizzle migration pipeline working around drizzle-kit’s
.jsextension bug (CJS wrapper scripts with module shims) - Foundation for NetSuite-CRM parity follow-on (7 additional modules scoped)