Media Server Bandwidth, Clients, and Stack Choices
Published 2026-07-12 · Updated 2026-08-21 · 22 min read · By Ben Liu
Plan household video and audio streaming without melting upload: measure uplink, Jellyfin/Plex/Emby fit, audio library notes, remote caps, storage, and edge hardening.
Measure the uplink before you promise 4K
Media stacks fail for prosaic reasons: upload caps, DNS misconfiguration, and messy libraries. Measure sustained upload — not the brochure Mbps. Evening congestion is the planning number.
# from the homelab host toward a VPS you control
iperf3 -c vps.example.com -t 60 -P 4
# repeat at 8 p.m. on a weekdayRule of thumb for remote direct play (no transcode): 1080p H.264 often needs 5–8 Mbps; 4K HEVC can need 15–25 Mbps. One uncapped 4K stream can starve video calls and a second viewer.
Lab notes pending — replace with measured values before publishing claims.
[Add real environment data here]
ISP plan (down/up advertised):
Measured evening upload (Mbps):
Media app + version:
Max remote streams policy:Jellyfin vs Plex vs Emby — pick from clients
List every client you must support (TV stick, phone, browser) before comparing servers.
| Need | Prefer | Avoid |
|---|---|---|
| No vendor account / FOSS | Jellyfin | Assuming every niche client exists |
| Smoothest living-room UX | Plex (budget Pass if needed) | Ignoring account/telemetry trade-offs |
| Middle licensing path | Emby | Reinstalling all three monthly |
Trial the same short library on your real clients. Freeze the winner. Score client success rate and household WAF, not posters.
Separate LAN and remote paths
Direct play on LAN; cap remote bitrate and concurrent streams before anyone bookmarks the server. Transcoding burns CPU — verify Quick Sync/VAAPI/NVENC in your compose stack, not a YouTube bench.
services:
jellyfin:
image: jellyfin/jellyfin:10.10.3
volumes:
- ./config:/config
- /mnt/media/library:/media:ro
networks: [internal]
restart: unless-stopped
caddy:
image: caddy:2.8.4
ports: ["443:443"]
volumes: ["./Caddyfile:/etc/caddy/Caddyfile:ro"]
networks: [edge, internal]Never publish raw 8096/32400 to WAN. Pre-flight: `grep -E '8096|32400' compose*.yaml`.
Audio streaming (same uplink math)
Music libraries need tag hygiene before fancy plugins. Prefer direct play; reserve transcodes for constrained remote networks.
Cap remote audio bitrate (often 192–320 kbps) unless you have spare upload. Lossless over LTE is how family video calls die. Export playlists/favorites — curation hurts more than re-rips.
Legal: stream files you have rights to. Self-hosting is not a license expansion pack.
Storage and metadata
Bulk library on HDD with redundancy or accept re-rip pain. Config/metadata DB on SSD and in the same backup tier as other app DBs. Separate paths so a full library disk does not take down the OS.
DNS split-brain failure mode
Living-room devices that cache the public IP and hairpin through WAN look like "LAN stutter." Prefer internal DNS to the proxy LAN IP for home devices; keep remote URLs for travel clients only.
Related reading
See Automatic SSL certificates, DNS and split horizon, Secure remote access, Restore drill playbook, and Cost of self-hosting.
Explore more
Related guides
- Reverse Proxy and Automatic TLS for Homelabs
One ops guide for reverse proxy + ACME: what a proxy solves, Caddy/Traefik/Nginx fit, certificate renewal, Docker wiring, failure modes, and troubleshooting — without three overlapping primers.
- Homelab DNS, Split Horizon, Filtering, and Light Segmentation
One network naming pillar: public vs private DNS answers, Pi-hole vs AdGuard Home, ACME DNS-01 hygiene, and VLAN segmentation without overengineering.
- Secure Remote Access: VPN, SSH, and Zero-Trust Options
Compare common remote-access patterns for home servers without defaulting to open ports everywhere — with lab notes.