Zoomen war das falsche Werkzeug. Man konnte nur naeher heran, aber nicht sagen, WAS man behalten will – und das Ergebnis war immer quadratisch, auch wenn das Logo breit ist. Jetzt liegt ein Rahmen auf dem Bild: ziehen zum Verschieben, acht Griffe zum Aufziehen. Aussen abgedunkelt, Drittel-Linien zum Ausrichten, und darunter steht, wie gross der Ausschnitt gerade ist. "Ganzes Bild" setzt zurueck. Das Seitenverhaeltnis des Ausschnitts bleibt. Ein breites Logo wird ein breites Logo, kein quadratisches mit Luft an den Seiten. Der Ausschnitt wird in BILDPUNKTEN gefuehrt, nicht in Bildschirmpunkten – umgerechnet wird nur fuer die Anzeige. So trifft das Ergebnis genau den Bereich im Rahmen, ohne dass sich ueber viele Zieh-Bewegungen Rundungsfehler aufaddieren. Am Bildrand haelt die gegenueberliegende Kante still, statt dass der Rahmen beim Anschlag mitwandert; zieht man einen Griff ueber die eigene Kante hinaus, bleibt sie stehen, statt sich umzustuelpen. Auf dem Telefon sind die Griffe groesser – mit dem Finger waeren vierzehn Pixel nicht zu treffen. 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