e8aa85a35bc75a0a239d48d93ae777e40ff0fac9
Provisioning was invisible. Connecting a server can create accounts, adopt accounts and leave accounts alone, and the only record of which happened was a JSON field in a response nobody reads and rows in a table nobody can see. "Did it work" could only be answered by opening Jellyfin and counting. The nav entry is Settings rather than Connection, since it is now more than the connection. The join is computed in the sidecar and shares `normalize` with the reconcile planner, so the screen cannot disagree with the matching rule about whether Diogo and diogo are one person — a settings page saying two would be lying about what the next connection will do. It joins by the link ROW first and by folded name only where none exists: a recorded pairing is a fact, a matching name is a candidate. Four states, because they mean different things — linked (adopted or created), names match but not recorded yet, Officer account with no Jellyfin one, and a Jellyfin account with no Officer user. The last is never touched, and a linked pairing whose Jellyfin account has vanished is shown as such rather than silently re-matched by name. "Not known" is kept distinct from "none": if the platform has not sent the account list, or the server cannot be reached, it says so instead of rendering an empty table that would read as a fact about the server. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Video (Jellyfin)
Films and shows from your own Jellyfin server, inside Officer — with a player that handles direct play, HLS and progressive, and an access token that never leaves the server.
What you get
- Home — resume, next up, recently added
- Libraries — browse films, shows, seasons and episodes
- Search across the library
- A real player — direct play where the file allows it, HLS where it doesn't, progressive as the fallback, with playback reported back to Jellyfin so resume works everywhere
- Multiple servers — add several and switch between them
Requirements
A running Jellyfin server Officer can reach, and an access token.
Setup
Install the plugin, open /jellyfin, and add a server: a label, the URL, and the token. The token is encrypted at rest and never sent to the browser.
Unlike Transmission and Soulseek, this plugin keeps its own registry — jellyfin_servers — because
having more than one Jellyfin is a real thing (a home server and a friend's). One is marked active.
The plugin does not install or supervise Jellyfin. Point it at one you already run.
Permissions
One permission, jellyfin, grantable per role like any other app permission.
Notes
web/vendor/hls.mjsis a checked-in third-party build (~1.3 MB), deliberately excluded from formatting so the diff against upstream stays readable.- Transcoding is the Jellyfin server's job. This plugin asks for a stream and plays what it gets.
Languages
TypeScript
100%