Kevin Rich

Software Engineering Leader

Building ai-driven, cloud-native applications — and the high-performing engineering teams that ship them.

Kevin Rich
All projects

A self-hosted personal video media server that reads each file's own embedded metadata as the source of truth, built in Go with a SvelteKit frontend.

Go SvelteKit TypeScript SQLite Tailwind CSS Docker GitHub Actions Claude Code
updated today

Most media servers make you bend your library to fit them. You rename files to a scheme, maintain a database by hand, or hand your collection to an online service to scrape. Holodex takes the opposite stance. The metadata already embedded in your video files is the catalog: titles, cast, genres, and dates written into the container’s iTunes atoms or Matroska tags. Point it at a folder and it indexes everything with no naming conventions, no internet connection, and no telemetry.

Media is a long-running hobby of mine and my university minor, and I’ve built versions of this project for years. This time I paired with Claude Code and reached a working MVP in a few days. Previous attempts took weeks. I deliberately chose Go because I’d never used it before; in practice my approach left me little need to drop into the Go code by hand.

The backend is a single pure-Go binary running a chi REST API on top of SQLite. The frontend is a SvelteKit SPA on semantic design tokens driving three fully switchable skins from a single header control. Notable technical decisions:

  • Incremental indexing: the scanner only re-reads files whose mtime or size changed; rescanning an unchanged 10k-file library makes zero subprocess calls
  • Full-text search with FTS5: diacritic-folded, so amelie finds Amélie
  • Tiered cover art: embedded poster art pulled at index time; files without it get a throttled background frame thumbnail
  • Open enrichment protocol: provider sidecars speak four HTTP endpoints; a TMDB reference implementation ships alongside the core
  • Unified field resolution: file-embedded and provider values merge per canonical field with source attribution preserved
  • Metadata writeback: operators write the winning value back into the source file’s own tags via an exiftool copy, write, and atomic rename

It’s built to be run, not hosted-for-you. The library mounts read-only, the index and config live in a named volume, and the whole thing ships as one multi-arch image (amd64 + arm64) for NAS and ARM home servers. Additional capabilities:

  • MCP server handing the library to AI assistants
  • System Activity panel for indexing internals
  • Provenance-tracked enrichment history per field

Architecture decisions are tracked as a numbered ADR series in the repo.

A personal book-tracking app for managing reading lists and discovering new books. Built with React, Hono, and DynamoDB on AWS.

React TypeScript AWS CDK DynamoDB Hono Claude Code
v0.1.43 updated 11 days ago

Bookshelf is a full-stack personal app for tracking what I’m reading, what I want to read, and what I’ve finished.

The frontend is a React 19 SPA built with Vite and Tailwind CSS. The backend is a Hono REST API running on AWS Lambda, backed by DynamoDB. Authentication uses Cognito with a PKCE flow. The entire infrastructure is defined as code with AWS CDK v2 and deployed via GitHub Actions with OIDC.

Key technical decisions: runtime config injection (no build-time env vars) so a single artifact can be promoted dev → prod; same-origin API routing through CloudFront to eliminate CORS; and a versioned S3 deployment layout that supports zero-downtime rollbacks.

Notes on engineering decisions, AWS, and things I've learned building.

Visit blog