Spendwise Project Guide
Tech Stack
- •Frontend: React 18 + Vite 5
- •Styling: Tailwind CSS 3 + custom utility classes
- •UI: lucide-react icons, Recharts, AG Grid Community
- •Backend: Express JSON API +
server/db.jsonpersistence - •Utils: date-fns, uuid, clsx, tailwind-merge
Project Structure
code
spendwise-app/ ├── src/ │ ├── components/ # UI components │ │ ├── DashboardFilters.jsx │ │ ├── ErrorBoundary.jsx │ │ ├── ExpensePieChart.jsx │ │ ├── Header.jsx │ │ ├── Modal.jsx │ │ ├── Sidebar.jsx # Mobile-responsive │ │ ├── SpendingTrend.jsx │ │ ├── Toast.jsx # Error notifications │ │ └── TransactionForm.jsx │ ├── context/ │ │ └── FinanceContext.jsx # Global state + API sync │ ├── lib/ # Shared utilities │ │ ├── utils.js # cn() helper │ │ ├── formatters.js # Currency/date formatting │ │ └── helpers.js # Category filtering, validation │ ├── pages/ │ │ ├── Dashboard.jsx │ │ ├── Transactions.jsx │ │ └── Categories.jsx │ ├── App.jsx │ ├── main.jsx │ └── index.css # Tailwind + custom utilities ├── server/ │ ├── index.js # Express API with validation │ └── db.json # Local data store ├── index.html ├── tailwind.config.js └── vite.config.js
Frontend Patterns (React)
State & Data
- •Use
FinanceContextfor shared state and derived data - •Key state:
transactions,categories,dateRange,selectedCategoryIds - •Derived data (memoized):
filteredTransactions,categoryMap,expenseCategories,periodSpending,totalSpending - •Status flags:
isLoading,isSaving,error - •All CRUD operations use
useCallbackfor stable references
Utilities (src/lib/)
- •utils.js:
cn()for merging Tailwind classes - •formatters.js:
formatCurrency(),formatDollars(),formatDate(),toInputDate() - •helpers.js:
getExpenseCategories(),isExpense(),isValidColor(),sanitizeColor()
Styling
- •Prefer Tailwind classes; use
glass-cardandmesh-gradientutilities - •Use Manrope for display and body text
- •Primary color:
#009485, background:#0a0b10 - •Use
cn()fromsrc/lib/utils.jsfor conditional classes
Error Handling
- •
ErrorBoundarywraps app for crash recovery - •
Toastcomponent shows save errors - •Forms show inline validation errors
- •Loading states during fetch/save operations
Routing
- •
react-router-domwithSidebaras persistent navigation - •Pages live in
src/pagesand should be self-contained - •Mobile sidebar uses hamburger menu
Backend Patterns (Express)
API Endpoints
| Method | Endpoint | Purpose |
|---|---|---|
| GET | /api/data | Load categories + transactions |
| POST | /api/save | Persist categories/transactions (validated) |
| GET | /api/health | Health check |
Validation
- •UUIDs validated with regex
- •Strings sanitized (HTML stripped, length limited)
- •Types enforced (expense/income)
- •Amounts must be non-negative numbers
- •Colors must be valid hex format
Data Storage
- •Data stored in
server/db.json - •Writes use atomic temp-file + rename pattern
- •Write queue prevents race conditions
Quick Commands
bash
npm run dev # Vite dev server npm run server # Express API (nodemon) npm run start:all # Run both npm run build # Production build npm run lint # ESLint
Rules
- •Keep UI in React components; avoid direct DOM manipulation
- •Use Tailwind for layout and theming; keep glassmorphic feel
- •Use utilities from
src/lib/instead of duplicating code - •Keep API contract stable (
/api/data,/api/save) - •Avoid new dependencies unless clearly justified
- •All interactive elements need focus states and ARIA attributes
Related Skills
- •ui-patterns: Tailwind + UI consistency
- •quality-checklist: Pre-commit verification
Related Docs
- •README.md: Setup and overview
- •ARCHITECTURE.md: Detailed technical documentation