Files
wallet/.vibecoder/plan.md
T

4.1 KiB

Wallet App — MVP Plan

What We're Building

A personal finance wallet app where you can log income transactions, view your total balance on a dashboard, and see a complete history of all entries. The app requires login (so each user has their own data) and persists everything to SQLite.

For the user: Sign up or log in → see your total balance at a glance → add new income entries → review all transactions in a table.

How It Works

  1. Auth Pages (Sign Up / Log In)

    • User creates an account or logs in with email + password
    • Session token stored in browser; backend validates on each request
    • Redirects to dashboard on success
  2. Dashboard

    • Shows Total Balance (sum of all income entries for this user)
    • Quick link to add a new entry
    • Link to view full transaction history
  3. Wallet Entry Page

    • Form to add a new income entry: amount, description, date
    • Submit creates the entry and returns to dashboard
  4. Transaction Table

    • Lists all income entries (newest first)
    • Columns: Date, Description, Amount, Running Balance
    • Shows overall savings (total balance) at the top

Key Decisions & Why

  • React frontend (you chose it): modern, component-based, easy to extend
  • FastAPI backend: lightweight, fast, great for JSON APIs
  • SQLite database: no external DB needed, data lives in ./data/app.db
  • Session-based auth: simple, stateful; user logs in once per browser
  • Income only (you chose it): simpler schema, no expense tracking yet
  • Total balance metric (you chose it): single number, easy to understand

Assumptions & Defaults

  • Email + password auth (no OAuth, no 2FA)
  • One user per session (no multi-user dashboard)
  • Amounts are decimal (e.g., 1234.56)
  • Dates default to today when adding an entry
  • No edit/delete of past entries (read-only history)
  • No categories or tags

Out of Scope

  • Expense tracking (only income)
  • Recurring transactions
  • Budget alerts
  • Export to CSV
  • Mobile app (web only)
  • Dark mode

Technical Detail

Frontend (React)

Screens:

  1. Login (/login) — email, password, submit, link to sign up
  2. Sign Up (/signup) — email, password, confirm password, submit, link to login
  3. Dashboard (/) — total balance card, "Add Entry" button, link to history
  4. Add Entry (/add) — form (amount, description, date), submit button, cancel
  5. History (/history) — table of all entries, total balance header

State & Flow:

  • React Context or simple state for auth token + current user
  • Redirect to /login if not authenticated
  • Fetch dashboard data on mount
  • Form submission posts to backend, then redirects

Backend (FastAPI)

Data Model:

User
  - id (int, PK)
  - email (str, unique)
  - password_hash (str)
  - created_at (datetime)

Entry
  - id (int, PK)
  - user_id (int, FK → User)
  - amount (Decimal)
  - description (str)
  - date (date)
  - created_at (datetime)

Endpoints:

  • POST /auth/signup — create user, return token
  • POST /auth/login — validate email/password, return token
  • POST /auth/logout — clear session (optional, browser can just delete token)
  • GET /dashboard — return total balance for logged-in user
  • POST /entries — create new income entry
  • GET /entries — list all entries for logged-in user (paginated or all)

Auth:

  • Password hashed with bcrypt
  • Session token (JWT or simple session ID) in cookie or Authorization header
  • Middleware checks token on protected routes

Database:

  • SQLite at ./data/app.db
  • Migrations run on startup (SQLAlchemy ORM)

Data Source

  • User input only (no external APIs)
  • All data stored locally in SQLite

Stack

  • Frontend: React 18, React Router, Fetch API
  • Backend: FastAPI, SQLAlchemy ORM, Pydantic, bcrypt
  • Database: SQLite
  • Template: fastapi-react (pinned dependencies, known to build)

Scope

Depth: MVP. Something they could actually use: the core flow end to end, real persisted data, auth ONLY if the app is meaningless without it, sensible empty and error states. No test suite, no roles, no CI.