finTrackr

finTrackr

Docker app from slummybell's Repository

Overview

FinTrackr is a self-hosted budgeting and expense-tracking PWA. Entries are written by hand or imported from bank CSV exports and reviewed before they land; there are no bank integrations by design. Includes monthly budget lines with pacing projections and daily allowances, recurring items with a subscription cost audit, savings buckets and sinking funds, debt payoff tracking, spending insights and charts, vendor memory with aliases, tags, receipts, light and dark themes, and multi-user accounts with per-user data isolation. Installable as a PWA with offline entry. All data lives in a single SQLite file under /data; back it up by copying the file.

FinTrackr

A self-hosted budgeting and expense-tracking PWA for home labs. Transactions are entered manually or imported from bank CSV exports — there are no bank integrations by design. Runs as a single Docker container with all data in one SQLite file.

  • Self-hosted, multi-user — cookie-based auth, per-user data isolation, one container, one database file
  • Manual-first — entries are written by hand or imported from CSV and reviewed before they land
  • Installable PWA — works offline, queues entries written without a connection, installs to the home screen
  • Desktop and mobile layouts — a sidebar with multi-column dashboards on wide screens, a single column with a tab bar on phones

Features

Tracking

  • Expense and income entries with vendor, category, date, note, free-form tags, and an optional receipt photo
  • Vendor memory — a vendor learns its default category from the first categorized entry and files future entries automatically; vendors support aliases (the statement string AMZN MKTP US files as Amazon), renames, and merging duplicates
  • Type-ahead vendor search on the entry form (aliases included), amount prefill for steady vendors, and an outlier warning when an amount is far above a vendor's usual
  • Activity view: the full ledger grouped by day with daily subtotals, searchable and filterable by kind, category, amount range, and tag
  • Per-vendor history: monthly spend trend, this month vs. last, visit log

Budgeting

  • Monthly budget lines with optional groups (Needs / Wants / …) rolled up with subtotals; optional envelope-style rollover of unspent budget
  • Per-line pacing projections ("pacing to $876 · $376 over") and a daily allowance ("≈ $9.46 a day holds it"), plus a safe-to-spend-today figure on Home
  • Re-line suggestions — each line is compared with its actual average over recent months, with a one-tap adjustment
  • Recurring items post themselves to the ledger when due; includes a due-soon view, a subscription cost audit (annualized), price-increase flags, and variable items (utility bills) that wait for the real amount to be recorded
  • Pattern detection: steady same-vendor purchases are offered as recurring
  • Savings buckets — targets (jars), plain categories, and sinking funds paced toward a date; pay-yourself-first monthly tracking
  • Debts — balances paid down by hand or via debt-linked entries, with payoff forecasts based on recent pace
  • Optional spending challenges (no-spend days, category caps) and a worth-it review of the week's biggest expenses — both off by default

Insights

  • Month pace chart with end-of-month projection, category bullet bars, weekday averages, month-over-month category deltas, vendor leaderboard, savings rate with an optional target, no-spend streaks and records
  • Weekly review (this week vs. last, day by day) and a year view against the budget rule
  • Print-ready monthly report (ink-on-white regardless of theme)

Bank import

  • Import the CSV your bank exports, or paste rows copied from online banking
  • Columns are auto-detected and confirmed once; the mapping is saved as a bank profile for one-click reuse
  • Handles signed amounts, debit/credit column pairs, and both date orders
  • Rows are matched against existing vendors (names and aliases), descriptions are cleaned of processor noise, and rows matching an existing entry's date and amount are flagged as likely duplicates
  • Everything is reviewed — re-file, rename, include, or skip per row — before anything is written; accepted renames store the raw statement string as the vendor's alias so the next import matches automatically

Data & administration

  • Per-user CSV export/import and a full-account JSON export
  • Account reset ("fresh start") and self-service account deletion
  • The first registered account administers the instance: manual backups, full-database download, and validated restore
  • Nightly database snapshots (VACUUM INTO), keeping the newest seven

Getting started

Docker

docker run -d \
  --name fintrackr \
  -p 8080:8080 \
  -v /path/on/host/fintrackr:/data \
  --restart unless-stopped \
  slummybell/fintrackr

All data lives in /data/fintrackr.db (SQLite) — back it up by copying the file. The image ships a healthcheck against /api/health.

Docker Compose (build from source)

docker compose up --build
# → http://localhost:8080

Configuration

Variable Default Purpose
ConnectionStrings__Default Data Source=/data/fintrackr.db SQLite location
ASPNETCORE_URLS http://+:8080 Listen address/port inside the container
ReceiptsPath /data/receipts Receipt photo storage
BackupsPath /data/backups Nightly + manual database snapshots
TZ Container timezone

Reverse proxy

The app honors X-Forwarded-For/X-Forwarded-Proto, so behind a TLS proxy (nginx, Traefik, Nginx Proxy Manager) the auth cookie is marked Secure and the rate limiter sees real client IPs. Point the proxy at port 8080; no further configuration is needed. TLS termination is the proxy's job — the container itself serves plain HTTP.

Security & multi-user

  • Sessions are HTTP-only cookies via ASP.NET Core Identity (hashed passwords, login lockout); no tokens are exposed to JavaScript
  • Every row carries a UserId and every query is scoped to the signed-in user; registering seeds that user's default budget lines
  • Auth endpoints are rate limited per IP (10/minute)
  • The service worker's API cache is dropped on sign-in/out so offline data never crosses accounts
  • The schema is managed by EF Core migrations, applied automatically on startup

API

All routes live under /api and require a signed-in user (except /api/auth/* and /api/health). OpenAPI is served at /openapi/v1.json in development.

Area Routes
Auth POST /auth/register, /auth/login, /auth/logout, /auth/change-password, /auth/fresh-start, /auth/delete-account; GET /auth/me; PUT /auth/settings
Entries CRUD on /entries with ?month=, ?search=, ?categoryId=, ?tag=, ?vendorId=, ?kind=, amount range, and paging; POST /entries/{id}/worth; receipt photos at /entries/{id}/receipt
Categories & vendors CRUD on /categories and /vendors; POST /vendors/{id}/merge/{targetId}
Recurring CRUD on /recurring; POST /recurring/{id}/record for variable items
Savings & debts CRUD on /goals with /goals/{id}/contribute and /goals/set-aside/{month}; CRUD on /debts with /debts/{id}/pay
Challenges CRUD on /challenges with live progress
Summaries /summary/month/{yyyy-MM}, /summary/year/{yyyy}, /summary/review, /summary/patterns
Import & export GET /csv/entries.csv, POST /csv/entries, GET /export (full account JSON), POST /import/propose, /import/profiles
Admin POST /admin/backup, GET /admin/backups, GET/POST /admin/database

Development

Requires the .NET 10 SDK and Node 20+.

# API on http://localhost:5194
cd server && dotnet run --project FinTrackr.Api

# Client on http://localhost:5173 (proxies /api to 5194)
cd client && npm ci && npm run dev

dotnet test server runs the API integration suite (auth, per-user isolation, vendor memory, summaries, imports, coaching features). CI lives in .gitea/workflows/ci.yml (GitHub Actions-compatible): server build + test, client build, and a gated image publish.

Stack

Piece Tech
server/ ASP.NET Core 10 minimal API, EF Core + SQLite, ASP.NET Core Identity
client/ React 19, Vite, TypeScript, Tailwind CSS 4, vite-plugin-pwa
Dockerfile Multi-stage: Node builds the PWA, .NET publishes the API, one runtime image serves both
fintrackr.xml, ca_profile.xml Community Applications template and maintainer profile

Design

The UI follows the design document in design/finance-app-directions.html: an editorial system of light and dark "papers" with configurable accent inks, set in Newsreader. Theme tokens live in client/src/index.css and are applied via data-paper / data-ink attributes; each user's choice syncs to their account.

PWA notes

  • Installable manifest with a "New entry" shortcut; text shared to the app prefills an entry note
  • Workbox service worker: precached shell, network-first API caching for offline reading, and Background Sync replay for entries written offline
  • New builds surface an update bar instead of refreshing silently

Install finTrackr on Unraid in a few clicks.

Find finTrackr in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for finTrackr Review the template variables and paths Click Install

Download Statistics

935
Total Downloads

Related apps

Details

Repository
slummybell/fintrackr:latest
Last Updated2026-07-23
First Seen2026-07-23

Runtime arguments

Web UI
http://[IP]:[PORT:8080]
Network
bridge
Shell
bash
Privileged
false

Template configuration

WebUI PortPorttcp

Host port for the web app and API.

Target
8080
Default
8080
Value
8080
DataPathrw

Where the SQLite database (fintrackr.db) is stored. Back this folder up.

Target
/data
Default
/mnt/user/appdata/fintrackr
Value
/mnt/user/appdata/fintrackr
TimezoneVariable

Container timezone, used for date handling in logs.

Target
TZ
Default
America/New_York
Value
America/New_York