Kristian Buriasco

Creations · Web app

Albm

My own replacement for Pic-Time: a photo portfolio and client galleries that run on a server I control, without a monthly fee.

  • 52releases, v1.0.0 on 14 July to v2.6.0 on 23 October 2026
  • 169commits
  • 2photographers running it: me and Lorenzo Marchisio
  • AGPLopen source, on GitHub
The home page of gallery.kristianburiasco.it: a fencing photo next to the line The moment, kept.
My instance, gallery.kristianburiasco.it, captured 28 October 2026.

Why it exists

Services like Pic-Time deliver galleries to clients nicely, for a monthly subscription. I wanted the same kind of delivery with every photo on hardware I control.

So Albm is one Next.js app with SQLite and local files, and no external services. Back up one volume and everything is in it: galleries, database, originals.

What it does

  • A public portfolio, and password-protected client galleries with favourites, downloads, watermarks and event pages
  • Admin login with a passkey
  • Publishing from Lightroom Classic through a plugin: republishing an edited photo replaces it, removing it deletes it. Capture One uses the same publish API
  • Live galleries from a Canon R5 Mark II over FTP while I'm still shooting, photos appearing seconds after each frame
  • Bib and jersey numbers read from sports photos, searchable, and alt text written by a local model or the Claude API
  • Optional copies in S3-compatible storage such as Cloudflare R2, and an encrypted database backup every night

The hard parts

A camera that only speaks FTP

The R5 Mark II uploads over FTP; Albm takes uploads over HTTPS. A small bridge on a laptop sits in between and saves every frame to disk before uploading it with retries, so a dropped connection never loses a photo. Venue Wi-Fi usually stops devices from seeing each other, so the camera and laptop go on a phone hotspot or a travel router instead.

A small server

Albm was built to run on a 2-core Mac mini. Reading numbers off sports photos there was slow, and the built-in OCR reported junk digits on almost every photo. So that work moved to an analysis worker on a faster Mac: it downloads a 2048-pixel copy, reads the numbers with Apple Vision over overlapping zoomed tiles, and posts the results back. The server stays web-only, and faces stay on machines I own.

Not losing the database

The nightly backup copies SQLite while the app keeps running, checks the copy's integrity before uploading anything, and stops if the check fails.

Upload tokens are passwords

Each photographer and each camera gets its own upload token, shown once, so one can be revoked without touching the others. The same file is never added twice.