- Candles: clean grid layout with consistent sizing, no overlapping
- AI moderation: much more lenient prompt - short descriptions,
dates, locations are all valid memorial content
- Fix ReadableStream error by clearing abort timeout after response
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Workspace dir gets recreated each build, losing all data.
Using fixed host path ensures DB and uploads persist across deploys.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Simplified API route matching and added RSC/next-action header passthrough
to prevent 'Failed to find Server Action' errors.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Container starts as root, creates data dirs, chowns to nextjs,
then drops to nextjs user via su-exec.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Admin: User timeline contributions shown in Timeline section
- Admin: User memory contributions shown in Erinnerungen section
- Admin: User photo uploads shown in Familien-Uploads section
- All contributions still appear in unified Beiträge section
- Dockerfile: fix data dir path (/data -> /app/data)
- CI/CD: use checkout@v4, retry health check, auto-create proxy network
- CI/CD: support SITE_PASSWORD/ADMIN_PASSWORD secrets
- CI/CD: use wget instead of curl (alpine compat)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Remove duplicate FamilyUploadSection (PhotoUploadSection already handles this)
- Fix contributions POST: don't require content for timeline/media types
- Save all fields (year, month, day, location, media_filenames) in contributions INSERT
- Add user-uploaded photos from contributions to public photo gallery
- Fix PhotoUploadSection to include title in submission
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Auto-approve: clean submissions now default to 'approved' (not 'pending')
- Switch AI model from qwen3:4b to llama3.2 (qwen3 writes to thinking field, response always empty)
- AI now correctly flags spam, nonsense, and irrelevant content
- Admin: show all contribution types including timeline (was filtering them out)
- Add FamilyUploadSection to public page (was imported but never rendered)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Refs statt State für started/audible Tracking, fadeIn als eigene
stabile Callback-Funktion, kein verschachteltes Promise-Handling mehr.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- MusicPlayer ins Layout verschoben (läuft auf allen Seiten)
- Mobile-Autoplay: Desktop startet stumm + fade-in bei Scroll,
Mobile wartet auf ersten Touch und startet dann mit Fade-In
- Dennis-Perspektive auf eigene Seite /meine-oma ausgelagert,
dezenter Link "Von Dennis" am Ende der Tribute-Sektion
- "Berge von Essen" entfernt
- "Jacky und Niklas" → "ihre Enkelin" / "Meine Schwester"
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- TributeSection: zwei Perspektiven (Familie + Dennis), emotional und persönlich
- MusicPlayer: Autoplay mit stummem Start + Fade-In bei Interaktion, nahtloser
Crossfade-Loop (überspringt stille letzten 10s), kompakter Mute-Button
- Alle API-Routes: export const runtime = 'nodejs' für node:sqlite in Next.js 16
- Admin: defensive res.ok Checks vor .json() Parsing
- DB: mkdirSync erst zur Laufzeit, path.resolve für DATA_DIR
- page.tsx: plain() Helper für null-prototype SQLite-Rows
- erinnerungen.md: alle Familieninfos und Erinnerungen dokumentiert
- Nav: Musik-Tab entfernt, "Über Oma" hinzugefügt
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ambient:
- Replace oscillator drone/melody with singing bowl synthesis
- Each bowl: instant attack + exponential decay (7–12s) = real physical sound
- Two detuned copies per strike for natural shimmer beat
- A-minor pentatonic (A3 C4 D4 E4 G4 A4 C5 E5), weighted toward warm lows
- 30% chance of soft harmonic fifth companion tone per strike
- Random gaps 3–8s between strikes so it breathes naturally
- Two long hall reverb tails (2.4s / 4.8s) for warmth and space
- Graceful 2.5s fade-out on stop
Next.js 16 compatibility (breaking changes from v14→v16):
- Dynamic route params now Promise<{...}> → await params in all handlers
- cookies() now returns Promise → isAdmin() made async, await cookies()
- Files: [...path], memories/[id], media/[id], auth, upload all updated
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Three layers:
1. PAD: Am9 breathing pad (unchanged structure, more varied mid-valley shape)
2. MELODY: slow A-minor cello phrase (A4→Ab4→G4→F4→E4→D4→C4→D4→E4→G4→A4)
- ~45s per cycle, soft attack/release per note
- Vibrato LFO (4.5 Hz, ±4 Hz) for natural voice quality
- Scheduled via AudioContext timing for sample-accurate handoffs
3. DYNAMIC ARC: 60s master gain cycle (0.12 → 0.26 → 0.12) for emotional peaks
- Builds over 18s, peaks at 30s, exhales to 60s
- Repeats → each minute has a distinct emotional shape
Result: sounds like a distant cello line over a soft choir pad, with
emotional crescendos every minute. Not just breathing – actual movement.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Remove CandleSection from page; dates now appear only in hero
- Footer stripped to just quote + impressum/admin links (no name/dates)
- Musik nav link always visible
- MusicPlayer: Web Audio API ambient mode when no tracks uploaded
- A-minor pad (55/110/130/164/220 Hz sine oscillators)
- Feedback delay for spaciousness, per-note LFO swells, 6s fade-in
- "Stille Begleitung" UI with waveform bars
- When tracks are uploaded: full track list + cycle mode as before
- Floating mini-player works for both modes
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
MusicPlayer:
- Beautiful inline section with numbered track list + click-to-play
- Animated waveform bars on playing track
- Time display (elapsed / duration) on progress bar
- Floating mini-player with track name + time, shows after first play
- Play/pause in mini-player, close button
CandleSection:
- 7 hand-coded CSS/Framer Motion candle flames with organic flicker
- Layered flame (outer glow + main + inner core) + wax drip highlight
- "Ruhe in Frieden" text with subtle glow
Impressum:
- New /impressum page with TMG §5 structure (placeholder address)
- Privacy notice (no cookies/tracking, voluntary memory data)
- Copyright, liability disclaimer
- Consistent cream design with Cormorant/Lora typography
page.tsx:
- CandleSection added between VideoGallery and MusicPlayer
- Musik nav link (conditional on tracks)
- Footer Impressum link
- MemorySection wrapped in id="erinnerungen" section for nav anchor
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- HeroSection: animated warmgold/burgundy/indigo orbs on #060304 bg, film grain CSS overlay, larger glowing typography
- WriteSection: new public component – collapsible form (name optional, title, textarea) posts to /api/memories without auth, shows success state and refreshes page
- API: remove isAdmin() guard from POST /api/memories, accept author field
- DB: migration adds author TEXT column to memories (try/catch for existing DBs)
- Types: add author: string | null to Memory type
- MemorySection: display "— [Name]" beneath date when author is set
- globals.css: grain keyframe animation for film-texture overlay
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>