Self-hosted · Open Format · Docker-ready
— where your memories stay yours.
A personal photo journal for any NAS with Docker — Synology, TrueNAS, unRAID, Raspberry Pi or Linux server. Photos, videos, text, maps, GPS tours, audio — arranged your way. No cloud, no algorithms, no lock-in.
mpd-demo · Passwort mpd-demo
What it does
A complete diary platform with over thirty integrated features — editor, lightbox, statistics, search, memories, GPS tours, AI writing assistance, and more. All on your own NAS.
Group A · Core & Storytelling
Intersperse text blocks between photos in any order. Author-defined sequence — never algorithmic. Four text styles: default, description, quote, private/hidden.
Justified grid layout that flows naturally. No forced squares, no cropping. Every photo at its natural ratio in perfect rows.
Photos, videos, text, separators, interactive maps, GPX tours, audio and documents — all composable within one album. Not just a photo gallery.
Rearrange any element in-place with drag & drop. 50-step undo/redo history. Debounced auto-save every 2 seconds. Every save creates a timestamped album backup (10 retained).
Admin, editor, viewer, demo roles. Shared space for the family, personal space per user with private albums. Argon2-hashed passwords, rate-limiting, restart-robust SQLite sessions.
Photo Diary Exchange v1.3: plain JSON, human-readable, future-proof. Validated server-side, restorable from automatic backups. No vendor lock-in, ever.
Runs in a single Docker container — on Synology, TrueNAS, unRAID, QNAP, Raspberry Pi or any Linux server. Access through any browser, tablet, or the Android APK. No cloud, no account, no Play Store.
Group B · Photo Tools
Full-screen viewer with double-tap zoom, pan, slideshow mode, keyboard navigation (←→ Esc Z I D). Touch gestures on tablet. BlurHash placeholders while loading.
Rotate, flip, crop, straighten with auto-crop, brightness, contrast, saturation. Every edit creates a 5-level rolling backup (.bak … .bak4) — reset with one click, any time.
Fix missing or wrong dates. Correct GPS coordinates after the fact. Date input validates against DateTimeOriginal. Optional simultaneous ISO filename rename based on the new date.
Rename chaotic IMG_1234.JPG to sortable YYYY-MM-DD_HH-MM-SS.jpg — from EXIF date or manual input. Dry-run preview first. album.json is automatically updated.
GPS is read from EXIF and shown on an interactive OpenStreetMap. Insert whole map elements with multiple pins and geodesic great-circle lines between locations.
Play MP4, MOV, MKV, WebM with HTTP range streaming. Thumbnails via Pillow — falls back to FFmpeg first-frame extraction. Audio: MP3, M4A, FLAC, OGG as album elements.
Three on-demand thumbnail sizes (100 / 400 / 1024px) in WebP, cached outside the photo tree. BlurHash 4×3 component placeholders keep scrolling smooth on slow connections.
See every photo, audio or document file that lives in the album folder but isn't yet referenced in album.json — then assign or delete, cleanly.
Group C · Modules
Full-text search across albums, text blocks and metadata. Umlaut-normalized (ä→ae, ö→oe, ü→ue, ß→ss), prefix-matching, keyword-highlighted, context preview with surrounding photos. Ctrl+K anywhere.
Eight interactive Chart.js dashboards: photos per year / month / weekday / hour, seasons, ~60 recognised devices, GPS heatmap, storage timeline. Two-tier cache, incremental background scan, persistent geo-cache.
Embed a GPX track as an album element. Leaflet maps with geodesic lines. Parses distance, duration, average & peak heart rate from the GPX description — imports from Huawei Health and Komoot.
A standalone gallery of every GPX track on the NAS, sortable by sport type (cycle, hike, run, walk). Browse all your outdoor history on one Leaflet map, independent of albums.
"Today, years ago" — daily ntfy push notification with Polaroid-style memories grouped by year. Android WebView APK, token-based auth, reverse geocoding shows the city under every photo.
Optional AI writing assistant powered by Anthropic Claude Haiku. Offers three stylistic variations of text you wrote — never invents facts, places or feelings. Photos and GPS never leave your NAS.
Dark, Light, Sepia, Nordic, Sunset — all via one CSS data-theme switch, persisted in localStorage. DE/EN UI language. Keyboard-first operation throughout the app.
Why we built this
"Every platform organizes your memories for you. My Photo Diary lets you do it yourself."
A diary is something you build by hand. You pick the order, you write the words. The album is a journal, not a feed.
Your photos and GPS data stay on your hardware. No face recognition, no tracking, no cloud. Open PDX format — no vendor lock-in.
The Write-Companion is optional — one button in the text editor, text only, never photos or GPS.
Honest scope
Every morning your NAS checks which photos were taken on this exact day in previous years. A push notification arrives on your phone. You tap — and your memories appear.
Grouped by year in warm Polaroid style. Up to 5 random photos per year — different every time. Location shown below each photo via OpenStreetMap.
Not everyone finds it easy to turn a handful of photos into a written memory. Some readers have writing blocks, dyslexia, or simply stare at an empty text block without knowing where to start. Refusing modern AI out of stubbornness would leave those readers behind.
The Write-Companion is a single button inside the text editor. You type a rough draft — it offers three polished variations that keep your voice, your facts, your tone. Grammar, flow, rhythm. Nothing more.
Where we are
Active development. Here's what's done and what's coming.
Justified grid, lightbox, EXIF, GPS, drag & drop, text blocks, separators, audio, documents.
Own user database with Argon2 passwords and restart-robust SQLite sessions. Roles: admin, editor, viewer, demo. Per-user personal spaces. Login rate-limiting.
8 element types: photo, video, text, separator, tour, document, audio, map. Open, stable, human-readable.
Single container, volume-mounts for photos and cache. Runs on Synology, TrueNAS, unRAID, QNAP, Raspberry Pi, NUC — anywhere Docker runs.
Swipe navigation, pinch-to-zoom in view mode. Optimized for tablet.
Portainer template, unRAID Community App, Synology SPK, QNAP QPKG — no terminal required, pick your platform.
Full-text search with umlaut normalization, prefix matching, and keyword highlighting.
EXIF statistics, device timeline, geo heatmap with Maptiler reverse geocoding.
"Today, years ago" — daily push notifications with your memories in Polaroid style.
Standalone GPX gallery with Leaflet map and sport-type filtering. Separate from album-embedded tours.
Optional Anthropic Claude Haiku integration for stylistic text variations. Text-only, opt-in, privacy-preserving.
Your device
Scan the QR code or tap the button to download the APK directly from your NAS. No Play Store, no account.
Open MPD in Safari, then add it to your home screen — it works like a native app.
On the road
MPD works in your home network without any extra setup. For access from the road there are three well-trodden paths — all privacy-preserving, none of them put your photos into someone else's cloud.
Five-minute setup on NAS and phone. No port forwarding, no domain, no Let’s Encrypt. Your phone behaves as if it were at home — MPD opens over its internal address. Free for up to 100 devices.
Outbound-only connection from your NAS to Cloudflare — no inbound port forwarding needed. Your domain, your subdomain, free tier is generous. HTTPS handled automatically.
Domain + DynDNS + Let’s Encrypt. Synology DSM and QNAP have this in their UI — one dialog each. Traefik, Caddy or Nginx Proxy Manager on other hosts. The traditional way, still solid.
Whichever path you take: photos, GPS data and metadata never leave your NAS. Tailscale and Cloudflare Tunnel only forward the HTTP traffic of your browser — they don’t see file contents.
Under the hood
Everything here is built on mature, open-source foundations — no proprietary SaaS layers, no telemetry, no phone-home. Run it entirely offline if you want.
Python 3.11, async endpoints, OpenAPI docs built in, sub-second cold start on a modern NAS.
Session tokens hashed with SHA-256 and stored in SQLite — survive container restart. 30-day max-age.
Modern memory-hard password hashing via argon2-cffi. Login rate-limited (5 fails / 5 min / IP → 60 s lockout).
X-Content-Type-Options, X-Frame-Options, Referrer-Policy, Permissions-Policy — all hardened by default.
On-demand 100/400/1024 px WebP thumbnails, cached off-tree. BlurHash 4×3 placeholders avoid content jumps.
Every album save writes a timestamped album.json backup (10 retained). Every photo edit keeps 5 rolling .bak files.
Legacy albums upgrade themselves on first load — capped at 200 photos per request to keep response times snappy.
Per-album .mpd_stats.json + per-space global. Reverse-geocoded coordinates live in a permanent cache that survives invalidations.
One image, volume-mounts for photos & cache. Installable on any Docker host — Synology Container Manager, QNAP Container Station, unRAID, Portainer, docker-compose. No DSM API coupling.
Interactive statistics dashboards and GPS maps built on the de-facto open-source standards, not reinvented wheels.
Video thumbnails are extracted with Pillow first, falling back to FFmpeg for first-frame capture when needed.
Ctrl+K (search), Ctrl+Z / Ctrl+Shift+Z (undo/redo), ← → Esc Z I D in the lightbox. Built for power users.
— where your memories stay yours.
Stay informed
Leave your email and we'll notify you when My Photo Diary launches with one-click installers for your platform.
No spam. One email at launch. That's it.