2026-06-08 00:01:55 +12:00
2026-06-08 00:01:55 +12:00
2026-05-27 07:21:24 +12:00
2026-06-08 00:01:55 +12:00
2026-06-08 00:01:55 +12:00
2026-06-08 00:01:55 +12:00
2026-06-08 00:01:55 +12:00
2026-06-08 00:01:55 +12:00
2026-06-08 00:01:55 +12:00
2026-04-20 23:16:53 +12:00
2026-06-08 00:01:55 +12:00
2026-05-27 07:21:24 +12:00
2026-06-08 00:01:55 +12:00
2026-06-08 00:01:55 +12:00
2026-06-08 00:01:55 +12:00
2026-06-08 00:01:55 +12:00
2026-06-08 00:01:55 +12:00
2026-04-15 09:27:29 +12:00
2026-04-15 09:27:29 +12:00
2026-04-15 09:27:29 +12:00
2026-04-15 09:27:29 +12:00
2026-06-08 00:01:55 +12:00
2026-05-27 07:21:24 +12:00
2026-06-08 00:01:55 +12:00
2026-06-08 00:01:55 +12:00

HomelabToolkit

A self-hosted control room for your media stack. HomelabToolkit pairs an Emby artwork toolkit with a Navidrome music-library manager behind one beautiful React UI, served by a FastAPI backend.

Categories

Emby

  • Thumbnail Generator — composite landscape thumbnails from posters, logos and backdrops (subject-aware), then push them back to Emby as custom Thumb images.
  • Collection Art — design Thumb/Primary cover artwork for your collections.
  • Airing & New Seasons — track currently-airing series and stamp "New Season" artwork on eligible premieres.
  • Bulk Assign — generate and apply thumbnails across the whole library, plus per-studio artwork resets.
  • User Favorites — browse collections with per-user watched status, prune watched items, and top up with recommendations (dry-run by default).

Navidrome

  • Music Library — browse artists and albums over the Subsonic API.
  • Cover Manager — the former music-covers.py script, now a web tool: scan the library, normalize album folders, rename tracks, remove stray files, and fetch missing covers/lyrics. Runs in dry-run mode by default — nothing on disk changes until you explicitly switch to apply mode.

Architecture

  • Backend: Python, FastAPI, Pillow, rembg (U2-Net). API-only; serves the built SPA and owns every /api/* route.
  • Frontend: React + TypeScript + Vite (frontend/), built to frontend/dist.
  • Music tooling: mutagen + musicbrainzngs + Cover Art Archive + LRCLIB.

Configuration (environment variables)

Variable Purpose
EMBY_URL Emby server URL
EMBY_API_KEY Emby API key
NAVIDROME_URL Navidrome server URL (Subsonic API)
NAVIDROME_USER Navidrome username
NAVIDROME_PASSWORD Navidrome password
MUSIC_ROOT Path to the music library for the Cover Manager
TMDB_BEARER_TOKEN / TMDB_API_KEY Optional artwork providers
GOOGLE_CUSTOM_SEARCH_API_KEY / ..._ENGINE_ID Optional artwork search
  1. Edit docker-compose.yml with your Emby/Navidrome details and mount your music share to match MUSIC_ROOT.
  2. Build and run:
    docker compose up -d --build
    
    The image builds the React SPA in a Node stage, then serves it from FastAPI.
  3. Open http://localhost:8500.

Local development

Backend:

pip install -r requirements.txt
python app.py            # http://localhost:8500

Frontend (hot reload, proxies /api to :8500):

cd frontend
npm install
npm run dev              # http://localhost:5173

Production build of the SPA (served by FastAPI):

cd frontend && npm run build

Deploy to a NAS

deploy.ps1 syncs the project (including the frontend/ source) over SSH and runs docker compose build && up -d remotely. The frontend is built inside the image:

.\deploy.ps1 -NasHost MATT-NAS -NasUser ssh
S
Description
No description provided
Readme
837 MiB
Languages
Python 37.5%
TypeScript 20.3%
HTML 18.7%
Svelte 11.7%
JavaScript 6.5%
Other 5.3%