Transmission Manager
A lightweight, modern, single-binary web application for viewing and managing torrents from a Transmission RPC daemon.
Transmission Manager serves a fast, clean, dark-mode Single Page Application (SPA) and proxies Transmission RPC calls through a minimal Go backend—all contained within a single executable.
Features
- Single Static Binary: All frontend assets (
index.html,app.js,styles.css) are embedded directly into the Go binary usingembed. Zero runtime asset dependencies. - Modern Dark-Mode UI: Built with vanilla HTML5, CSS3 (using CSS variables), and JavaScript. Responsive, compact layout designed for both desktop and mobile screens.
- Live Polling & In-Place Updates: Keyed DOM reconciliation updates existing torrent cards in place without screen flickering or scroll jumping. Selectable refresh interval (1s, 3s, 5s, 10s).
- Rich Sorting & Filtering:
- Filter torrents instantly by name.
- Sort by Status, Name, Progress, Ratio, Size, Speed, or Availability.
- Interactive Controls: Pause or resume individual torrents directly from the web interface.
- Smart Seed Scheduler: Opt completed torrents in from the Scheduler tab, choose 1–100 active slots for them, and rotate an idle slot to the least recently seeded waiting torrent after one hour without upload. A persistent cycle history shows activations and rotations.
- Robust Transmission RPC Support:
- Automatically handles Transmission
409 Conflictsession ID (X-Transmission-Session-Id) handshakes. - Supports optional HTTP Basic Authentication.
- Automatically handles Transmission
Configuration
Transmission Manager is configured entirely via environment variables:
| Variable | Required | Description |
|---|---|---|
TRANSMISSION_URL |
Yes | Absolute HTTP or HTTPS RPC endpoint URL of your Transmission instance. |
TRANSMISSION_RPC_USERNAME |
No | Basic Authentication username for Transmission RPC. |
TRANSMISSION_RPC_PASSWORD |
No | Basic Authentication password for Transmission RPC. |
SCHEDULER_DB_PATH |
No | SQLite database path (default ./data/scheduler.db). |
The scheduler runs in the server even when no browser is open. Active slots apply only to opted-in completed torrents. Torrents outside the opt-in set do not count toward those slots or have their Transmission state changed: an unopted download keeps downloading, and an unopted seed keeps seeding. A scheduled torrent that continues uploading can keep its slot indefinitely, so rotation does not guarantee a fixed maximum waiting time. Manual pause or resume of an opted-in torrent is temporary; the scheduler restores its chosen state on its next check.
In the Torrents tab, each card shows whether it is scheduled. Use the Scheduled filter to show only opted-in torrents, or the Schedule/Unschedule button on a completed torrent to change its opt-in without leaving the tab. The Scheduler tab remains available for active slot settings and cycle history.
Quick Start
Using Docker
Run the container directly:
docker run -d \
--name transmission-manager \
-p 8080:8080 \
-v transmission-manager-data:/app/data \
-e TRANSMISSION_URL=http://192.168.1.100:9091/transmission/rpc \
-e TRANSMISSION_RPC_USERNAME=admin \
-e TRANSMISSION_RPC_PASSWORD=secret \
transmission-manager:latest
Using Docker Compose
Create a docker-compose.yml:
services:
transmission-manager:
build: .
container_name: transmission-manager
ports:
- "8080:8080"
volumes:
- transmission-manager-data:/app/data
environment:
TRANSMISSION_URL: http://192.168.1.100:9091/transmission/rpc
TRANSMISSION_RPC_USERNAME: admin
TRANSMISSION_RPC_PASSWORD: secret
restart: unless-stopped
volumes:
transmission-manager-data:
Then start the application:
docker compose up -d
Open your browser and navigate to http://localhost:8080.
Building from Source
Prerequisites
- Go 1.24 or later
Build
Compile the single binary with embedded frontend assets:
git clone https://github.com/your-repo/transmission-manager.git
cd transmission-manager
go build -ldflags="-s -w" -o transmission-manager .
Run
export TRANSMISSION_URL="http://localhost:9091/transmission/rpc"
./transmission-manager
By default, the server listens on port 8080.
Keep the data directory (or the path set by SCHEDULER_DB_PATH) across restarts to preserve scheduler settings, opt-ins, and cycle history. The app creates the database directory on startup and exits with a clear error if it cannot open the database.