Die alte Anleitung war nur für iOS, inhaltlich veraltet (kein Hinweis auf
Safari-Pflicht, keine In-App-Browser-Warnung) und lief im mobilen App-Shell-
Layout von base.html - dessen fixe Viewport-Höhe und ausgeblendete Header-
Icons (die zugehörige JS zum Einblenden fehlte auf dieser Seite) passen
nicht zu einer längeren, bebilderten Anleitung.
- Eigenständige, responsive Seite (kein app-shell mehr) - normal scrollbar,
auch auf Desktop sinnvoll lesbar (für geteilte Links)
- iOS (Safari) und Android (Chrome) je mit 3 Schritten, automatische
Erkennung per User-Agent mit manuellem Umschalter, Wahl wird gemerkt
- Warnhinweise: iOS braucht zwingend Safari (In-App-Browser-Falle erwähnt),
Android-Menüpunkt kann je nach Hersteller anders heißen
- Eigene, einfache SVG-Schritt-Icons statt nachgestellter Apple/Google-
Screenshots - ehrlicher als exakte UI vorzutäuschen, und markenrechtlich
unproblematisch
- Bestehende Marke konsistent weitergeführt (Grün/Teal, App-Icon), keine
neue visuelle Sprache - die kommt für die geplante Landingpage
- Kontaktwege (Feedback-Mail, WhatsApp) im Footer wie im Rest der App
Lokal getestet: Django-Check sauber, Rendering per Headless-Chrome-Screenshot
bei 900px (iOS- und Android-Ansicht) geprüft, Content-Struktur bei 500px
Layoutbreite ohne Overflow verifiziert (das Tool in dieser Umgebung erzwingt
intern eine Mindestbreite, echte Handybreiten ließen sich nicht zuverlässig
screenshotten - defensiv trotzdem mit clamp()-Titelgröße und min-width:0 an
den Flex-Textkindern gegen schmale Displays abgesichert). Empfehle echten
Gerätetest.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Nach dem 26.2-Deploy meldete der erste Admin-Login-Versuch "403 Verboten -
CSRF-Verifizierung fehlgeschlagen". Reproduziert: Django-Fehlerseite nannte
den genauen Grund - "Origin checking failed - https://app.piomint.de does
not match any trusted origins."
CSRF_TRUSTED_ORIGINS war nie gesetzt. Solange nichts per HTTPS mit Origin-
Header POSTet wurde, fiel das nicht auf - der neue Dashboard-Login war
offenbar der erste Fall. Fix: CSRF_TRUSTED_ORIGINS = ['https://app.piomint.de'].
Lokal verifiziert (manage.py check), Ursache live gegen app.piomint.de per
curl reproduziert (Origin+Referer-Header gesetzt -> exakt derselbe 403).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Auf dem Server läuft Gunicorn als www-data, Deployment (git pull/migrate)
aber als root. db.sqlite3 lag bisher direkt im Projektordner, den nur root
beschreiben kann - www-data konnte also nie in die DB schreiben (Sessions,
jetzt auch UsageEvent). Naheliegender Fix wäre gewesen, www-data Schreibzugriff
auf den ganzen Projektordner zu geben, das hätte aber auch den Quellcode/.git
für den Webserver-Prozess beschreibbar gemacht - unnötiges Risiko.
Stattdessen: SQLite liegt jetzt in data/db.sqlite3, einem eigenen, isolierten
Verzeichnis (wird von Django automatisch angelegt). Nur dieses eine
Verzeichnis muss www-data gehören, der Rest des Projekts bleibt root-only.
- piomint/settings.py: DATABASES zeigt auf DATA_DIR (BASE_DIR/data), die per
Path.mkdir(exist_ok=True) beim Settings-Import automatisch angelegt wird
- .gitignore: /data/ und db.sqlite3 ergänzt - die echte Datenbank darf nie
ins Repo gelangen (Sessions/User-Daten)
- Alte, ungenutzte db.sqlite3 (leerer Platzhalter) aus dem Repo entfernt
Lokal getestet: frisches migrate legt data/db.sqlite3 automatisch an,
Track-Endpoint und Dashboard-Auth-Schutz funktionieren mit dem neuen Pfad.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bündelt die letzten drei Commits zu einem Release:
- Anonymes Nutzungs-Dashboard für Admins
- Feedback-E-Mail in den Einstellungen
- Optionales Partner-Feld bei Diensteinträgen
- Neue Versions-URL /app/v262/, alle bisherigen Versionen leiten dorthin um
- PWA_APP_START_URL aktualisiert
- STATIC_VERSION auf 26.2 (Cache-Busting für CSS/JS)
- Update-Info-Text für Nutzer geschrieben (Partner-Feld, Feedback-Mail)
- README-Release-Checkliste um Deployment-Schritt ergänzt (Migration/
collectstatic/Gunicorn-Neustart), da jetzt zum ersten Mal ein echtes
Datenmodell existiert
Lokal getestet: kompletter Redirect-Kette (alte Versionen -> v262), v262 lädt,
Cache-Buster in den Asset-URLs, versionnumber im Markup, Track-Endpoint nach
Migration funktionsfähig.
Deployment auf den Server steht noch aus (SSH-Zugriff wird gerade
eingerichtet) - siehe Hinweis im Chat.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Wunsch aus der Community: Name der Person, mit der man zusammen im Dienst
war, zum Eintrag hinterlegen können.
- Neues Textfeld "Partner" (optional, max. 30 Zeichen) in Neuer-Eintrag- und
Bearbeiten-Modal, direkt unter dem Datum
- Wird als partner-Feld im IndexedDB-Eintrag gespeichert
- Aktivitäten-Tabelle zeigt "mit <Partner>" klein unter dem Typ an, wenn
angegeben
- Bearbeiten-Formular wird beim Öffnen korrekt mit dem gespeicherten Partner
vorbefüllt
Lokal getestet: Felder rendern in beiden Modals, Django-Check sauber.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Es gab noch keine hinterlegte Support-Adresse im Code. Neuer Kontakt-Eintrag
"Feedback / Fehler melden" (mailto:app-feedback@zielke.studio, Betreff
vorausgefüllt) direkt neben dem WhatsApp-Community-Link in den Einstellungen.
README entsprechend ergänzt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Neues Modell UsageEvent (device_id, Plattform/Browser aus User-Agent
serverseitig geparst, Standalone-Flag, Zeitstempel) - komplett anonym,
device_id ist eine zufällige, nur lokal im Browser gespeicherte ID
- POST /app/track/: nimmt ein Nutzungssignal entgegen (max. 1x pro Gerät/Tag,
siehe home01.js: pingUsageIfNeeded())
- GET /app/dashboard/: Übersicht für Admins (staff_member_required, nutzt
bestehenden Django-Admin-Login) - Geräte heute/7/30 Tage, Plattform- und
Browser-Verteilung, Standalone-Quote, letzte Signale
- UsageEvent zusätzlich im normalen Django-Admin registriert
- Migration bewusst nicht mitcommittet (Projekt-Konvention, siehe .gitignore) -
muss auf jedem Environment einmalig per `manage.py makemigrations app &&
manage.py migrate` erzeugt werden
Lokal getestet: Track-Endpoint, Dashboard-Rendering mit Testdaten, Admin-Login-
Schutz (unauthenticated -> 302), Django-Admin-Listing.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>