cb1a83628c7ab66b08a7dfe760027163966e9487
opencode discovers AGENTS.md and nothing else; claude code discovers CLAUDE.md. this repo had neither, so an agent sent to change something here arrived with no guidance at all under either. it deliberately does NOT repeat README.md. that file says what the plugin is, for someone deciding whether to install it. this one answers the other question: i have to change something in here, what will i break. the facts in it are read from the repository rather than recalled — the panel keys from web/panels.ts, the tables from db/schema.ts, the permission keys, the host binaries and the route claims from manifest.ts. presence is the declaration everywhere in this system, so the file says what the platform will actually conclude from these files existing. CLAUDE.md beside it is a pointer, not a copy: two copies drift and the stale one is the one somebody reads.
Soulseek
Search and download from the Soulseek network, through your own slskd daemon — inside Officer, with the API key held server-side so no device ever carries it.
What you get
- Search the network, with results grouped by peer and filterable by bitrate, size and free slots
- Transfers — downloads and uploads, with queue position, retry and cancel
- Browse a peer's shares as a tree, cached locally so it survives them going offline
- Favourites — peers worth coming back to
- Rooms and chat, joined and available
- Server status — connect, disconnect and see what the daemon is doing
Favourites and the cached browse tree are Officer's own: slskd has no concept of either.
Requirements
A running slskd instance Officer can reach, and its API key.
Setup
Install the plugin, open /soulseek, and fill in the connection panel — the daemon URL and the API key. The key is encrypted at rest and never sent to the browser.
The plugin does not install or supervise slskd. Point it at one you already run.
Permissions
One permission, soulseek, grantable per role like any other app permission. It gates the whole
surface.
Notes
- The connection is stored per-owner in the platform's
service_connectionstable under the service nameslskd, while the HTTP mount is/api/soulseek. Those two strings differ on purpose — seePLUGIN.md. - Live search results arrive by polling; the SignalR hub is not proxied.
Languages
TypeScript
100%