Pinke
Personal finance tracker for importing, categorizing, and visualizing bank transactions.
Tech Stack
FastAPI • Jinja2 • Polars • SQLite • HTMX • Tailwind • DaisyUI
Quick Start
uv sync
make
# Open http://localhost:8000
See docs/quick-start.md for full setup.
Agent Workflows
The .agent/workflows/ directory contains step-by-step procedures for AI agents:
| Workflow | Command | Description |
|---|---|---|
| start-and-test.md | /start-and-test |
Start server, upload data, test all pages |
Invoke with slash commands (e.g., /start-and-test) to run the workflow.
Documentation
| Doc | Description |
|---|---|
| architecture.md | System overview & components |
| structure.md | Codebase layout |
| api-endpoints.md | HTTP routes |
| database-schema.md | SQLite tables |
| workflow.md | Data pipeline |
| rules.md | Categorization rules |
Features
- Import: CSV/PDF bank statements (DKB, Revolut, etc.)
- Categorize: Rules-based + ML classification
- Visualize: Charts, balance predictions, spending analysis
Internationalization (i18n)
Pinke supports multiple languages. Currently: English (default), German.
Switching Language
Set the locale cookie to en or de, or use the language switcher in the UI.
Translation Workflow
# Extract new strings from templates
uv run pybabel extract -F translations/babel.cfg -o translations/messages.pot .
# Update existing translations
uv run pybabel update -i translations/messages.pot -d translations
# Compile translations (required after editing .po files)
uv run pybabel compile -d translations
Translation files are in translations/<locale>/LC_MESSAGES/messages.po.
Todo Overview
See docs/task-catalog.md for detailed tasks.
Priority
- Colors in balancing [2]
- Inflow/Outflow stats not reflecting filters [3]
Rules
- 80/20 rule analysis [3]
- Automatic rule suggestions [4]
- Rule UX overhaul [4]
Enhancements
- Style guide documentation [2]
- Table improvements [2]
- App branding & PWA [2]
Infrastructure
- S3 storage backend migration [4]
Balance Prediction
The /visualize/balance page supports configurable prediction:
| Param | Default | Description |
|---|---|---|
use_exponential_decay |
1 | Smooth exponential decay vs step function |
filter_outliers |
1 | Remove 3σ outliers |
decay_half_life_days |
45 | Days until weight halves |
outlier_threshold |
3.0 | Std devs for outlier |
min_support |
3 | Min data points per day-of-month |
for minfest app icon https://maskable.app/editor
<p class="">
<strong>1. Export your data from the bank.</strong><br />
On your online banking, export your transactions for a time range (for
example 01.01.2025–31.12.2025) as CSV, PDF, or Excel. One file per
account is perfect.
</p>
<p class="">
<strong>2. Upload the file to Pinke.</strong><br />
Pinke reads the file, normalizes the data, and adds categories,
subcategories, and recurring payments based on patterns in payees,
IBANs, amounts, and your existing rules.
</p>
<p class="">
<strong>3. Explore and visualize.</strong><br />
In the “visualize” view you can filter, zoom in on specific months or
categories, and investigate where money goes. You can compare fixed
costs vs. variable spending, or focus on specific topics like
mobility, subscriptions, or groceries.
</p>
<p class="">
<strong>4. Improve categories with your own rules.</strong><br />
If a transaction is missing a category or is not recognized correctly,
you can add your own rules (for example based on payee, IBAN, or text)
and run the analysis again. Over time Pinke should learn more bank
formats and identify more categories “automagically”.
</p>
<p class="">
<strong>5. Extend with reports.</strong><br />
The idea is to grow from “nice overview” to “useful reports”: for
example all childcare costs for a year, all recurring contracts, or
everything relevant for your tax declaration. If there’s a report you
would love to have, let me know via feedback.
</p>