All projects

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.

DAM Editor with Publish to Website dialog open over a 2492×1263 drone frame — showing the luminance histogram, Overexposed analysis tag, Auto-Correct panel (Enhance, Contrast CLAHE, White Balance, Auto Exposure), Auto-fill with AI button, and the primary 'Publish to outandaboutwithjim.com' button.
DAM Editor — publish dialog with AI metadata auto-fill, shipping directly to outandaboutwithjim.com
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:

  1. 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.
  2. 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.
  3. 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 .cube 3D LUT. You refine in natural language ("warmer shadows, lift the blues"); the model re-proposes; a new LUT lands in seconds.
  4. 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.
  5. 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.
  6. 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.