← all work
Greenfield · Internal product · 2026 SHIPPED

Internal Sales CRM.

Multi-tenant sales CRM covering 13 capabilities: auth/RBAC, contacts, companies, deals-kanban, activities timeline, tasks, calendar, and form-based lead capture.

pnpm + Turborepo React 19 Vite TanStack Router TanStack Query shadcn/ui Tailwind v4 Hono Cloudflare Workers + Pages D1 Drizzle
Client undisclosed · NDA · technical surface only

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 .js extension bug (CJS wrapper scripts with module shims)
  • Foundation for NetSuite-CRM parity follow-on (7 additional modules scoped)
⚜   highlights   ⚜
  • Spec-driven delivery: 13 capability specs synced to main
  • 94 requirements verified pre-archive
  • Drizzle migrations + Cloudflare-only data plane
  • Follow-up scope: NetSuite-CRM parity (7 additional modules)
← all engagements