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. In the browser on every device, as a native app on Android. 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: editor, lightbox, timeline, statistics, search, memories, GPS tours, location history, sharing, an optional writing assistant — and a native Android app. 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, documents and web links — 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.5: plain JSON, human-readable, future-proof. Chapter headings, light markdown, quotes with sources, links, references across albums. 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 native Android app. 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. The Android app zooms into the original tile by tile — sharp down to 1:1.
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.
Your own location history — the replacement for Google Timeline. OwnTracks on the phone records, the MPD server keeps the points: one database per user, nothing leaves your NAS. Day view with stays and routes, places with your own names, heatmap, GPX/GeoJSON export, Google Timeline import. GPX tours stay an album element.
"Today, years ago" — a morning notification straight from your NAS: no ntfy, no Google, no middleman. Six photos per year, chosen by time of day and place, on a Polaroid pinboard. Reverse geocoding shows the town 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. AI touches one text at a time — never your archive, never in the background.
Kachel, Dark, Light, Sepia, Nordic, Sunset, Stack, Honeycomb, Filmstrip — one CSS data-theme switch, persisted in localStorage. DE/EN UI language in the browser and in the app; the app also follows the system dark mode. Keyboard-first operation throughout the web app.
Base package. A chronological stream of everything — photos on the NAS and, in the app, photos still on the phone, each with its backup status. Sort new shots into albums from here; the inbox folder holds what has not been curated yet. Chronological, never algorithmic.
Album links with an expiry date, single-photo links, e-mail via your own SMTP. Contribution links let guests upload to a collection folder without an account — the QR code comes from the app. Links can be revoked at any time.
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 phone's gallery is the moment after the shot; My Photo Diary is everything after that — viewing, finding, arranging, sharing, keeping.
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 — 06:30 by default, the time is set on your server — your NAS checks which photos were taken on this exact day in previous years. The app on your phone gets the notification. You tap — and your memories appear.
Grouped by year in warm Polaroid style. Six photos per year, chosen by time of day and place — the same selection all day, not a random draw. 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.
9 element types: photo, video, text, separator, tour, document, audio, map, link. Headings, light markdown, references across albums. Open, stable, human-readable.
Single container, volume-mounts for photos and cache. Runs on Synology, TrueNAS, unRAID, QNAP, Raspberry Pi, NUC — anywhere Docker runs.
Kotlin/Compose: timeline with camera backup, deep zoom to 1:1, full album editing, share target for any app, German and English.
Synology SPK in progress. Portainer template, unRAID Community App, QNAP QPKG to follow — no terminal required.
Full-text search with umlaut normalization, prefix matching, and keyword highlighting.
EXIF statistics, device timeline, geo heatmap with Maptiler reverse geocoding.
"Today, years ago" — a morning notification from your own NAS, six fixed picks per year, Polaroid pinboard.
Location history on your NAS: OwnTracks recorder, one store per user, day view, places, heatmap, Google Timeline import. GPX tours stay an album element.
Optional Anthropic Claude Haiku integration for stylistic text variations. Text-only, opt-in, privacy-preserving.
Chronological stream of NAS and phone, backup status, curating into albums. Base package.
Album and photo links with expiry, e-mail via own SMTP, contribution links for guests without an account.
The base stays free, modules are paid — an offline licence per server, no phone-home.
Photo locations on the day route and the heatmap in Trails — including photos without GPS, placed by time.
Sharpen, upscale, denoise on the phone itself. Concept: AI only on a single image, never across the archive.
Your device
My Photo Diary is a native Android app: timeline with automatic camera backup, deep zoom into the original, full album editing, share target for any app, German and English. Kotlin/Compose. No Play Store, no account.
⬇ Download APKOpen 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.