Show family pictures on a screen. Let everyone send in new ones. Making that work day after day turned into a project about photo quality, fair rotation, recovery, and remote support.
01 / A photo's journey
From an email to a familiar face.
McPics runs on a Linux Mint computer connected to the display. A local web app, an email importer, and a small database each handle a different part of the job.
01
The family sends a photo
Pictures arrive by email. Nobody needs to create an account on this website or learn a new app.
02
The importer prepares it
A scheduled process checks the mailbox, filters attachments, converts iPhone formats when needed, and checks for duplicates.
03
The computer keeps it
Photos live on local storage. SQLite keeps track of imports, contributors, duplicate groups, settings, and rotation history.
04
The slideshow displays it
The local app chooses the next photo. A fullscreen browser loads it, fits the whole image on screen, and handles the transition.
The website is the front door. It explains the project and helps family send photos. The desktop computer does the importing and playback. Once a photo is imported, playback uses the local copy; collecting new email still needs an internet connection.
02 / What got complicated
The parts you don't see on the screen.
The tricky problems showed up when the slideshow had to keep running, new photos kept arriving, and the screen was somewhere else.
01
“Fair” rotation wasn't actually fair.
Older photos had built up hundreds of appearances. Trying to equalize lifetime counts made a fresh batch play over and over to catch up, crowding out the rest of the collection.
The fix: make time since the last appearance drive the rotation. Unseen photos go first, new arrivals get a short spotlight, and the lifetime-count adjustment is capped.
Recent-repeat exclusions and an optional sender-balanced mode add variety without forcing a rigid alphabetical loop.
02
Similar photos aren't always duplicates.
Two different shots from a quick burst were similar enough to land in the same duplicate group. One disappeared from the rotation, and the contribution count was wrong.
The fix: tighten the visual matching threshold. Exact copies are checked with a file fingerprint; visually similar copies use a separate perceptual fingerprint.
Within a duplicate group, the version with the most pixels is preferred, while contributor credit can be preserved.
The tradeoff: stricter matching protects distinct photos, but may let some near-duplicate resends through.
03
An email attachment isn't always a usable photo.
Phones can shrink pictures before sending them. iPhone photos may arrive in HEIC format. Email signatures add tiny logos, while real photos sometimes arrive marked as inline images.
The fix: inspect filenames, attachment types, file size, and image dimensions. Convert HEIC/HEIF photos to JPEG for browser playback and keep low-resolution imports out of the rotation without deleting them.
When automatic replies are enabled, McPics can ask for a full-size resend or flag an empty email. Thank-you replies are grouped after a quiet period so a burst of submissions doesn't mean a burst of replies.
04
A retry could get stuck in the same place.
The importer kept rereading old messages. If the mailbox hit a quota limit partway through, the next run could hit the same limit before it ever reached new photos.
The fix: save progress after each fully processed message using the mailbox's stable message identifiers. The next run resumes from that point, and recorded attachment fingerprints prevent repeat imports.
Each display computer keeps its own progress. For multiple devices, imports can work independently instead of relying on a shared read/unread flag that another device—or a person checking email—might change.
05
A smooth fade took more than a fade effect.
Changing a single image could create a jump through black. Captions could arrive before their photo, and a file that failed to load could interrupt the experience.
The fix: preload the incoming photo, then crossfade between two image layers. Update the caption after the transition, and log and skip a photo that cannot be displayed.
Images fit the screen without cropping. Layout scaling and an idle cursor timeout help the display feel at home on a large screen.
06
Turning off the screen changed the desktop.
Display changes can move windows and interfere with remote support. Simply putting the whole computer to sleep would also stop it from collecting new pictures.
The solution: the NUC setup separates the slideshow display from a support output, using a dummy HDMI display to keep the remote desktop available.
Optional timers turn off only the slideshow output. The app and email importer keep running. On wake, the system restores the layout, lets the display settle, and launches a fresh fullscreen browser on the intended screen.
03 / Under the hood
Ordinary tools. A very personal purpose.
McPics uses familiar desktop, Python, and browser tools. Keeping the pieces understandable makes the system easier to troubleshoot remotely.
Component
Its job
Linux Mint
The desktop environment on the display computer.
Python + Flask
The local web app, settings interface, photo-serving routes, and next-photo selection.
SQLite
Persistent import progress, photo metadata, duplicate groups, contributor records, settings, and rotation history.
IMAP + SMTP
Retrieving photo emails and sending optional acknowledgments or quality notices.
Image tools
Pillow and ImageHash help inspect and compare images. heif-convert prepares HEIC/HEIF attachments for browser playback.
Fullscreen browser
The slideshow and Family Update screen. Firefox is preferred when installed, with Chromium-based browser fallbacks.
systemd + display tools
User services and timers keep the app and importer separate. xrandr handles display layout and output power; wmctrl helps place and manage the kiosk window.
Startup has an order.
The backend starts independently. The login launcher gives remote support time to become available, waits for the app's health check, and then opens the kiosk. Installing dependencies is kept out of normal startup.
Support is part of the design.
Desktop shortcuts, a local settings page, health checks, and readable logs help diagnose problems without asking Grandma to troubleshoot a web application.
All that work, so she can just enjoy the pictures.
The project grew because every small detail mattered: which photo appears next, how it looks, what happens when something fails, and whether it comes back tomorrow.