Tech Stack
Frontend
| Layer | Technology |
|---|---|
| Framework | Next.js (App Router) + React + TypeScript |
| Styling | Tailwind CSS with custom design tokens |
| Client state | Zustand + Immer |
| Drag and drop | @dnd-kit/core |
| Rich text editor | TipTap (over Markdown via tiptap-markdown) |
| AI chat UI | Vercel AI SDK (useChat hook) |
| Markdown rendering | react-markdown + remark-gfm |
| Offline persistence | idb-keyval (IndexedDB) |
| Icons | lucide-react |
Backend (Cloudflare)
| Service | Role |
|---|---|
| Cloudflare Workers | API runtime — all /api/* routes |
| Cloudflare D1 (SQLite) | Server-side board/note/work-item storage and sync |
| Cloudflare KV | Sessions, OTP, board metadata, billing state, rate limits |
| Cloudflare R2 | Board Markdown snapshots and changelog artifacts |
AI
| Component | Technology |
|---|---|
| SDK | Vercel AI SDK (ai, @ai-sdk/react) |
| Primary model | Google Gemini (gemini-3-flash-preview) via @ai-sdk/google |
| Streaming | streamText → toUIMessageStreamResponse() for chat; generateText for structured generation |
| Tool calling | Zod-validated tool schemas + client-side result application |
Billing
| Component | Technology |
|---|---|
| Payments | Stripe (Checkout, Billing Portal, Webhooks) |
| SMTP2GO HTTP API |
Build and deploy
| Step | Tool |
|---|---|
| Bundler | Next.js (SWC) |
| Cloudflare adapter | @opennextjs/cloudflare |
| Deployment | wrangler deploy |
See also
- System Overview — Architecture diagram
- Storage Layers — What each storage type is responsible for
- Deployment — How to deploy