A personal budget tracker built to answer one question: "How much can I spend this month?"
Traditional budget apps obsess over categories and past spending. SSBudget focuses on the future.
SSBudget takes a different approach:
- Define your fixed expenses (rent, bills), savings goals, and estimated variable costs (groceries, fuel)
- Update account balances and mark previously planned payments throughout the period
- Get your remaining free cash — your budget until the next paycheck
demo.webm
- Multi-currency — PLN, EUR, USD + 30 more with live exchange rates
- Passkey auth — Passwordless login, no user management needed
- Import/Export — You can take your whole database with you (god bless SQLite!)
- Spreadsheet-like UI — Edit in place, minimal clicks, maximum density
- Self-hosted — You can run it yourself anywhere.
- E2E test coverage — Everything important is covered with e2e selenium test.
- WhatsApp notification - So that you can proactively share your budget with your spouse.
This project was 100% vibe-coded using Claude Code over 8 sessions (~4 days). The entire codebase — backend, frontend, database schema, tests, deployment config — was generated through conversation with Claude Opus/Sonnet.
Check docs/sessions/ for the session logs and CLAUDE.md for the context file that guided development.
| Layer | Stack |
|---|---|
| Language | Scala 3 (JVM + Scala.js) |
| Backend | cats-effect, http4s, tapir, doobie |
| Frontend | Laminar (Scala.js SPA), Bootstrap 5 |
| Database | SQLite + Flyway migrations |
| Auth | WebAuthn passkeys + Argon2 password |
| Build | sbt, Vite |
- JDK 21+
- sbt 1.9+
- Node.js 18+
# Terminal 1: Scala.js watch
sbt '~frontend/fastLinkJS'
# Terminal 2: Vite dev server
cd frontend && npm install && npm run dev
# Terminal 3: Backend
sbt backend/runOpen http://localhost:3000. First visit prompts password setup.
./build.sh # Builds backend + frontend + Docker image
docker run -p 8080:8080 -v ./data:/data ssbudget| Variable | Default | Description |
|---|---|---|
SSBUDGET_DB_PATH |
data/ssbudget.db |
SQLite database path |
SSBUDGET_PORT |
8080 |
Server port |
SSBUDGET_RP_ID |
localhost |
WebAuthn relying party ID |
SSBUDGET_RP_ORIGINS |
http://localhost:3000,http://localhost:8080 |
Allowed origins |
See fly.toml for a fly.io deployment example. Key points:
- Persistent volume for SQLite
- Secrets for
SSBUDGET_RP_IDandSSBUDGET_RP_ORIGINS
ssbudget/
├── shared/ # Cross-compiled models and API definitions
├── backend/ # http4s server, repositories, auth
├── frontend/ # Laminar SPA
├── e2e/ # Selenium tests
└── docs/ # Session logs