- GET /api/paychecks returns virtual data (id: null) without writing to
DB when no records exist for the month
- First interaction (bill toggle, OTE add, actual add) lazily calls
POST /api/paychecks/generate to persist the paycheck
- New PATCH /api/paychecks/:id to update gross and net
- Regenerate/refresh button syncs gross/net from current Settings
- Inline pencil edit for gross/net on each paycheck column header
- 'preview' badge and info banner shown for unsaved months
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Monthly Summary:
- Spending breakdown donut (bills / variable / one-time)
- Variable spending by category bar chart
- Added actuals.by_category to /api/summary/monthly response
Annual Overview:
- Income vs. spending grouped bar chart
- Surplus/deficit bar chart (green/red per month)
- Stacked variable spending by category across all months
- New /api/summary/annual endpoint (single DB round trip for full year)
- AnnualOverview now uses /api/summary/annual instead of 12 parallel calls
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
pg returns DATE columns as JS Date objects which serialize to ISO
timestamps, causing split('-') to produce NaN for the day portion.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- CSS custom properties design system with full light/dark themes
- ThemeContext with localStorage persistence and system preference detection
- Theme toggle button in nav (moon/sun icon)
- Modern Inter font, card-based layout, sticky nav
- All pages restyled with CSS classes instead of inline styles
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sub-agents must never call td commands directly. Concurrent writes
from parallel agents corrupt the SQLite database. Only the
orchestrator manages td task lifecycle.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The ./server bind mount overwrites /app/server including node_modules
installed during the Docker build. Running npm install on startup
ensures deps are present after the volume mount.
Also reverts the node_modules named-volume workaround in favor of
this cleaner approach (requires node installed locally for non-Docker dev).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Mounting ./server:/app/server overwrote the npm-installed node_modules
from the Docker build. Named volumes for server/client node_modules
shadow the bind mount so installed packages are preserved.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
.dockerignore prevents node_modules and dist from leaking into the
build context, which could silently overwrite npm-installed packages.
Forced no-cache rebuild confirms dotenv and all deps install cleanly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Dockerfile: add COPY db/ /app/db/ so migrations are available at
runtime (server/src/db.js requires ../../db/migrations at startup)
- vite.config.js: fix dev proxy port from 3001 to 3000 to match
server's default PORT
Docker build passes; server starts and connects to DB correctly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Monthly summary:
- GET /api/summary/monthly returns income, bills, actuals, one-time
expense totals and surplus/deficit for a given month
- MonthlySummary page shows stat cards and breakdown table
Annual overview:
- AnnualOverview page fetches all 12 months in parallel via Promise.all
- Year navigation, summary cards, monthly table with totals row
- Fix: normalize nested API response to flat fields expected by component
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
GET /api/summary/monthly returns income, bills, actuals,
and one-time expense totals. Summary page shows stat cards
and a breakdown table with surplus/deficit.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Year-at-a-glance table with monthly income, bills, variable
spending, and surplus/deficit. Fetches all 12 months in parallel.
Summary cards show annual totals.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- One-time expenses: paid toggle, delete, and inline add form in
paycheck columns (wired to POST/DELETE/PATCH /api/one-time-expenses)
- Variable spending actuals section with category select, amount,
note, date fields; actuals included in remaining balance
- Both Phase 3 features fully integrated into PaycheckView
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
API for expense categories and actuals with full CRUD.
Paycheck view shows actuals section and includes them in
remaining balance calculation.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
API for adding, removing, and marking one-time expenses paid.
Paycheck view supports inline add form and paid/delete actions.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Auto-generates paycheck records from config and active bills.
GET /api/paychecks auto-generates if month not yet created.
Idempotent generation preserves existing paid status.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Full REST API for bill definitions with validation.
Bills page supports add, edit, toggle active, and delete.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
GET/PUT /api/config for pay dates and amounts.
Settings page fetches and saves configuration.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All tables per PRD data model with default config seeds.
Migration runner tracks applied migrations in DB.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sets up the full monorepo structure with:
- Multi-stage Dockerfile (client-build + production stages)
- docker-compose.yml for production, docker-compose.dev.yml overlay for development
- Express server (port 3000) with pg pool, health route, and SPA static file serving
- React 18 + Vite client with react-router-dom v6, nav bar, and placeholder page components
- .env.example with PostgreSQL and app config
- Empty db/migrations/ directory for future migrations
- CLAUDE.md updated with development workflow commands
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Document commit-per-task, documentation hygiene, and td lifecycle requirements
for all agents working in this repo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>