Unterlumen v0.8.0 — Libraries, Publish to Channels, and a Leap Forward
Unterlumen v0.7.0 and v0.8.0 land today as the largest update since the initial release. The headline is an optional Digital Asset Management system — a local, searchable library built entirely from your own files — but there is a lot more besides. Here is what is new.
Libraries — optional DAM, fully local
Unterlumen has always worked without any database. That stays true. The new Libraries mode is entirely opt-in: you can use Unterlumen exactly as before and never touch it.
If you do want it, Libraries indexes a folder of your choosing into a local SQLite database — no CGo, no external process, no cloud. Each photo is identified by its SHA-256 content hash, which means metadata survives external renames without losing the record. From there you get:
- Full-text EXIF search — filter by aperture, focal length, ISO, camera, lens, Fujifilm film simulation, and more with a slider-based panel
- Key/value annotations — attach your own notes or tags to individual photos, inline in the info panel
- High-quality thumbnails — 1200 px JPEG thumbnails stored on disk by content hash, sharded for fast lookup
- Multi-library support — manage separate libraries for different drives, projects, or archives
- Statistics and timeline — D3.js charts covering formats, film simulations, focal length, aperture, ISO, camera × lens combos, time of day, and a shooting calendar; timeline view shows how your habits shift over months and years
- Incremental scanning — fast re-scans skip unchanged files using mtime and file size; full re-index and cleanup modes available alongside
Re-indexing progress streams live to the browser via Server-Sent Events so you always know where a scan stands. Missing photos are marked rather than deleted, so their metadata and thumbnails are preserved until you clean them up explicitly.
Publish to Channels
This one also lives inside Libraries mode. Once your photos are indexed, you can record where and when each photo was published — to Instagram, Mastodon, your own website, or any custom destination.
Publishing writes an XMP sidecar file (.xmp) alongside the original using a custom xmlns:ul namespace, so the record travels with the photo and is non-destructive. A cached copy is kept in the library database for fast search. Photos in a single publish action share a PostID, so carousel posts stay grouped.
Three built-in channel presets cover the most common targets — Instagram at 1080 px, Mastodon at 1920 px, and a website export at 2400 px — all fully editable. You can configure named sub-accounts per channel and pick one at publish time. A "Website" channel type goes further: each publish generates a self-contained HTML gallery alongside the exported photos, and a multi-album mode accumulates albums into a full static website you can rsync to any host.
Slideshow
The browse toolbar now has a Slideshow button. Select photos, pick a delay (1–60 s), a transition (Fade, Slide, Zoom, or Instant), and a layout (single image, Ken Burns, 2-up, or 4-up). You can optionally point it at a folder of audio tracks. A minimal HUD autohides after three seconds; Space pauses, arrow keys navigate, Escape closes. Works on selected files or the whole current folder if nothing is selected. Selecting folder entries in the grid adds all photos from those folders recursively.
Crop tool
Crop is now available directly in the fullscreen viewer. Open a photo, click Crop in the toolbar, draw a rectangle, and choose an aspect ratio — freehand, standard ratios, or cinema formats. Press Enter to apply. The crop saves in place and preserves all metadata, including Fujifilm film simulation data, via exiftool.
Desktop app install
Running ./unterlumen -desktop-install launches an interactive wizard that installs Unterlumen as a native app launcher — a .app bundle in ~/Applications on macOS, a .desktop entry on Linux, and a Start Menu shortcut on Windows. After that it appears in Spotlight, Launchpad, or the application grid just like any other app. A companion -desktop flag opens the app in a Chrome/Chromium window without the URL bar, and the server shuts down automatically when the window is closed.
Dependency check
Settings now includes a "Check dependencies" entry that lists the status of ffmpeg, exiftool, and sips (macOS). Missing or misconfigured tools are flagged with a plain-language explanation and platform-specific install instructions — no more guessing why geolocation editing is not working.
Performance and cache improvements
Several areas got meaningful speed work alongside the new features:
- Thumbnail cache — The Settings dropdown now shows thumbnail cache disk usage and location, with a one-click button to clear it. The cache directory is configurable via the new
UNTERLUMEN_CACHE_DIRenvironment variable and-cache-dirflag, and on macOS it now defaults to~/Library/Caches/unterlumen/so it survives reboots. - Large library search — Filter panel opens instantly after the first load; EXIF range queries were cut from six serial SQL statements to two. Statistics and timeline results are cached in memory and invalidated automatically when a scan runs.
- HEIF/HIF browsing on large rolls — Thumbnail requests now ask for the smallest embedded JPEG preview that still fits the UI instead of always extracting a larger one. Uncached thumbnail work is bounded and deduplicated server-side, so opening a large folder of HIF files no longer pegs every CPU core.
- Homebrew tools found by the installed app — The macOS launchd plist now sets
PATHto include/opt/homebrew/bin, so ffmpeg and exiftool installed via Homebrew work correctly even when Unterlumen is launched from Spotlight or Launchpad.
Get the update
Install or update as a desktop app:
./unterlumen -desktop-install
Or run with Docker — ffmpeg and exiftool included:
docker run -p 8080:8080 -v /path/to/photos:/photos ghcr.io/bjblazko/unterlumen:latest
All release assets are on the product page and the GitHub repository.