en
Media Server on Tor Hidden Service: Streaming Video Anonymously in 2026
Running a private media server as a Tor hidden service enables anonymous content distribution and private streaming. The bandwidth limitations of Tor require specific optimizations for video content. This guide covers practical media server deployment on .onion.
Need this done for your project?
We implement, you ship. Async, documented, done in days.
Bandwidth Reality Check for Video on Tor
Tor's typical bandwidth per circuit is 1-10 Mbps with variable latency. Video streaming bandwidth requirements: SD video (480p) at H.264: 1-2 Mbps, HD video (720p): 2.5-5 Mbps, Full HD (1080p): 5-10 Mbps, 4K: 20-40+ Mbps. Practical implication: SD to HD video is marginally feasible over Tor; 1080p requires the upper end of typical Tor circuit speeds; 4K is not practical. For private media servers on .onion: transcode all content to multiple bitrates (adaptive streaming), target SD and HD as primary quality levels, avoid 1080p and 4K as primary viewing options, and configure HLS (HTTP Live Streaming) or DASH for adaptive quality selection based on available bandwidth.
PeerTube as a .onion Video Platform
PeerTube is an open-source, self-hosted video platform with federation support (ActivityPub). For .onion deployment: PeerTube's backend (Node.js) and PostgreSQL database run on the server, Nginx proxies requests from the .onion port. Tor-specific configuration: disable federation peering (your .onion instance should not federate with clearnet instances, which would leak your .onion address in federation protocols), configure video storage limits appropriate for server capacity, and enable HLS transcoding for adaptive bitrate streaming. Access control: PeerTube supports private videos (password-protected), unlisted videos (accessible only via direct link), and public videos. For a private community: set instance registration to invite-only, enable login requirement for all video access.
Jellyfin for Private Media Library
Jellyfin is a media server for personal libraries (movies, TV shows, music). For .onion deployment: Jellyfin's web UI and API run on port 8096 by default. Configure to listen only on localhost (127.0.0.1:8096). Nginx proxies from the .onion port to Jellyfin. Transcoding: Jellyfin's hardware transcoding (Intel QSV, NVIDIA NVENC) improves performance. On a VPS without hardware encoding, software transcoding is available but CPU-intensive. Configure transcoding quality limits to match Tor's bandwidth constraints (max bitrate 5 Mbps for .onion streaming). Direct play: if the client's Tor circuit is fast enough and the video format is compatible with the browser, Jellyfin can direct-play (no transcoding). HLS transcoding with adaptive bitrates provides the best experience for variable Tor circuit speeds.
Video Upload and Storage Management
For .onion media servers that accept user-uploaded content: upload handling via Nginx's client_max_body_size (set appropriately high for video uploads: client_max_body_size 5G;), chunked upload support (most media platforms support resumable upload protocols, essential for large files over Tor's unreliable connections), and storage management (video files are large; plan server storage accordingly - a 1-hour 720p video is 1-4 GB). Storage options: local disk (simple, no external dependency), object storage (MinIO self-hosted for S3-compatible storage), or IPFS for distributed storage (large files benefit from IPFS's distributed serving). Thumbnail generation: extract video thumbnails server-side (FFmpeg) and cache - clients loading thumbnails do not need to stream the full video.
Progressive Video Download vs Adaptive Streaming
Two approaches to video delivery on .onion: Progressive download: the browser downloads the video file progressively from the start. Simple to implement (static file serving). Works but the user cannot seek efficiently (must download sequentially). For short videos (<10 minutes) on Tor, acceptable. Adaptive streaming (HLS or DASH): the video is divided into short segments (2-10 seconds each) encoded at multiple bitrates. The client downloads segments at the appropriate bitrate for the current connection speed. Allows seeking by requesting segments at different positions. Better user experience for longer content. Implementation: FFmpeg can generate HLS segments and playlist files from source video. Nginx serves the segment files. The player (hls.js in the browser) handles adaptive selection.
Related Services
Why Anubiz Host
100% async — no calls, no meetings
Delivered in days, not weeks
Full documentation included
Production-grade from day one
Security-first approach
Post-delivery support included
Ready to get started?
Skip the research. Tell us what you need, and we'll scope it, implement it, and hand it back — fully documented and production-ready.