README

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>