DAM Core
An AI-assisted editor that turns a 50,000-asset library of 4K+ video and hi-res photos on self-hosted Immich into a working publishing pipeline — color, trim, grade, generate metadata, publish to outandaboutwithjim.com, and reconcile the live site's state back into the editor.
- Year
- 2026
- Role
- Independent — product, design, engineering
- Status
- Private / self-hosted
- Stack
- React + TypeScript (Vite) · FastAPI + Python · FFmpeg · OpenCV · Ollama (qwen3:14b) · Podman
The problem
Immich is a great self-hosted photo and video library, but it's a library — not an editor and not a publisher. Once you have 50,000 original assets on NAS — 4K+ drone and mirrorless video, hi-res stills, mixed HEVC / ProRes / RAW — you still need color correction, trimming, export presets, metadata authoring, and a way to actually ship the finished piece to the web. Stitching Lightroom + a static site + a CMS together by hand means the pipeline falls over every time you shoot more.
The pipeline
The DAM Core is one half of a two-system loop. The other half is outandaboutwithjim.com, the live public gallery. Assets flow in one direction; state flows back in the other:
- Browse the Immich library as an asset grid with persistent filters — type, rating, date, published/unpublished status, rendition state — all round-tripping to localStorage so nothing resets on refresh.
- Edit 4K+ video directly against NAS originals through a codec-aware proxy pipeline. The browser can't play HEVC or ProRes natively, so the backend probes each asset, passes browser-safe H.264/AAC straight through, and transcodes everything else into a 720p H.264 preview stream cached on disk. You scrub and trim against the lightweight preview; exports always render from the full-resolution original.
- Grade with an AI-in-the-loop color workflow.
A local Ollama model (qwen3:14b) looks at a frame, proposes
ASC-CDL parameters, and the backend bakes them into a real
.cube3D LUT. You refine in natural language ("warmer shadows, lift the blues"); the model re-proposes; a new LUT lands in seconds. - Export through preset pipelines that render from the untouched 4K+ (or higher) original — hi-res image crops, full-resolution video renditions with the graded LUT baked in, and web-optimized deliverables. Every rendition is a first-class tracked object, linked back to its source asset.
- Publish to the live website via a dedicated ingest API, with AI-generated titles, descriptions, categories, and tags auto-filled from the frame and grade — editable before you hit send.
- Reconcile. A sync job pulls the live site's catalog back into the DAM's publish registry, so LIVE / DRAFT / UNPUBLISHED badges on each asset card reflect reality — even for pieces published manually through the website's admin.
What I'm proud of
Full provenance from camera to live URL. Every
piece on outandaboutwithjim.com
carries a chain back to its source: the Immich asset ID it came
from, the LUT that was applied, the export preset and rendition
file it produced, the timestamp it shipped, the slug and live URL
it lives at. That graph survives reconciliation from either
direction — if a piece is edited on the website's admin, the next
sync merges the change without losing the original
published_at. Nothing becomes an orphan; nothing
becomes a mystery. I can point at any piece on the gallery and
trace it all the way back to the original footage on NAS.
The whole system is a closed loop as a result. You never have to remember what's been published, which proxy is cached, which LUT was used, or whether a piece is live — the DAM knows, because the website tells it, because the DAM published it in the first place.
On the hairy-problem side: the codec-aware video proxy is the piece I like most. Working with 4K+ HEVC and ProRes in a browser is a series of failures — Chrome's demuxer refuses HEVC on Linux and Windows, the files are too large for direct playback anyway, and nobody wants to wait on transcoding that isn't needed. The backend probes every asset, decides whether to pass through or generate a lightweight preview, caches the result, and serves whichever is appropriate — with no front-end logic required. The browser gets something it can play; the original stays pristine for export.
Why this project exists
I advise teams on AI in product through Inflection Point Advisory, and I have prior experience leading AI at Orange Logic, an enterprise digital asset management platform. DAM Core is the working lab behind that experience — a place to prototype ideas about AI inside media workflows (grading, metadata, provenance, publishing) end-to-end, against real 4K+ footage, in code, not in slides. Shipping a real pipeline keeps my instincts about what's hard honest, and what's hard is rarely where the product deck thinks it is. That's exactly the gap the advisory work is built to close.
Why there's no live link
DAM Core is intentionally self-hosted: it wraps my media library on my NAS with no tenant model. Exposing it publicly would defeat the point. But the output is public — every piece on outandaboutwithjim.com was shipped through this pipeline. A 60-second walkthrough video is coming; ask and I'll send it.