v0.4.0 — Barcode, Discogs, PWA & a new look
Changed
- New brand — a beagle in headphones inside a retro TV over an open book, with the
media(orange) hound(ink) wordmark. New icon everywhere (web favicon/apple-touch, macOS
.icns, Windows.ico, README, wiki), brand palette (orange#E97B0C+ ink#16232A) as the UI
accent, and Fredoka as the brand/heading font. See docs/brand/. - Decluttered UI — a two-row sticky header (brand/Help/Admin on top; media tabs + stats +
Settings + Library below) that stays locked while scrolling, and the admin actions consolidated into
popup menus: ➕ Add (photos/scan/CSV), 🔗 Connect (Discogs/Publish/Letterboxd),
⤓ Export (catalog CSV/JSON, changes, seen), 💾 Backup (backup/restore). Action rows wrap on
narrow screens. - Inline Help panel (❓) with searchable, collapsible sections; Settings dialog now scrolls and
exposes the Library & data folder control. - Desktop app slimmed 370 MB → 45 MB by using the native macOS WebKit backend (excluded Qt +
unused scientific libs in the PyInstaller spec); the bundle version is stamped from the package.
Added — installable on your phone
- 📱 PWA — published catalogs are now an installable, offline Progressive Web App (
manifest.json- a service worker). Add it to your phone's home screen for a full-screen, offline-capable app that
auto-updates on every republish (the SW cache is stamped with the build content-version).
- a service worker). Add it to your phone's home screen for a full-screen, offline-capable app that
Added — the four design proposals (docs/design/)
- 📷 Barcode / UPC scanning — identify the exact release from the barcode instead of fuzzy OCR.
Local decode via the optionalmediahound[barcode]extra (zxing-cpp, a pip wheel, no system lib);
music UPC → MusicBrainz/Discogs barcode search, movie UPC → UPCItemDB product name → the existing
identify-by-title path. New📷 Scan barcodeadmin tool (nativeBarcodeDetectorcamera + manual
entry),POST /api/identify-barcode, and a barcode-first pass inmediahound build --online. - 💿 Discogs integration — a Discogs music metadata provider (
[music.metadata] provider = "discogs"),
one-shot collection import (mediahound import-discogs <username>, a💿 Discogsbutton, and
POST /api/import-discogs), and condition-based price suggestions (resale.discogs_price).
Token stored in the OS keychain (DISCOGS_TOKEN, in Settings → API keys). - 🛟 Interop & safety —
mediahound backup/restore(zip of RawImages + data + config;--no-photos
for a quick curation-only backup;.env/secrets never included), a⬇ Backupbutton +GET /api/backup,
Letterboxd and JSON exporters (mediahound export --format letterboxd|json, plus a client-side
🎬 Letterboxdbutton), and JSON Feed + RSS of recently-added items (data/feed.json/feed.xml,
[feeds]config). - ⭐ Personal catalog — per-item rating (★1–10), note, tags/shelves, and a lending tracker
(loan out / returned, badge, On-loan filter), plus a 🎲 Surprise me picker and a My rating sort.
All personal data is admin-only and stripped from the published catalog (bundle.js/collection.json),
andcorrections.json/loans.jsonare excluded from Publish. See PRIVACY.md. - 📚 Library switcher — open / create / switch the served library at runtime from the admin UI,
with no restart. Backed by a recents list (~/.config/mediahound/recent.json);GET /api/libraries,
POST /api/switch-library,POST /api/create-library(all localhost-only). This is where the data
directory is chosen — per library viaconfig.toml[paths]— surfaced in the UI.
Fixed
- Upgrades now take effect — an existing library kept its own copy of the web UI, so upgrading
MediaHound left the old interface in place.build/app-open now refreshes the app shell from the
installed package (sync_web_assets), and the server sendsno-cacheon HTML/JS/CSS so a webview
can't run stale code. hiddenalways wins — a class that setdisplay(e.g. the static-copy banner) overrode the
HTMLhiddenattribute, so JS couldn't hide it. Added a global[hidden] { display: none !important }.- Static-copy guard — editing a static copy (no admin server) now shows a clear banner that changes
live only in that browser, with one-click Export. - Unidentified thumbnails — the mock/demo build generates real placeholder tiles, and
identify.js
falls back gracefully when a thumbnail file is missing (no more blank/broken images). - CI: green again (fixed Ruff lint in test helpers) and GitHub Actions bumped to Node-24 majors.
Downloads: macOS app below (signed; right-click → Open on first launch). Windows build attaches when SignPath signing is approved. pip install mediahound for the CLI.