Die Karten lagen in einem Spaltenfluss nebeneinander. Wo etwas landete, hing von der Kartenhoehe ab und nicht vom Thema – man fand nichts wieder, und mit jeder neuen Karte wurde es schlimmer. Jetzt eine Spalte in fester Reihenfolge, daneben eine klebende Leiste mit den Abschnitten: Sie zeigt, wo man gerade ist, und springt auf Klick dorthin. Die Leiste wird aus derselben Liste gebaut wie die Abschnitte, damit kein Punkt ins Leere zeigen kann. /settings#bankanbindung fuehrt direkt zum Abschnitt; die Rueckkehr von der Bank nutzt das. Drei Dinge, die beim Nachmessen auffielen und sonst kaputt gewesen waeren: - Ein Klick setzt die Marke selbst. Ein kurzer Abschnitt am Seitenende bringt die Seite ans Ende, und die Seitenende-Regel haette dann einen anderen Punkt markiert als den angeklickten. Eigenes Scrollen hebt die Vorauswahl auf. - Bei "Bewegung reduzieren" wird nicht sanft gescrollt: Der Browser fuehrt einen sanften Bildlauf dann gar nicht aus, der Sprung ginge ins Leere. - Unter 760 px klebt die Abschnittsleiste nicht, weil dort die Hauptnavigation selbst die obere Leiste ist und sie verdeckt haette. Und die Spalten- Anordnung braucht align-items: stretch, sonst presst das flex-start von oben den Inhalt auf seine Inhaltsbreite statt auf die volle. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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