Last updated: 2026-03-12 (M2 complete)
- Brainstorm & concept validation
- PRD written
- Tech stack decided (Next.js, Tailwind, shadcn/ui, Zustand, Claude API)
- Competitor analysis
- Next.js app scaffolded under
app/ - Data model defined (
types.ts) - Zustand store wired up (
store.ts) - Safe to Spend calculation engine (
calculate.ts) - Core UI components (SafeToSpendCard, BalanceInput, SetupIncome, ExpenseList, TransactionLog)
- App renders and basic flow works
- Vitest + React Testing Library configured
- Playwright E2E configured
- Unit tests: calculate.ts (20 tests, full coverage of engine)
- Store tests: partialize, rehydration, actions (26 tests total)
- Component tests: SafeToSpendCard, SetupIncome, ExpenseList
- E2E test: full happy path (set income → add expense → see Safe to Spend)
- Git repo initialized at project root
- GitHub repo: https://github.com/otonielrojas/spendable
- Netlify auto-deploy on merge to master → https://spendable.netlify.app
- Netlify PR deploy previews (unique URL per open PR)
- GitHub Actions CI: lint + unit tests on every PR
- Development workflow documented in CLAUDE.md (branch naming, PR checklist, merge policy)
- Persistence: localStorage so data survives refresh
- Onboarding flow: first-time user guided setup (income → buffer → first expense)
- Empty states for every section
- Error handling & input validation (negative amounts, past due dates, etc.)
- Mobile UX pass: touch targets, keyboard behavior, safe area insets
- Dark mode support
- PWA manifest + installable on mobile homescreen
- At launch: remove
BETA_PASSWORDenv var from Netlify (disables pre-launch gate) - At launch: add Umami analytics snippet to
layout.tsx(privacy-first, no cookies, GDPR-compliant, free) — enables M4 day-1/day-7 retention tracking without requiring user accounts
- Deploy to production URL
- Share with 10 target users (young professionals)
- Collect feedback via simple typeform or in-app widget
- Track key metric: do users return after day 1? day 7?
- Iterate on core UX based on feedback
- Plaid integration: link bank account
- Auto-import transactions
- Auto-detect recurring expenses from transaction history
- Balance auto-updated from bank
- Claude API integration
- "Why is my Safe to Spend low?" — AI explanation
- Smart categorization of transactions
- Pay cycle insights ("You usually have $X left by day 10")
- Subscription paywall ($5–8/mo) for AI features
| Date | Decision | Reason |
|---|---|---|
| 2026-03-11 | No bank sync in MVP | Validate core UX loop cheaply before Plaid integration complexity |
| 2026-03-11 | Pay-cycle-native (not calendar month) | Primary differentiator vs PocketGuard |
| 2026-03-11 | Target: young professionals on first salary | Clear niche, high pain point, word-of-mouth potential |
| 2026-03-11 | Freemium: core free, AI ~$5-8/mo | Lower barrier to adoption; AI features justify upsell |
| 2026-03-12 | Vitest (not Jest) | Faster, native ESM, better Next.js/React 19 compat |
| 2026-03-12 | Playwright for E2E (not Cypress) | Better performance, cross-browser, first-class TypeScript |
| 2026-03-28 | Pre-launch gate via middleware.ts + BETA_PASSWORD env var | Protect unfinished M3 UI from public exposure; remove at launch by unsetting env var |
| 2026-03-28 | No accounts on free tier (permanent) | "No account required" is a core trust differentiator vs YNAB/PocketGuard; accounts only introduced for Pro tier at M6 |
| 2026-03-28 | Umami for analytics (not Vercel Analytics) | App is on Netlify; Umami is privacy-first, cookie-free, GDPR-compliant, free — enables M4 retention metrics without violating no-account promise |