import type { PluginManifest } from '@@/plugins/manifest'; /** * Transmission — the torrent daemon you already run, driven from Officer. * * ── What this plugin is, and what it is not ── * * It does not install or supervise Transmission, and it holds no torrents. You point it at a daemon's * RPC endpoint and it speaks that protocol on your behalf, holding the credentials server-side so no * device carries them. * * ── Where the connection lives ── * * In `service_connections`, a CORE table — this plugin declares no schema of its own. That is deliberate * rather than an omission: the table is the app store's shared credential store, keyed by * `(user_id, service)`, already encrypted at rest and already read by `app-store/effects.ts`. Giving * transmission a private copy of the same three columns would be a second place the same fact could live. * * It does mean this plugin depends on a core facility it does not own. Recorded in PLUGIN.md rather than * hidden, because it is the one thing about this extraction that is not self-contained. * * ── No `osDependencies` ── * * Nothing shells out. The sidecar speaks Transmission's JSON-RPC over `fetch`. */ export const manifest: PluginManifest = { publisher: 'officerdev', version: '2026.08.27.01', platform: '>=1.0.0', label: 'Transmission', summary: 'Torrent downloads — queue, files, peers and speed, from your own daemon', /** a daemon you run. */ tags: ['Homelab'], icon: 'Download', color: '#dc2626', permissions: [ { key: 'transmission', label: 'Transmission', description: 'Torrent downloads', }, ], };