Neue Features>: zu viele um sie zu beschrieben :D
This commit is contained in:
376
AGENTS.md
376
AGENTS.md
@@ -1,8 +1,17 @@
|
||||
AGENTS.md
|
||||
💍 Wedding App – Agent Specification (Modern UI Edition)
|
||||
💍 AGENTS.md
|
||||
|
||||
Wedding App – Agent Specification (Hero + Secure Edition)
|
||||
|
||||
1. Project Overview
|
||||
|
||||
A private wedding web app for invited guests. (Link: https://www.svenja-dominic-hochzeit.de/)
|
||||
A private wedding web application for invited guests.
|
||||
|
||||
Production URL:
|
||||
|
||||
https://www.svenja-dominic-hochzeit.de/
|
||||
|
||||
The entire platform is protected by login.
|
||||
There is no public content accessible without authentication.
|
||||
|
||||
Core goals:
|
||||
|
||||
@@ -12,115 +21,190 @@ RSVP + plus-one selection
|
||||
|
||||
photo upload + shared gallery
|
||||
|
||||
modern information pages (schedule, hotels, taxi)
|
||||
modern information pages (schedule, hotels, taxi, location)
|
||||
|
||||
embedded Google Maps location
|
||||
embedded Google Maps (2-click solution)
|
||||
|
||||
external link to the official location website
|
||||
external link to official location website
|
||||
|
||||
button to switch the language of the webapp from german to english
|
||||
language switch (German / English)
|
||||
|
||||
visually polished, modern design (mobile-first)
|
||||
visually polished, modern, mobile-first UI
|
||||
|
||||
2. Access Model (IMPORTANT)
|
||||
|
||||
The entire site must be login-protected.
|
||||
|
||||
2. Tech Stack (Required)
|
||||
No publicly accessible landing page.
|
||||
|
||||
Python 3.12
|
||||
Flow:
|
||||
|
||||
Flask
|
||||
User visits root URL → redirected to login
|
||||
|
||||
Gunicorn
|
||||
User enters:
|
||||
|
||||
uv (dependency management)
|
||||
event password
|
||||
|
||||
SQLite
|
||||
guest name
|
||||
|
||||
Docker + Docker Compose
|
||||
On success:
|
||||
|
||||
Frontend approach:
|
||||
guest stored in database (if new)
|
||||
|
||||
Use server-rendered templates (Jinja2)
|
||||
session created
|
||||
|
||||
Use modern CSS (prefer one of the following):
|
||||
redirect to internal start page
|
||||
|
||||
Tailwind CSS via CDN (fastest)
|
||||
All internal routes must require authentication.
|
||||
|
||||
or a small handcrafted CSS design system (preferred if no CDN)
|
||||
3. Internal Start Page Structure (Hero + Dashboard Concept)
|
||||
|
||||
No heavy JS frameworks required.
|
||||
After login, the start page consists of two sections:
|
||||
|
||||
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
|
||||
Section 1 – Hero Area (Emotional Welcome)
|
||||
|
||||
Must include:
|
||||
|
||||
Embedded Google Maps iframe
|
||||
large background image
|
||||
|
||||
Address (configurable)
|
||||
headline:
|
||||
“Willkommen zu unserer Hochzeit”
|
||||
|
||||
A prominent button:
|
||||
wedding date
|
||||
|
||||
“Zur Location-Webseite” (or “Visit Location Website”)
|
||||
short personal text
|
||||
|
||||
open in new tab (target="_blank" rel="noopener")
|
||||
smooth scroll transition to dashboard
|
||||
|
||||
The location website URL must be configurable via environment variable:
|
||||
Purpose:
|
||||
Make the platform feel emotional and elegant, not like a business app.
|
||||
|
||||
LOCATION_WEBSITE_URL
|
||||
Section 2 – Dashboard Area
|
||||
|
||||
Optionally also:
|
||||
Below the hero section:
|
||||
|
||||
Card-based grid layout containing:
|
||||
|
||||
RSVP
|
||||
|
||||
Upload
|
||||
|
||||
Gallery
|
||||
|
||||
Ablauf (Schedule)
|
||||
|
||||
Hotels
|
||||
|
||||
Taxi
|
||||
|
||||
Location
|
||||
|
||||
The dashboard must:
|
||||
|
||||
use rounded cards
|
||||
|
||||
soft shadows
|
||||
|
||||
consistent spacing
|
||||
|
||||
mobile-first responsive layout
|
||||
|
||||
4. Tech Stack (Required)
|
||||
|
||||
Python 3.12
|
||||
Flask
|
||||
Gunicorn
|
||||
uv (dependency management)
|
||||
SQLite
|
||||
Docker + Docker Compose
|
||||
|
||||
Frontend:
|
||||
|
||||
Jinja2 templates
|
||||
|
||||
Tailwind via CDN OR lightweight custom CSS
|
||||
|
||||
No heavy JS frameworks
|
||||
|
||||
Minimal JavaScript only where needed
|
||||
|
||||
5. UI / UX Requirements (Very Important)
|
||||
|
||||
Visual style:
|
||||
|
||||
elegant and modern
|
||||
|
||||
wedding-like aesthetic
|
||||
|
||||
soft spacing
|
||||
|
||||
rounded elements
|
||||
|
||||
subtle shadows
|
||||
|
||||
warm color palette (cream / beige / dark green / gold accents)
|
||||
|
||||
clean typography (Google Fonts allowed)
|
||||
|
||||
Mobile-first design required.
|
||||
|
||||
Minimal clutter.
|
||||
|
||||
Smooth hover transitions.
|
||||
|
||||
6. Language Switch (DE / EN)
|
||||
|
||||
Must include:
|
||||
|
||||
language toggle in header
|
||||
|
||||
switch stored in session
|
||||
|
||||
no automatic geo-detection
|
||||
|
||||
static text controlled via simple translation dictionary or structure
|
||||
|
||||
7. Location Page Requirements
|
||||
|
||||
Must include:
|
||||
|
||||
Location name (env variable)
|
||||
|
||||
Address (env variable)
|
||||
|
||||
Google Maps embed (iframe)
|
||||
|
||||
Prominent button:
|
||||
|
||||
“Zur Location-Webseite” / “Visit Location Website”
|
||||
|
||||
target="_blank"
|
||||
|
||||
rel="noopener"
|
||||
|
||||
Environment variables:
|
||||
|
||||
LOCATION_NAME
|
||||
|
||||
LOCATION_ADDRESS
|
||||
|
||||
LOCATION_WEBSITE_URL
|
||||
GOOGLE_MAPS_EMBED_URL
|
||||
|
||||
5. Authentication Requirements
|
||||
Google Maps Privacy Requirement
|
||||
|
||||
Registration/login requires event password
|
||||
Google Maps must NOT load automatically.
|
||||
|
||||
Implement a 2-click solution:
|
||||
|
||||
Show placeholder container
|
||||
|
||||
Display privacy notice:
|
||||
“Zur Anzeige der Karte werden Daten an Google übertragen.”
|
||||
|
||||
Only after user click → load iframe dynamically
|
||||
|
||||
No global cookie banner required.
|
||||
|
||||
8. Authentication Requirements
|
||||
|
||||
Event password stored in environment variable:
|
||||
|
||||
@@ -130,13 +214,19 @@ Guest provides:
|
||||
|
||||
event password
|
||||
|
||||
guest name
|
||||
name
|
||||
|
||||
Use Flask sessions
|
||||
Use Flask sessions.
|
||||
|
||||
Keep it simple (no email verification, no roles)
|
||||
No:
|
||||
|
||||
6. Database Schema (Minimum)
|
||||
email verification
|
||||
|
||||
role system
|
||||
|
||||
admin panel
|
||||
|
||||
9. Database Schema
|
||||
|
||||
Table: guests
|
||||
|
||||
@@ -160,92 +250,142 @@ uploaded_by (guest id)
|
||||
|
||||
uploaded_at (timestamp)
|
||||
|
||||
SQLite is sufficient.
|
||||
SQLite only.
|
||||
|
||||
7. RSVP Logic
|
||||
10. RSVP Logic
|
||||
|
||||
In the UI:
|
||||
Guest selects:
|
||||
|
||||
guest selects attending Yes/No
|
||||
attending Yes / No
|
||||
|
||||
plus_one option only shown if attending Yes
|
||||
plus_one only visible if attending Yes
|
||||
|
||||
persist to database
|
||||
Persist to database.
|
||||
|
||||
8. Upload Requirements
|
||||
11. Upload Requirements
|
||||
|
||||
allowed types: jpg, jpeg, png
|
||||
Allowed types:
|
||||
|
||||
configurable max upload size
|
||||
jpg
|
||||
jpeg
|
||||
png
|
||||
|
||||
Must:
|
||||
|
||||
validate file extension
|
||||
|
||||
validate MIME type
|
||||
|
||||
limit file size (configurable)
|
||||
|
||||
sanitize filenames
|
||||
|
||||
prevent path traversal
|
||||
|
||||
store in /uploads
|
||||
store files in /uploads
|
||||
|
||||
store upload reference in DB
|
||||
store reference in database
|
||||
|
||||
9. Gallery Requirements
|
||||
Optional but recommended:
|
||||
|
||||
all guests can view uploaded images
|
||||
remove EXIF metadata before saving
|
||||
|
||||
show thumbnails in a responsive grid
|
||||
12. Gallery Requirements
|
||||
|
||||
click opens a larger view (simple modal or dedicated page)
|
||||
All guests see all images
|
||||
|
||||
10. Dependency Management Rules
|
||||
Responsive grid layout
|
||||
|
||||
Use uv
|
||||
Click → larger view (simple modal)
|
||||
|
||||
Dependencies defined in pyproject.toml
|
||||
No download tracking
|
||||
|
||||
Commit uv.lock
|
||||
13. Legal Pages (Important)
|
||||
|
||||
No requirements.txt
|
||||
Must implement:
|
||||
|
||||
In Docker:
|
||||
/datenschutz
|
||||
|
||||
/impressum
|
||||
|
||||
Both:
|
||||
|
||||
accessible without login (legal requirement)
|
||||
|
||||
linked in footer
|
||||
|
||||
always visible in footer
|
||||
|
||||
No cookie banner required because:
|
||||
|
||||
only technically necessary session cookies used
|
||||
|
||||
Google Maps loaded via 2-click solution
|
||||
|
||||
14. Dependency Management Rules
|
||||
|
||||
Use uv.
|
||||
|
||||
Dependencies defined in:
|
||||
|
||||
pyproject.toml
|
||||
|
||||
Commit:
|
||||
|
||||
uv.lock
|
||||
|
||||
No requirements.txt allowed.
|
||||
|
||||
Docker must run:
|
||||
|
||||
uv sync --frozen --no-dev
|
||||
|
||||
11. Docker Requirements
|
||||
15. Docker Requirements
|
||||
|
||||
Dockerfile must:
|
||||
Base image:
|
||||
|
||||
Base: python:3.12-slim
|
||||
python:3.12-slim
|
||||
|
||||
Install uv
|
||||
Must:
|
||||
|
||||
Copy pyproject.toml + uv.lock first (cache-friendly)
|
||||
install uv
|
||||
|
||||
Run uv sync --frozen --no-dev
|
||||
copy pyproject.toml + uv.lock first (cache optimization)
|
||||
|
||||
Start with:
|
||||
run uv sync --frozen --no-dev
|
||||
|
||||
expose port 8000
|
||||
|
||||
start with:
|
||||
|
||||
uv run gunicorn -b 0.0.0.0:8000 app:app
|
||||
|
||||
Uploads + SQLite database must be persistent via volumes.
|
||||
Uploads + SQLite database must use persistent volumes.
|
||||
|
||||
12. Non-Goals (Do NOT implement)
|
||||
16. Non-Goals (Strict)
|
||||
|
||||
Do NOT implement:
|
||||
|
||||
Admin dashboards
|
||||
|
||||
Email systems
|
||||
|
||||
Payments
|
||||
Payment systems
|
||||
|
||||
OAuth
|
||||
|
||||
External cloud storage
|
||||
Cloud storage
|
||||
|
||||
Microservices
|
||||
|
||||
13. Design Philosophy
|
||||
Tracking tools
|
||||
|
||||
Aesthetic first, but not overengineered
|
||||
Analytics tools
|
||||
|
||||
Simple, maintainable code
|
||||
17. Design Philosophy
|
||||
|
||||
Minimal dependencies
|
||||
|
||||
Good UX on mobile
|
||||
Aesthetic first, but not overengineered.
|
||||
Simple, maintainable code.
|
||||
Minimal dependencies.
|
||||
Excellent mobile UX.
|
||||
Elegant, but not playful.
|
||||
Reference in New Issue
Block a user