GuidoandClaude Opus 5 ca63fef5c4 feat: Doppelte Uebertraege reparieren, nicht nur melden
Das Pruefskript liess die Arbeit beim Nutzer, obwohl die Entscheidung aus der
Datenbank folgt. Das Reparaturskript trifft sie und fuehrt sie aus:

  Beide Konten angebunden   Die Bank liefert beide Seiten selbst. Der Uebertrag
                            wird in die Buchung zurueckverwandelt, aus der er
                            entstand – WELCHE das war, sagt der Eingangs-
                            Eintrag, der auf ihn zeigt. Danach stehen beide
                            Seiten wieder da und lassen sich verbinden.

  Gegenkonto nicht abgerufen  Der Uebertrag ist richtig, die zusaetzliche
                            Buchung ueberzaehlig und wird geloescht. Ihr
                            Eingangs-Eintrag wird verworfen statt geloescht,
                            sonst braechte ihn der naechste Abruf wieder.

Ohne --wirklich passiert nichts, es wird nur gezeigt. Mit --wirklich legt es
zuerst eine Kopie der Datenbank an, ueber die SQLite-Sicherung und nicht als
Dateikopie – sonst fehlte das WAL.

Uebergangen statt geraten wird alles Uneindeutige: von Hand angelegte
Uebertraege, solche ueber zwei Waehrungen, nur einseitig angebundene Paare und
Uebertraege mit Dubletten auf BEIDEN Seiten.

An nachgestellten Daten geprueft: Aus Lohnkonto -1'575 / Revolut 2'250 / Pocket
450 wird -1'575 / 1'125 / 450 – also genau das, was tatsaechlich passiert ist.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-27 11:52:36 +02:00

Certain Finance

Selbstgehostete Finanzverwaltung für Privathaushalte. Budgets, mehrere Konten (EUR und CHF), ein konfigurierbares Dashboard und Import von Kontoauszügen – lauffähig in einem Proxmox-LXC, erreichbar über eine Web-UI hinter dem eigenen Nginx Proxy Manager.

Der interne Codename/Anzeigename steht zentral an einer Stelle (web/src/brand.js, backend/app/branding.py); der Rest ist generisch.

Stack

  • Backend: FastAPI · SQLAlchemy · SQLite · Alembic · argon2 · Server-Sitzungen (Cookie)
  • Frontend: React 18 · Vite · reines JSX · react-i18next (DE/EN) · Inline-SVG-Icons
  • Betrieb: ein systemd-Dienst (uvicorn) liefert API und gebautes Frontend auf einem Port aus

Entwicklung (lokal)

Backend (Terminal 1):

cd backend
python3 -m venv .venv && . .venv/bin/activate   # Python 3.11+
pip install -r requirements.txt
APP_DATA_DIR=./data uvicorn app.main:app --reload --port 8000

Frontend (Terminal 2):

cd web
npm install
npm run dev        # http://localhost:5173  (leitet /api an :8000 weiter)

Beim ersten Start wird ein Admin angelegt (Standard admin / changeme, per APP_ADMIN_USERNAME / APP_ADMIN_PASSWORD änderbar).

Installation im LXC (Proxmox, Debian/Ubuntu)

git clone <repo-url> /opt/certain-finance
cd /opt/certain-finance
sudo ./deploy/install.sh

Danach im Nginx Proxy Manager einen Proxy-Host auf http://<LXC-IP>:<APP_PORT> anlegen (HTTPS via Let's Encrypt). Updates: sudo ./deploy/update.sh.

Details: docs/ARCHITECTURE.md · Fahrplan: docs/ROADMAP.md

S
Description
No description provided
Readme
8.7 MiB
Languages
Python 55.3%
JavaScript 22.8%
Swift 16.3%
CSS 5%
Shell 0.6%