Transmitter is designed for home network deployment where all users are trusted. Security features are implemented to prevent accidental exposure and protect credentials.
- Web UI: no user authentication. Accessible only on home network. If external access is needed later, add middleware with Basic Auth or cookie session.
- Telegram bot: whitelist by user ID. Unauthorized messages ignored (no response, logged at warn level).
- Transmission RPC: credentials stored in
.envfile and container env vars. Never sent to frontend — proxied server-side in Go. - Credentials injected via
Authorization: Basic <base64>header (HTTP Basic Auth) - Environment variables loaded via
godotenv, not exposed in logs
- Transmission RPC: uses its own CSRF mechanism (
X-Transmission-Session-Idheader) - Go proxy manages token lifecycle transparently:
- Fetches session ID on first request (10s timeout)
- On 409 Conflict response, extracts new ID from header
- Retries request with fresh token (one retry)
- Caches valid token in memory (
atomic.Valuewith singleflight)
- CORS: explicit origin checking (no wildcard), prevents DNS rebinding attacks
network_mode: hostin Docker — simplifies localhost access to Transmission- No external exposure — assumes private network
- RPC whitelist: only 6 methods allowed:
torrent-get,torrent-add,torrent-start,torrent-stop,torrent-remove,session-get
- Request size limit: 1 MB max payload (prevents DoS)
- Raw JSON-RPC forwarding (no user input in RPC calls except torrent data)
If exposing Transmitter to the internet or untrusted networks:
- Add authentication — Basic Auth or session middleware in Go
- Use HTTPS — reverse proxy with TLS (nginx, Caddy, etc.)
- Restrict IP range — firewall or reverse proxy rules
- VPN/tunnel — SSH port forwarding or WireGuard for remote access
- Rate limiting — implement rate limits on
/api/rpcendpoint - Change defaults — ensure strong Transmission credentials
- All Transmission data (torrent files, credentials) handled server-side
- Frontend receives only: torrent metadata, status, progress
- Session tokens not exposed to client
- Telegram interactions logged at configured level