Skip to content

Releases: AlyShmahell/ServeMedia

v0.0.8

Choose a tag to compare

@AlyShmahell AlyShmahell released this 24 Sep 21:15

Changelog

ServeMedia v0.0.8

Added AppImage as a release format (same host ffmpeg as the tarball). Extended 10-bit playback with an AV1 P010 HLS attempt before the existing 8-bit cascade. Live-updated backup and library-delete UI. Fixed windowed player controls. Rebuilt tarball/AppImage ffmpeg/ffprobe with more static codecs and NVENC headers, still dynamically linked to host libva so the host owns the GPU driver stack. Flatpak is unchanged.

  • AppImage. (re)build & package now writes servemedia-0.0.8-linux-amd64.AppImage next to the tarball. The payload is read-only; data lives under $XDG_DATA_HOME/servemedia (default ~/.local/share/servemedia). ffmpeg stays a host-linked ELF (static codecs, dynamic libva/libdrm) so VAAPI uses the host GPU.
  • MatchMedia on AppImage. Home is copied to a writable matchmedia-home beside that data dir so overlay config is not stuck on a read-only squashfs.
  • Watchdog. After every browser tab is gone, the process exits (default 60s). Set watchdog.ttl_seconds: 0 to keep it running. Tabs ping /hx/kpa.
  • 10-bit playback. HEVC Main 10 tries GPU decode + av1_vaapi P010 HLS (vaapi_full_av1_10), then the existing 8-bit cascade (vaapi_full → vaapi_full_10bit → hybrid → software). A fatal HLS error on the AV1 10-bit path retries once as 8-bit.
  • Fedora VA. If LIBVA_DRIVERS_PATH is unset, ServeMedia searches dri-nonfree → dri-freeworld → dri so H.264/HEVC is not hidden by patent-free Mesa. Fedora still needs RPM Fusion mesa-va-drivers-freeworld for those codecs.
  • Player. Windowed Video.js controls stay visible (fill the leftover viewport). Hide-on-idle is unchanged.
  • Settings → Backup. Status and archive list refresh live after backup / restore / delete.
  • Library delete. Continue watching and Recently added update in place.
  • ffmpeg build. x265 pinned to 3.4; Opus, dav1d, SVT-AV1, libvpx, LAME, libvpl, and NVENC headers are in the vendor pin list.

Host tarball and AppImage still need host libva.so.2 and Mesa. Flatpak is unchanged (runtime Mesa + ffmpeg-full). MatchMedia stays 0.0.8.

v0.0.7

Choose a tag to compare

@AlyShmahell AlyShmahell released this 20 Sep 22:58

Changelog

ServeMedia v0.0.7

  • Flatpak MatchMedia starts again: the overlay is written to /run/matchmedia/config.yaml so a scan is not metadata service unavailable on read-only /app.
  • The Flatpak is a source build. ServeMedia and MatchMedia compile from git tags; Go module lists live in flatpak/pins/.
  • ./flatpak/build is one TTY menu: build, build offline, lint, regen, sync. No helper scripts.

Host (re)build & run picks this up now. A sideload .flatpak needs this tag in the manifest (then sync / build).

v0.0.6

Choose a tag to compare

@AlyShmahell AlyShmahell released this 19 Sep 01:18

ServeMedia v0.0.6

Flatpak, Change-Mode scan, and a library that forgets what’s gone.

Ships MatchMedia 0.0.8, a Flatpak (eu.alyshmahell.ServeMedia), MatchMedia Changes vs Rescan, and prune/reattach of moved or deleted titles.

Install

curl -fsSL https://raw.githubusercontent.com/AlyShmahell/servemedia/main/install.sh | bash

Pick v0.0.6.

  • servemedia-0.0.6-linux-amd64.tar.gz — vendored ffmpeg
  • servemedia-0.0.6-linux-amd64.flatpak — Freedesktop 25.08 + org.freedesktop.Platform.ffmpeg-full

flatpak install --user build/package/servemedia-0.0.6-linux-amd64.flatpak
flatpak run eu.alyshmahell.ServeMedia

Sandbox: /media, /mnt, /run/media, ~/Videos, ~/Music. Data: $XDG_DATA_HOME/servemedia. Libraries outside those paths need flatpak override --filesystem=....

What’s new

  • Library scan: Local, MatchMedia (Rescan), MatchMedia (Changes). Changes rematches only incomplete titles (NFO+poster) and hides overwrite.
  • After a library scan, a uniquely moved title reuses the existing row; missing files and episodes are dropped (skipped if the library root is unmounted).
  • Flatpak data is not next to the binary. ffmpeg comes from PATH when vendor/ffmpeg is absent.

Upgrade from 0.0.5

Re-run install.sh (or replace the prefix). Seed pins MatchMedia 0.0.8. Overlay YAML needs no version key. A Flatpak install does not reuse ~/.servemedia/data.

v0.0.5

Choose a tag to compare

@AlyShmahell AlyShmahell released this 18 Sep 12:17

Changelog

ServeMedia v0.0.5

Ships MatchMedia 0.0.7, auto-match on library scan with a picker only on per-title rescan, live Recently added and library-grid poll during scan, and un-nesting of franchise siblings.

Install

curl -fsSL https://raw.githubusercontent.com/AlyShmahell/servemedia/main/install.sh | bash

Pick the v0.0.5 tag. Asset: servemedia-0.0.5-linux-amd64.tar.gz (binary, MatchMedia, htmx, video.js, hls.js, ffmpeg). There is no slim vs bundled split.

Metadata

  • Ships MatchMedia 0.0.7. Pin is matchmedia.version in config/default.yaml. The builder overlays tools/matchmedia at stage from build/cache/matchmedia--linux-amd64.tar.gz when the filename and the archive’s inner version: both match the pin; otherwise it fetches matchmedia.url (basename must be that same archive name).
  • MatchMedia keeps every provider hit on job.candidates with its score. prefer.anime is a rank/auto-match hint only, so a library of American TV (The 100) is not reduced to an anime-only list.
  • Library MatchMedia still auto-applies a clear winner (unique or one perfect match). Per-title Scan with MatchMedia still always opens the picker.
  • Title-similar nesting keeps short tokens (sg, 1). Franchise siblings such as Stargate SG-1 / Atlantis / Universe stay separate titles. A later apply un-nests rows that were wrongly parented unless they are a real path child (kinds/extras stay nested).

UI

  • During a scan, Home Recently added refreshes every 2s (30s when idle). The open library’s title grid and N titles count poll every 2s only while that library’s job is running; search/sort still replace the same live wrapper. Idle library pages do not poll.
  • README Controls uses gamepad and keyboard wireframes (D-pad / left stick / A / B, arrows / Enter / Space) for browse vs player. Mapping is unchanged from 0.0.4. Firefox Flatpak still needs host udev if the pad does nothing: flatpak override --user --filesystem=/run/udev:ro org.mozilla.firefox

Upgrading from 0.0.4

Re-run install.sh (or replace the prefix). Seed config now pins MatchMedia 0.0.7 (matchmedia.version plus matchmedia.url). Overlay YAML does not need a version key. Existing NFO/art is unchanged until you scan, dissociate, or Don't add. Wrongly nested franchise siblings un-nest on the next library MatchMedia apply; path-nested extras stay put. Rows that still have a job id but no session still need a MatchMedia rescan (same as 0.0.3).

v0.0.4

Choose a tag to compare

@AlyShmahell AlyShmahell released this 16 Sep 22:47

Changelog

ServeMedia v0.0.4

Ships MatchMedia 0.0.6, per-title dissociate, always-pick on entry MatchMedia, and keyboard/gamepad spatial focus.

Install

curl -fsSL https://raw.githubusercontent.com/AlyShmahell/servemedia/main/install.sh | bash

Pick the v0.0.4 tag. Asset: servemedia-0.0.4-linux-amd64.tar.gz (binary, MatchMedia, htmx, video.js, hls.js, ffmpeg).

Metadata

  • Ships MatchMedia 0.0.6. Pin is matchmedia.version in config/default.yaml. The builder overlays tools/matchmedia at stage from build/cache/matchmedia--linux-amd64.tar.gz when the filename and the archive’s inner version: both match the pin; otherwise it fetches matchmedia.url (basename must be that same archive name).
  • Per-title Scan adds Dissociate current NFO+poster: deletes store and beside-media NFO/art (shared movie.nfo / poster.jpg in flat multi-title dirs stay), reverts the title to the filename, and sets match_status=skipped so later library MatchMedia scans ignore the row until you rematch from this modal.
  • Per-title Scan with MatchMedia never auto-applies, including a singular high-score matched job. The candidate picker always opens (job.Match is shown if candidates is empty). Don't add sets skipped without writing catalog NFO/art; closing × leaves the orange ! for later.
  • Library MatchMedia still auto-applies unique hits unless the row is skipped. Local scan can still pick up a poster you drop next to the file.

UI

  • Arrow keys move focus among links and buttons on Home, libraries, titles, and Settings. A gamepad D-pad or stick does the same. A activates the focused control; B goes back (closes a dialog, otherwise Back / history). The focus outline appears while using arrows or a gamepad, not for mouse-only use. Card Scan buttons are skipped so posters stay clickable.

Playback

  • On the player, the keyboard stays with video.js (seek, volume, play). Gamepad left/right seek 10 seconds, up/down change volume, A plays or pauses, B leaves the player. The player takes keyboard focus on load.
  • If the pad does nothing in Firefox from Flathub, grant host udev and fully quit Firefox: flatpak override --user --filesystem=/run/udev:ro org.mozilla.firefox (same Filesystem grant in Flatseal; other Flatpak browsers use their app ID). Distro-packaged Firefox usually needs nothing extra.

Upgrading from 0.0.3

Re-run install.sh (or replace the prefix). Seed config now pins MatchMedia 0.0.6 (matchmedia.version plus matchmedia.url). Overlay YAML does not need a version key. Existing matched titles keep their NFO/art until you dissociate or Don't add; skipped is new and only appears after those actions. Rows that still have a job id but no session still need a MatchMedia rescan (same as 0.0.3).

v0.0.3

Choose a tag to compare

@AlyShmahell AlyShmahell released this 15 Sep 15:39

Changelog

ServeMedia v0.0.3

Medora is now ServeMedia. Ships MatchMedia 0.0.5, nested titles, a top bar, and poster fill on rescan.

Install

curl -fsSL https://raw.githubusercontent.com/AlyShmahell/servemedia/main/install.sh | bash

Pick the v0.0.3 tag. Asset: servemedia-0.0.3-linux-amd64.tar.gz (binary, MatchMedia, htmx, video.js, hls.js, ffmpeg). There is no slim vs bundled split.

Metadata

  • Ships MatchMedia 0.0.5 (was Matchora). Helper path is tools/matchmedia/. Catalog GET still needs ?session=.
  • servemedia --prepare only fills third-party vendor/ (JS / ffmpeg check). Leftover tools/matchmedia/vendor is removed on start.
  • Related MatchMedia jobs (spin-off / film) nest under the parent show with their own poster, plot, and Scan / pick UI. They stay off the library grid. A real Specials / OVA / Movies folder still merges as season 0.
  • Per-title Scan with MatchMedia still sends an editable title via POST /v1/ingest. A unique hit waits for a pick when the row has no meta_id yet (orange !).
  • Matched rescan without overwrite fills a missing poster from the stored session, then from data/matchmedia/catalog/[provider-id] …/poster.*.
  • MatchMedia provider failures (cooldown, 504, …) stay status error: red × on the poster, error in the tooltip, no choose-match modal. Orange ! is only for manual / unmatched.

UI

  • Left navbar is gone. Top bar: Back, page title, Settings / About, ServeMedia wordmark (home), Sign out with username.

Playback

  • HLS backward seek stays in the existing buffer when that time is already downloaded (no new session for a short rewind).

Fixes

  • Webhook secret header is accepted case-insensitively (X-Servemedia-Webhook-Key).

Upgrading from 0.0.2

Re-run install.sh (or replace the prefix). Install is now ~/.servemedia and the command is servemedia (not ~/.medora / medora). Copy data/ across if you want the old library database. Rows that have a MatchMedia job id but no session need a MatchMedia rescan. Titles that failed on provider cooldown in 0.0.2 and were stored as unmatched keep the orange ! until you scan them again.

v0.0.2

v0.0.2 Pre-release
Pre-release

Choose a tag to compare

@AlyShmahell AlyShmahell released this 31 Aug 17:39

Changelog

Medora v0.0.2

One archive, Matchora 0.0.4 (no llama.cpp), better playback.

Install

curl -fsSL https://raw.githubusercontent.com/AlyShmahell/medora/main/install.sh | bash

Pick the v0.0.2 tag. Asset: medora-0.0.2-linux-amd64.tar.gz (binary, Matchora, htmx, video.js, hls.js, ffmpeg). There is no slim vs bundled split.

Metadata

  • Ships Matchora 0.0.4: SequenceMatcher grouping/ranking. No llama.cpp, GGUF, or matchora --prepare.
  • medora --prepare only fills third-party vendor/ (JS / ffmpeg check). Leftover tools/matchora/vendor from 0.0.3 is removed on start.
  • Per-title Scan with Matchora sends an editable title via POST /v1/ingest (library scan is still path-based).
  • Version comes only from config/default.yaml (repo VERSION file is gone). Overlay YAML cannot override it.

Playback

  • Player status sits under the video. Control bar shows on hover and hides after 5s.
  • Seek bar and duration use the real ffprobe length, not the growing HLS playlist.
  • Clicking the bar seeks to that time (in-window, or a new transcode session past the buffer) instead of jumping one segment.
  • VAAPI probe sets LIBVA_DRIVERS_PATH when unset, logs ffmpeg errors, and keeps a device that passed lavfi encode.
  • If H.264 VAAPI encode is missing (some AMD iGPUs) but AV1 encode works, transcode uses av1_vaapi + fMP4 HLS. Otherwise software libx264.

Fixes

  • Desktop icon discovery in the installer.

Upgrading from 0.0.1

Replace the install prefix (or re-run install.sh). You do not need llama.cpp. Old slim installs should take the new tarball so ffmpeg is present; --prepare cannot compile ffmpeg.

v0.0.1

v0.0.1 Pre-release
Pre-release

Choose a tag to compare

@AlyShmahell AlyShmahell released this 29 Aug 15:04

Changelog

[0.0.1] — 2026-08-29

First public release of Medora: a self-hosted media library that runs as a host binary (not a container). A Podman builder produces the dist; you install and run medora on the machine. Default listen is http://127.0.0.1:7676. License is BSD 3-Clause. Package target is linux-amd64.

Install and run

  • TTY installer (install.sh) picks a GitHub release, installs into ~/.medora, links ~/.local/bin/medora, and adds a userscope desktop entry and icon.
  • Two archives:
    • slim — binary, seed config, first-party static, Matchora helper. No {exeDir}/vendor/. Run medora --prepare later for ffmpeg/JS and Matchora’s llama.cpp.
    • bundled — slim plus vendored htmx, video.js, hls.js, ffmpeg, and Matchora’s llama.cpp.
  • After listen, Medora opens the UI in the browser when DISPLAY or WAYLAND_DISPLAY is set (MEDORA_NO_BROWSER=1 skips that). A second start on a busy port opens the same URL and exits.
  • Writable data lives under {exeDir}/data (SQLite store, transcode cache, backups, overlay config.yaml, Matchora cache). Overlay YAML merges on top of the seed config/default.yaml.
  • Library roots: MEDORA_MEDIA_PATH or media.path (comma-separated). Each root is jailed separately; the add-library picker shows them as one folder tree.

Library and scan

  • Libraries are a name and a folder. There is no movie/TV/anime type. A directory is a show when it looks like a show pack (Season N, SxxExx, sequential cour layouts, and similar); otherwise it is a movie.
  • Local scan walks the disk, reads existing NFO/posters, and inventories titles.
  • Scan with Matchora sends the folder to first-party Matchora v0.0.3 (localhost :7680). Matchora groups and matches; Medora inventories videos, classifies movie vs show, numbers episodes, and writes catalog metadata. Optional: overwrite existing metadata; persist NFO/art beside the files.
  • Per-library and per-title scan. Uncertain matches show an orange ! and a candidate picker. Unmatched titles are still inventoried.
  • Scan on startup is on by default.
  • Library pages: search plus sort by name, date added, or year.

Home and browsing

  • Home: libraries, continue watching, recently added.
  • Movie and show pages from NFO (plot, cast, genres, studio, ratings, and the rest of the usual fields). Shows have season and episode views.
  • Poster progress bars and per-user watch progress.

Playback

  • video.js player with hls.js for HLS.
  • Direct byte-range stream when the file can play as-is; otherwise HLS transcode (H.264, configurable max height and CRF).
  • Quality, audio track, chapters, subtitles (embedded plus sidecar .srt / .vtt / .ass / .ssa), playback rates, prev/next episode, resume from last position.
  • Hardware encode: hwaccel: auto probes VAAPI on /dev/dri (needs host Mesa/libva/libdrm). Fallback is software libx264. Settings → Server shows the active pipeline.
  • Idle HLS jobs are cancelled a few minutes after the last segment request. The Medora process stays up.

Metadata

  • Matchora owns browse jail, grouping, matching, and catalog bytes. Provider keys (OMDb, TMDB, and any other secrets Matchora exposes) are stored in Matchora, not in Medora YAML. Admin sets them under Settings → Integrations → Metadata.
  • Medora owns SQLite, playback, persist-beside-media, ffmpeg stills, and the match picker UI.

Accounts

  • Empty install redirects to /register to create the admin. After that, /register is 404.
  • Admin → Settings → Users creates ordinary users, resets passwords, and deletes accounts.
  • Libraries and progress are per user.

Integrations and backup

  • Per-user outbound webhooks (JSON). Types: PlaybackStart, PlaybackProgress, PlaybackStop, ItemAdded, TaskCompleted, UserCreated, UserDeleted, plus Generic. Destinations can filter by notification type and item type, add headers, and use a {{Field}} template. Test send and API-key regenerate are on the same page.
  • Settings → Backup: one-shot and periodic tar.zst of store/, retain count, restore (reloads the store), delete archive. Default schedule is every 24h, keep 7.

Build and test (developers)

  • ./build/run TTY menu: run, rebuild, prepare, or package. Builder is Podman-only; it writes build/dist/.
  • ./tests/run runs unit tests and Playwright smoke in Podman (no host Go/Node/Playwright).

Known limits

  • linux-amd64 only. No Windows, macOS, or ARM packages.
  • Runtime is the host binary. Podman is for building and CI, not for serving media.
  • Matchora is not a user-facing admin console; it binds 127.0.0.1:7680.
  • Matchora scan jobs are untyped, so anime prefer does not apply on those jobs.
  • Webhook item-type checkboxes include music labels (Album, Song); libraries themselves are only movie/show.
  • No plugin system. Metadata is Matchora only.