pastilhas d7af39f834 wire the trigger: connecting an admin server provisions everyone
the decision and the execution existed; nothing called them. connecting a
server would have given a working media connection and zero accounts.

the trigger is registering an ADMIN server, not installing the plugin. at
install there is no credential, so there is nothing to provision with — and
this is also the right moment for a re-run, since a revoked token or a moved
server both come back through the same door.

the sidecar now holds the pushed account list in memory. each users:list
REPLACES what was held rather than merging: it is the platform's current truth,
not a cache. persisting it would create a second copy of the platform's users
that could disagree with it, and the recovery from disagreement is re-reading
the platform anyway.

`hasProvisionableUsers()` distinguishes never-told from told-there-is-nobody.
an empty list means a server with only an owner; no list at all means the push
has not arrived or the plugin is not entitled. provisioning nothing is right
for the first and a silent failure for the second.

awaited, so the response says what happened instead of the owner finding it in
a log later. and it never throws: registering the server already succeeded by
then, and losing it to a provisioning error would leave them with no media
access AND no accounts, which is worse than the accounts alone.

mapping rows are written one at a time as each result is known, not batched at
the end. a create that succeeds upstream but whose row fails to write leaves an
orphan account officer will try to create again — the narrower that window, the
better.

found while wiring: the first edit landed the block in editServer as well as
addServer, where `auth` does not exist. caught by tsgo, removed.
2026-08-20 20:20:56 +00:00

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.mjs is 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.
S
Description
No description provided
Readme
751 KiB
Languages
TypeScript 100%