Readme und Agend.md gefüllt
This commit is contained in:
285
AGENTS.md
285
AGENTS.md
@@ -1,54 +1,251 @@
|
|||||||
# AGENTS.md
|
AGENTS.md
|
||||||
|
💍 Wedding App – Agent Specification (Modern UI Edition)
|
||||||
|
1. Project Overview
|
||||||
|
|
||||||
Diese Datei definiert, wie der Coding-Agent in diesem Repository arbeiten soll.
|
A private wedding web app for invited guests. (Link: https://www.svenja-dominic-hochzeit.de/)
|
||||||
|
|
||||||
## Ziel
|
Core goals:
|
||||||
- Schnell, pragmatisch und sauber am Projekt arbeiten.
|
|
||||||
- Änderungen nachvollziehbar halten.
|
|
||||||
- Risiken früh sichtbar machen.
|
|
||||||
|
|
||||||
## Projektkontext
|
password-protected access (event password)
|
||||||
- Projektname: `wedding-app`
|
|
||||||
- Hauptidee:
|
|
||||||
- TODO: Kurz in 2-4 Sätzen beschreiben, was die App lösen soll.
|
|
||||||
- Status:
|
|
||||||
- TODO: MVP / in Entwicklung / produktiv
|
|
||||||
|
|
||||||
## Tech-Stack
|
RSVP + plus-one selection
|
||||||
- Backend: TODO
|
|
||||||
- Frontend: TODO
|
|
||||||
- Datenbank: TODO
|
|
||||||
- Deployment: TODO
|
|
||||||
|
|
||||||
## Arbeitsregeln für den Agenten
|
photo upload + shared gallery
|
||||||
- Erst lesen, dann ändern.
|
|
||||||
- Kleine, gezielte Änderungen statt großer unkontrollierter Umbauten.
|
|
||||||
- Bestehende Patterns im Code respektieren.
|
|
||||||
- Keine destruktiven Git-Befehle ohne explizite Freigabe.
|
|
||||||
- Bei Unsicherheit Annahmen klar nennen.
|
|
||||||
|
|
||||||
## Code-Standards
|
modern information pages (schedule, hotels, taxi)
|
||||||
- Lesbarkeit vor Cleverness.
|
|
||||||
- Funktions- und Variablennamen eindeutig wählen.
|
|
||||||
- Kommentare nur dort, wo Logik sonst nicht sofort klar ist.
|
|
||||||
- Keine unnötigen Abhängigkeiten hinzufügen.
|
|
||||||
|
|
||||||
## Tests & Validierung
|
embedded Google Maps location
|
||||||
- Nach Änderungen relevante Tests ausführen.
|
|
||||||
- Wenn keine Tests vorhanden sind:
|
|
||||||
- Mindestens Smoke-Test beschreiben und durchführen.
|
|
||||||
- Bei nicht ausführbaren Tests Grund dokumentieren.
|
|
||||||
|
|
||||||
## Dokumentation
|
external link to the official location website
|
||||||
- README aktuell halten bei:
|
|
||||||
- Setup-Änderungen
|
|
||||||
- neuen Umgebungsvariablen
|
|
||||||
- neuen Commands
|
|
||||||
- Architekturänderungen
|
|
||||||
- Wichtige Entscheidungen kurz als Decision Log festhalten.
|
|
||||||
|
|
||||||
## Decision Log
|
button to switch the language of the webapp from german to english
|
||||||
- YYYY-MM-DD: Entscheidung, Grund, Auswirkung
|
|
||||||
|
|
||||||
## Nächste Schritte (laufend pflegen)
|
visually polished, modern design (mobile-first)
|
||||||
- TODO: wichtigste offene Aufgaben als kurze Liste
|
|
||||||
|
|
||||||
|
|
||||||
|
2. Tech Stack (Required)
|
||||||
|
|
||||||
|
Python 3.12
|
||||||
|
|
||||||
|
Flask
|
||||||
|
|
||||||
|
Gunicorn
|
||||||
|
|
||||||
|
uv (dependency management)
|
||||||
|
|
||||||
|
SQLite
|
||||||
|
|
||||||
|
Docker + Docker Compose
|
||||||
|
|
||||||
|
Frontend approach:
|
||||||
|
|
||||||
|
Use server-rendered templates (Jinja2)
|
||||||
|
|
||||||
|
Use modern CSS (prefer one of the following):
|
||||||
|
|
||||||
|
Tailwind CSS via CDN (fastest)
|
||||||
|
|
||||||
|
or a small handcrafted CSS design system (preferred if no CDN)
|
||||||
|
|
||||||
|
No heavy JS frameworks required.
|
||||||
|
|
||||||
|
3. UI / UX Design Requirements (IMPORTANT)
|
||||||
|
|
||||||
|
The site must look modern, elegant, and “wedding-like”:
|
||||||
|
|
||||||
|
Visual Style
|
||||||
|
|
||||||
|
Clean typography (Google Fonts allowed)
|
||||||
|
|
||||||
|
Soft spacing, rounded cards, subtle shadows
|
||||||
|
|
||||||
|
Consistent color palette (e.g., beige / cream / dark green / gold accents)
|
||||||
|
|
||||||
|
Smooth hover states and transitions
|
||||||
|
|
||||||
|
High-quality hero section on landing page
|
||||||
|
|
||||||
|
Layout
|
||||||
|
|
||||||
|
Mobile-first (works on phones)
|
||||||
|
|
||||||
|
Clear navigation
|
||||||
|
|
||||||
|
Dashboard cards for features (RSVP, Upload, Info)
|
||||||
|
|
||||||
|
Minimal clutter, lots of whitespace
|
||||||
|
|
||||||
|
Pages
|
||||||
|
|
||||||
|
Must implement at least:
|
||||||
|
|
||||||
|
Landing / Login page (with hero design)
|
||||||
|
|
||||||
|
Dashboard
|
||||||
|
|
||||||
|
RSVP page (or dashboard section)
|
||||||
|
|
||||||
|
Upload page
|
||||||
|
|
||||||
|
Gallery page
|
||||||
|
|
||||||
|
Info pages (schedule, hotels, taxi, location)
|
||||||
|
|
||||||
|
4. Location Page Requirements
|
||||||
|
|
||||||
|
Must include:
|
||||||
|
|
||||||
|
Embedded Google Maps iframe
|
||||||
|
|
||||||
|
Address (configurable)
|
||||||
|
|
||||||
|
A prominent button:
|
||||||
|
|
||||||
|
“Zur Location-Webseite” (or “Visit Location Website”)
|
||||||
|
|
||||||
|
open in new tab (target="_blank" rel="noopener")
|
||||||
|
|
||||||
|
The location website URL must be configurable via environment variable:
|
||||||
|
|
||||||
|
LOCATION_WEBSITE_URL
|
||||||
|
|
||||||
|
Optionally also:
|
||||||
|
|
||||||
|
LOCATION_NAME
|
||||||
|
|
||||||
|
LOCATION_ADDRESS
|
||||||
|
|
||||||
|
GOOGLE_MAPS_EMBED_URL
|
||||||
|
|
||||||
|
5. Authentication Requirements
|
||||||
|
|
||||||
|
Registration/login requires event password
|
||||||
|
|
||||||
|
Event password stored in environment variable:
|
||||||
|
|
||||||
|
EVENT_PASSWORD
|
||||||
|
|
||||||
|
Guest provides:
|
||||||
|
|
||||||
|
event password
|
||||||
|
|
||||||
|
guest name
|
||||||
|
|
||||||
|
Use Flask sessions
|
||||||
|
|
||||||
|
Keep it simple (no email verification, no roles)
|
||||||
|
|
||||||
|
6. Database Schema (Minimum)
|
||||||
|
|
||||||
|
Table: guests
|
||||||
|
|
||||||
|
id (PK)
|
||||||
|
|
||||||
|
name (required)
|
||||||
|
|
||||||
|
attending (boolean, nullable)
|
||||||
|
|
||||||
|
plus_one (boolean, default False)
|
||||||
|
|
||||||
|
created_at (timestamp)
|
||||||
|
|
||||||
|
Table: uploads
|
||||||
|
|
||||||
|
id (PK)
|
||||||
|
|
||||||
|
filename
|
||||||
|
|
||||||
|
uploaded_by (guest id)
|
||||||
|
|
||||||
|
uploaded_at (timestamp)
|
||||||
|
|
||||||
|
SQLite is sufficient.
|
||||||
|
|
||||||
|
7. RSVP Logic
|
||||||
|
|
||||||
|
In the UI:
|
||||||
|
|
||||||
|
guest selects attending Yes/No
|
||||||
|
|
||||||
|
plus_one option only shown if attending Yes
|
||||||
|
|
||||||
|
persist to database
|
||||||
|
|
||||||
|
8. Upload Requirements
|
||||||
|
|
||||||
|
allowed types: jpg, jpeg, png
|
||||||
|
|
||||||
|
configurable max upload size
|
||||||
|
|
||||||
|
sanitize filenames
|
||||||
|
|
||||||
|
prevent path traversal
|
||||||
|
|
||||||
|
store in /uploads
|
||||||
|
|
||||||
|
store upload reference in DB
|
||||||
|
|
||||||
|
9. Gallery Requirements
|
||||||
|
|
||||||
|
all guests can view uploaded images
|
||||||
|
|
||||||
|
show thumbnails in a responsive grid
|
||||||
|
|
||||||
|
click opens a larger view (simple modal or dedicated page)
|
||||||
|
|
||||||
|
10. Dependency Management Rules
|
||||||
|
|
||||||
|
Use uv
|
||||||
|
|
||||||
|
Dependencies defined in pyproject.toml
|
||||||
|
|
||||||
|
Commit uv.lock
|
||||||
|
|
||||||
|
No requirements.txt
|
||||||
|
|
||||||
|
In Docker:
|
||||||
|
|
||||||
|
uv sync --frozen --no-dev
|
||||||
|
|
||||||
|
11. Docker Requirements
|
||||||
|
|
||||||
|
Dockerfile must:
|
||||||
|
|
||||||
|
Base: python:3.12-slim
|
||||||
|
|
||||||
|
Install uv
|
||||||
|
|
||||||
|
Copy pyproject.toml + uv.lock first (cache-friendly)
|
||||||
|
|
||||||
|
Run uv sync --frozen --no-dev
|
||||||
|
|
||||||
|
Start with:
|
||||||
|
|
||||||
|
uv run gunicorn -b 0.0.0.0:8000 app:app
|
||||||
|
|
||||||
|
Uploads + SQLite database must be persistent via volumes.
|
||||||
|
|
||||||
|
12. Non-Goals (Do NOT implement)
|
||||||
|
|
||||||
|
Admin dashboards
|
||||||
|
|
||||||
|
Email systems
|
||||||
|
|
||||||
|
Payments
|
||||||
|
|
||||||
|
OAuth
|
||||||
|
|
||||||
|
External cloud storage
|
||||||
|
|
||||||
|
Microservices
|
||||||
|
|
||||||
|
13. Design Philosophy
|
||||||
|
|
||||||
|
Aesthetic first, but not overengineered
|
||||||
|
|
||||||
|
Simple, maintainable code
|
||||||
|
|
||||||
|
Minimal dependencies
|
||||||
|
|
||||||
|
Good UX on mobile
|
||||||
298
README.md
298
README.md
@@ -0,0 +1,298 @@
|
|||||||
|
💍 Wedding App – Svenja & Dominic
|
||||||
|
|
||||||
|
Eine private, moderne Hochzeits-Webanwendung für eingeladene Gäste.
|
||||||
|
|
||||||
|
Die Anwendung ermöglicht eine geschützte Registrierung, RSVP-Verwaltung, Foto-Uploads sowie den Zugriff auf alle relevanten Informationen rund um die Hochzeit – in einem eleganten, mobilen Design.
|
||||||
|
|
||||||
|
🎯 Projektziel
|
||||||
|
|
||||||
|
Die Wedding-App soll:
|
||||||
|
|
||||||
|
unter dem Link https://www.svenja-dominic-hochzeit.de/ zum login führen.
|
||||||
|
|
||||||
|
Gästen einen passwortgeschützten Zugang bieten
|
||||||
|
|
||||||
|
Zu- und Absagen verwalten (inkl. Begleitperson)
|
||||||
|
|
||||||
|
eine gemeinsame Fotogalerie bereitstellen
|
||||||
|
|
||||||
|
Informationen zur Location, Hotels in der Nähe, Taxi und Ablauf anzeigen
|
||||||
|
|
||||||
|
eine eingebettete Google Maps Karte enthalten
|
||||||
|
|
||||||
|
einen prominenten Link zur offiziellen Website der Hochzeitslocation anzeigen
|
||||||
|
|
||||||
|
Einen Switch auf Englisch haben.
|
||||||
|
|
||||||
|
Die Seite soll modern, ästhetisch und mobil optimiert sein.
|
||||||
|
|
||||||
|
🎨 Design-Anforderung (WICHTIG)
|
||||||
|
|
||||||
|
Die Anwendung soll:
|
||||||
|
|
||||||
|
modern, elegant und hochwertig wirken
|
||||||
|
|
||||||
|
mobil-first entwickelt werden
|
||||||
|
|
||||||
|
viel Weißraum verwenden
|
||||||
|
|
||||||
|
runde Karten mit sanften Schatten nutzen
|
||||||
|
|
||||||
|
eine konsistente Farbpalette haben (z. B. Beige, Creme, Dunkelgrün, Gold-Akzente)
|
||||||
|
|
||||||
|
klare Typografie verwenden (z. B. Google Fonts)
|
||||||
|
|
||||||
|
dezente Hover-Animationen besitzen
|
||||||
|
|
||||||
|
Seitenstruktur
|
||||||
|
|
||||||
|
Mindestens folgende Seiten müssen umgesetzt werden:
|
||||||
|
|
||||||
|
Login / Landing Page (mit Hero-Section)
|
||||||
|
|
||||||
|
Dashboard
|
||||||
|
|
||||||
|
RSVP-Bereich
|
||||||
|
|
||||||
|
Upload-Seite
|
||||||
|
|
||||||
|
Galerie
|
||||||
|
|
||||||
|
Informationsseiten:
|
||||||
|
|
||||||
|
Ablauf
|
||||||
|
|
||||||
|
Hotels
|
||||||
|
|
||||||
|
Taxi
|
||||||
|
|
||||||
|
Location
|
||||||
|
|
||||||
|
🗺 Location-Seite Anforderungen
|
||||||
|
|
||||||
|
Die Location-Seite muss enthalten:
|
||||||
|
|
||||||
|
Google Maps Embed (iframe)
|
||||||
|
|
||||||
|
Name der Location
|
||||||
|
|
||||||
|
Adresse
|
||||||
|
|
||||||
|
Einen deutlich sichtbaren Button:
|
||||||
|
|
||||||
|
„Zur Location-Webseite“
|
||||||
|
|
||||||
|
Dieser Button muss:
|
||||||
|
|
||||||
|
in neuem Tab öffnen (target="_blank")
|
||||||
|
|
||||||
|
rel="noopener" verwenden
|
||||||
|
|
||||||
|
URL aus Environment Variable beziehen
|
||||||
|
|
||||||
|
Konfigurierbare Variablen:
|
||||||
|
|
||||||
|
LOCATION_NAME
|
||||||
|
|
||||||
|
LOCATION_ADDRESS
|
||||||
|
|
||||||
|
LOCATION_WEBSITE_URL
|
||||||
|
|
||||||
|
GOOGLE_MAPS_EMBED_URL
|
||||||
|
|
||||||
|
🔐 Login & Registrierung
|
||||||
|
|
||||||
|
Zugriff nur mit Event-Passwort
|
||||||
|
|
||||||
|
Passwort wird als Environment Variable gespeichert:
|
||||||
|
|
||||||
|
EVENT_PASSWORD
|
||||||
|
|
||||||
|
Registrierung:
|
||||||
|
|
||||||
|
Gast gibt Event-Passwort ein
|
||||||
|
|
||||||
|
Gast gibt seinen Namen ein
|
||||||
|
|
||||||
|
Nach erfolgreicher Prüfung → Weiterleitung zum Dashboard
|
||||||
|
|
||||||
|
Session-basiert (Flask Sessions)
|
||||||
|
|
||||||
|
Keine E-Mail-Verifikation
|
||||||
|
Kein Rollen-System
|
||||||
|
Keine öffentliche Registrierung
|
||||||
|
|
||||||
|
|
||||||
|
📝 RSVP-System
|
||||||
|
|
||||||
|
Im Dashboard kann der Gast auswählen:
|
||||||
|
|
||||||
|
Ich komme
|
||||||
|
|
||||||
|
Ich komme nicht
|
||||||
|
|
||||||
|
Ich bringe eine Begleitperson mit (nur wenn attending = true)
|
||||||
|
|
||||||
|
Daten werden persistent in der Datenbank gespeichert.
|
||||||
|
|
||||||
|
📸 Foto-Upload
|
||||||
|
|
||||||
|
Erlaubte Formate: jpg, jpeg, png
|
||||||
|
|
||||||
|
Dateigröße begrenzen (konfigurierbar)
|
||||||
|
|
||||||
|
Speicherung in /uploads
|
||||||
|
|
||||||
|
Dateinamen müssen sanitisiert werden
|
||||||
|
|
||||||
|
Path Traversal verhindern
|
||||||
|
|
||||||
|
Upload wird in Datenbank referenziert
|
||||||
|
|
||||||
|
🖼 Galerie
|
||||||
|
|
||||||
|
Alle Gäste sehen alle Bilder
|
||||||
|
|
||||||
|
Responsive Grid
|
||||||
|
|
||||||
|
Optional: einfache Modal-Ansicht bei Klick
|
||||||
|
|
||||||
|
🧱 Datenbank (SQLite)
|
||||||
|
Tabelle: guests
|
||||||
|
|
||||||
|
id (Primary Key)
|
||||||
|
|
||||||
|
name (String, required)
|
||||||
|
|
||||||
|
attending (Boolean, nullable)
|
||||||
|
|
||||||
|
plus_one (Boolean, default False)
|
||||||
|
|
||||||
|
created_at (Timestamp)
|
||||||
|
|
||||||
|
Tabelle: uploads
|
||||||
|
|
||||||
|
id (Primary Key)
|
||||||
|
|
||||||
|
filename
|
||||||
|
|
||||||
|
uploaded_by (Guest ID)
|
||||||
|
|
||||||
|
uploaded_at (Timestamp)
|
||||||
|
|
||||||
|
🧪 Entwicklungsphasen
|
||||||
|
Phase 1 – MVP
|
||||||
|
|
||||||
|
Authentifizierung
|
||||||
|
|
||||||
|
Datenbank
|
||||||
|
|
||||||
|
RSVP
|
||||||
|
|
||||||
|
Phase 2
|
||||||
|
|
||||||
|
Upload
|
||||||
|
|
||||||
|
Galerie
|
||||||
|
|
||||||
|
Phase 3
|
||||||
|
|
||||||
|
Informationsseiten
|
||||||
|
|
||||||
|
Location + Google Maps
|
||||||
|
|
||||||
|
Externer Location-Link
|
||||||
|
|
||||||
|
Phase 4
|
||||||
|
|
||||||
|
UI-Feinschliff
|
||||||
|
|
||||||
|
Sicherheitsverbesserungen
|
||||||
|
|
||||||
|
🧰 Technischer Stack
|
||||||
|
|
||||||
|
Python 3.12
|
||||||
|
|
||||||
|
Flask
|
||||||
|
|
||||||
|
Gunicorn
|
||||||
|
|
||||||
|
uv (Dependency Management)
|
||||||
|
|
||||||
|
SQLite
|
||||||
|
|
||||||
|
Docker
|
||||||
|
|
||||||
|
Docker Compose
|
||||||
|
|
||||||
|
Optional: Nginx + Certbot (Production)
|
||||||
|
|
||||||
|
📦 Dependency Management
|
||||||
|
|
||||||
|
Keine requirements.txt
|
||||||
|
|
||||||
|
Nutzung von uv
|
||||||
|
|
||||||
|
Abhängigkeiten in pyproject.toml
|
||||||
|
|
||||||
|
uv.lock wird committed
|
||||||
|
|
||||||
|
Docker nutzt:
|
||||||
|
|
||||||
|
uv sync --frozen --no-dev
|
||||||
|
|
||||||
|
🐳 Docker Anforderungen
|
||||||
|
|
||||||
|
Base Image: python:3.12-slim
|
||||||
|
|
||||||
|
uv im Container installiert
|
||||||
|
|
||||||
|
Gunicorn als Produktionsserver
|
||||||
|
|
||||||
|
Persistente Volumes für:
|
||||||
|
|
||||||
|
uploads
|
||||||
|
|
||||||
|
SQLite-Datenbank
|
||||||
|
|
||||||
|
Startbefehl:
|
||||||
|
|
||||||
|
uv run gunicorn -b 0.0.0.0:8000 app:app
|
||||||
|
|
||||||
|
🔒 Sicherheitsanforderungen
|
||||||
|
|
||||||
|
Event-Passwort darf niemals im Frontend erscheinen
|
||||||
|
|
||||||
|
Upload-Dateitypen validieren
|
||||||
|
|
||||||
|
Dateigröße limitieren
|
||||||
|
|
||||||
|
HTTPS verpflichtend im Produktivbetrieb
|
||||||
|
|
||||||
|
Keine unnötigen Features implementieren
|
||||||
|
|
||||||
|
❌ Nicht-Ziele
|
||||||
|
|
||||||
|
Kein Admin-Panel
|
||||||
|
|
||||||
|
Keine E-Mail-Funktion
|
||||||
|
|
||||||
|
Kein Payment
|
||||||
|
|
||||||
|
Kein OAuth
|
||||||
|
|
||||||
|
Keine Cloud-Storage-Integration
|
||||||
|
|
||||||
|
Keine Microservices
|
||||||
|
|
||||||
|
💡 Design-Philosophie
|
||||||
|
|
||||||
|
Schön vor komplex
|
||||||
|
|
||||||
|
Einfach vor überengineered
|
||||||
|
|
||||||
|
Wartbar vor clever
|
||||||
|
|
||||||
|
Modern, aber nicht verspielt
|
||||||
|
|
||||||
|
Mobil optimiert
|
||||||
Reference in New Issue
Block a user