A self-hosted finance tracker with a liquid glass UI, multi-account support, recurring transactions, categories, and Maybe Finance import.
-
Copy the env file
cp .env.example .env # No credentials needed — uses SQLite (like the dmarc-dashboard project) -
Deploy via Portainer
- Open Portainer → Stacks → Add Stack
- Paste the contents of
docker-compose.yml - Set environment variables from
.env - Deploy
-
Access the app at
http://your-server:8080
cd backend
npm install
npx prisma generate
npx prisma migrate dev
node prisma/seed.js # optional: seed default categories
npm run devcd frontend
npm install
npm run devBackend runs on :3001, frontend on :5173 (proxied to backend via Vite).
- Multiple accounts — checking, savings, credit cards, investments, cash
- Transactions — with search, filters, pagination, category assignment
- Categories — with sub-categories, icons, and colors
- Recurring transactions — daily/weekly/biweekly/monthly/quarterly/yearly with pause/resume
- Dashboard — balance overview, income vs expenses chart, category pie chart
- Import — Maybe Finance CSV and generic bank CSV (auto-detects Dutch/English columns)
- In Maybe Finance go to Settings → Export → Transactions CSV
- Select the account and date range and download
- In FinTrack go to Import, select Maybe Finance mode
- Choose the target account and upload the CSV
Duplicate detection uses the id field from Maybe exports — re-importing the same file is safe.
| Layer | Tech |
|---|---|
| Frontend | React 18, Vite, Recharts, Tailwind |
| Backend | Node.js, Express, Prisma ORM |
| Database | SQLite (via Prisma ORM) |
| Proxy | Nginx |
| Container | Docker / Portainer |
| Variable | Default | Description |
|---|---|---|
DATABASE_URL |
file:/app/data/finance.db |
SQLite file path (inside container) |
PORT |
8080 |
Exposed host port |