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
v1.12.1 updated 2 days ago

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 owned and wishlist books, built with React, Hono, and DynamoDB on AWS.

aws aws-cdk cognito dynamodb hono react typescript webassembly
v0.7.0 updated 10 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.