hobby2026Shipped and in daily use

Family Memories

A private scrapbook-style photo timeline where the family scrolls down memory lane, trip by trip.

hobby/2026

Overview

Family Memories is a login-gated site at memories.patrickrobel.dk where the family keeps its vacation photos on one continuous timeline. Scrolling down memory lane moves through the years: sticky handwritten year markers, a spine that fills as you scroll, and each trip rendered as a cluster of tilted polaroids with tape and captions. Every tilt and offset is derived deterministically from the photo's id, so the scrapbook look is stable across visits and renders.

Photos flow in from any family member's phone or laptop: the browser uploads straight to a private Cloudflare R2 bucket through presigned URLs, then the server generates WebP thumbnails with sharp, reads the EXIF capture date and GPS position, and reverse geocodes it to a city label. Photos never become public; an authenticated proxy streams them with immutable caching, so the browser cache still works.

There are no passwords anywhere: family members sign in with passkeys, with email magic links as the fallback, and only allowlisted addresses can register. A MapLibre map shows every trip as a mini polaroid pin, and person filters answer questions like 'everywhere Mum went'. The app runs in Docker on my own Hetzner VPS behind Dokploy and Traefik with push-to-main deploys; photos live in R2 and metadata in Neon Postgres, so the server itself stays stateless.

Highlights

  • Scroll-driven scrapbook timeline: sticky year markers, a growing spine beam, polaroid clusters
  • Deterministic polaroid tilt from photo ids, so server and client always render identically
  • Passwordless family auth: passkeys plus ZeptoMail magic links, allowlist-only signup
  • Direct-to-R2 uploads via presigned URLs; sharp builds WebP thumbnails and a blurhash per photo
  • EXIF dates and GPS place each photo in time and on the map, with city-level reverse geocoding
  • Self-hosted on the Hetzner VPS via Dokploy: Docker build, Traefik TLS, deploy on push to main