
Getting one old family video onto the living room TV the manual way is a specific kind of ordeal: a pen drive, a format the TV refuses, a laptop balanced on a stool, and an HDMI cable that only works at one particular angle. Twenty minutes of that with relatives watching is how a lot of people arrive at the idea of a media server. The files already exist. They are sitting on a drive in the next room. What is missing is anything that presents them the way a streaming app does — a poster, a description, a resume point — on whichever screen somebody happens to be holding. That is the entire job Jellyfin does, and it does it for the films, shows and home videos you already own rather than supplying a catalogue of its own. This is the setup I would build, including the parts that usually take two attempts.
what Jellyfin actually is

Jellyfin is a media server. You give it folders of video, music and photos you already own — discs you bought, home videos, footage from your own camera — and it builds a browsable library with artwork, descriptions and resume tracking. Apps on your TV and phone talk to it over your own network. It is free software, no subscription, no account with anyone.
What it is not is a source of content. Jellyfin supplies no catalogue and nothing to watch. It organises what is already yours, which in a lot of Indian households means a shelf of DVDs from the 2000s, a decade of phone video, and camcorder tapes somebody paid a shop to digitise. This guide doesn’t cover copying commercial discs; many use copy protection, and getting around it can break the law, so check before ripping anything you bought.
Where those files live matters more than the server does. They belong on a mirrored pair of drives with checksums and a scrub schedule, as described in building your own NAS at home. Home video is the one category nobody can re-acquire.
installing it with Docker

There are native packages, but a container keeps configuration in one place and upgrades predictable. This is a service block you can drop into an existing Compose project, using the conventions from my Docker Compose home server stack:
services:
jellyfin:
image: jellyfin/jellyfin:12.2
container_name: jellyfin
restart: unless-stopped
user: "1000:1000"
group_add:
- "122" # your host's render group id: getent group render | cut -d: -f3
environment:
- TZ=Asia/Kolkata
volumes:
- /srv/appdata/jellyfin/config:/config
- /srv/appdata/jellyfin/cache:/cache
- /srv/media/movies:/media/movies:ro
- /srv/media/shows:/media/shows:ro
- /srv/media/home-videos:/media/home-videos:ro
devices:
- /dev/dri:/dev/dri
ports:
- "8096:8096"
Three deliberate choices in there. The media mounts end in :ro, so the server can read your library but never delete it. The user line makes the container write config as your own numeric ID, which avoids the permission mess of files you cannot later edit. And devices plus group_add hand the machine’s integrated GPU to the container and let your user open it, which matters a great deal in a moment.
Check the Jellyfin releases page for the current version before copying the tag. If you are moving an existing 10.10 or 10.11 server to 12, back up the config folder first: the 12.0 release notes warn that its database changes cannot be rolled back without a full restore.
Bring it up, open port 8096 in a browser on the same network, and walk through the wizard. Then add libraries, choosing the content type carefully — Movies, Shows and Home Videos behave differently, and getting the type right is what makes metadata work.
folder naming, or why your films show up as “video1”

Jellyfin identifies your files by reading their names and folder structure. Get the naming right and posters, cast lists and episode titles appear on their own. Get it wrong and you spend an evening fixing identifications by hand. One folder per film, year in brackets, is the whole trick.
/srv/media/movies/
Sholay (1975)/
Sholay (1975).mkv
Andaz Apna Apna (1994)/
Andaz Apna Apna (1994).mp4
/srv/media/shows/
Series Name (2010)/
Season 01/
Series Name S01E01.mkv
Series Name S01E02.mkv
/srv/media/home-videos/
2016/
2016-11-22 Wedding - Reception.mp4
2019/
2019-03-10 Holi at home.mp4
home videos need a different library type
Do not put family footage in a Movies library. Jellyfin will try to match “2016-11-22 Wedding” against a film database and produce something absurd. Use the Home Videos and Photos type instead, which treats folders as albums, reads dates from the filename, and does not go looking for a poster on the internet. Name files with the date first and a human description after, and the timeline sorts itself.
regional titles will sometimes need help
Metadata providers are thinner on older Indian cinema than on Hollywood releases. Two things help. Set the metadata language and country in library settings so it prefers Indian entries, and for stubborn files use Identify on the item and paste the correct database ID directly. Fix it once and it stays fixed.
direct play, transcoding, and why your old box struggles



This explains almost every Jellyfin performance complaint. When a client handles the file as it is, the server just sends bytes and does nearly no work: direct play. When it cannot — wrong video codec, unsupported audio, an unfamiliar container — the server decodes and re-encodes on the fly. That is transcoding, and it is expensive.
| Scenario | Server load | What to do about it |
|---|---|---|
| Direct play | Almost none | The goal. Nothing to fix. |
| Remux only, container swapped | Low | Fine on any hardware |
| Audio transcode only | Low | Common on TVs that reject certain audio tracks |
| Hardware video transcode | Moderate | Pass the GPU through and enable it |
| Software video transcode | Heavy | Expect stutter on a low-power machine |
| Burning in subtitles | Heavy | Prefer text subtitle formats |
The first move is not a faster CPU. It is reducing the need to transcode at all: store files in widely supported codecs, and use client apps that handle more formats natively. A good TV app that direct-plays everything turns a wheezing server into a perfectly adequate one.
hardware transcoding on Intel integrated graphics
If you do need transcoding, the integrated GPU in almost any Intel chip from the last decade will do it far more comfortably than the CPU. Check the device exists, confirm the container can see it, then turn it on in the dashboard under Playback.
# Does the host expose a render device?
ls -l /dev/dri
# Can the container see and use it?
docker exec -it jellyfin /usr/lib/jellyfin-ffmpeg/vainfo
# Watch what the server is doing during playback
docker compose logs -f jellyfin | grep -i transcode
In the dashboard, set hardware acceleration to Intel QuickSync (QSV), which Jellyfin’s documentation prefers on mainstream Intel GPUs (VA-API is for pre-Broadwell chips), tick only the codecs your chip supports, and leave tone mapping off unless you need it. Then force a transcode and confirm from the logs that it used the GPU rather than quietly falling back to software.
subtitles decide more than you would think
Text-based subtitles such as SRT are sent to the client and drawn there, costing the server nothing. Image-based subtitles from a DVD or Blu-ray have to be burned into the video, which forces a full transcode of an otherwise perfectly playable file. If a particular film always stutters, check its subtitle track before blaming anything else. Converting those tracks to text once, offline, removes the problem permanently.
the apps your family will actually use

The server is half the job. The client decides whether anyone else in the house adopts this.
- Android TV and Fire TV: the official app is solid and handles most formats natively, which keeps the server idle. This is where I would start.
- Android and iOS phones: official apps work well; on Android, Findroid is a popular alternative some people prefer.
- Any browser: the web client needs nothing installed, which makes it the easiest way to demo the thing to a visiting relative.
- Smart TV built-in apps: availability varies by brand and model year. Check before assuming, and keep a cheap streaming stick as the fallback.
- Kodi with the Jellyfin add-on: more setup, excellent playback, worth it if you already run Kodi.
Create a separate user account per person. Watch progress stops colliding, you can restrict what children see, and nobody resumes someone else’s film by accident.
reaching it from outside the flat, safely

Sooner or later you will want your own library while travelling. Do not solve this by forwarding port 8096 to the internet. That exposes a login page to every automated scanner on the planet, and repeated login attempts against a home server are constant background noise now.
Two sane options. A mesh VPN such as Tailscale, which is built on WireGuard, puts your phone on your home network from anywhere, even behind carrier-grade NAT, so nothing is published publicly and the server needs no certificate. A plain WireGuard server works too if your connection has a reachable public address; the setup for both is in my WireGuard VPN setup guide. The alternative, if family should connect without installing anything, is a reverse proxy with a real hostname and HTTPS in front of Jellyfin.
Many Indian home broadband connections sit behind carrier-grade NAT, so port forwarding may not even be possible (home lab networking: static IPs and VLANs explains why). That inconvenience is doing you a security favour. Take the hint and use a mesh VPN.
Remember upload bandwidth. Home broadband here is asymmetric, so streaming out of the house is limited by the smaller number. One stream at moderate quality is usually fine; three at full quality is not.
honest limits on low-power hardware
Jellyfin will run on a Raspberry Pi and on a decade-old laptop. Both work, with caveats worth knowing before you are disappointed. A Pi handles direct play comfortably and struggles the moment real transcoding starts: the Pi 5 has no hardware video encoder at all, and Jellyfin has deprecated Raspberry Pi hardware acceleration, so every transcode lands on the CPU. An older Intel laptop with working integrated graphics is the sweet spot for a first media server, which is roughly the build in my old laptop guide.
Two other honest limits. The first scan of a large collection is slow, and the interface feels sluggish while it runs. And spinning drives that have gone to sleep add several seconds before playback starts, which family members read as “it is broken”.
common mistakes

- Dumping everything into one folder with no structure, then blaming the metadata provider when nothing matches.
- Mounting media read-write when the server only needs to read. A read-only mount means a misconfigured library cannot delete your originals.
- Enabling hardware acceleration without checking the logs, then wondering why playback still stutters on software fallback.
- Publishing the server to the internet on a forwarded port with a weak admin password.
- Leaving the transcode cache on a small system SSD. A long session can fill it and take the whole machine down with it.
- Forgetting that the config folder holds your users, watch history and library layout. Back it up along with your media, or you rebuild all of it from scratch.
FAQ
Jellyfin or Plex?
Plex is more polished and its remote access works with less thought, at the cost of routing through a company’s account system and putting features behind a paid tier. Since April 2025 that includes streaming your own videos from outside the house on Plex’s updated apps, which needs a Plex Pass or a Remote Watch Pass. Jellyfin is free software with no account requirement and no feature gates, and asks a little more of you. Jellyfin is the pick here because it keeps working as it does now regardless of anyone’s business decisions.
why does one file buffer when everything else is fine?
Almost always that file is forcing a transcode while the others direct play. Open the dashboard during playback and it will tell you which is happening and why. The usual culprits are an unusual video codec, an audio track the TV rejects, or image-based subtitles being burned in. Fix the file once rather than upgrading the server.
how do I get my phone photos and videos into it?
Jellyfin displays what is in a folder; it does not collect from your phone. You want something that handles automatic upload and then point a Home Videos library at the result. That is exactly what a self-hosted Nextcloud drive is for — the phone uploads in the background over Wi-Fi, and Jellyfin sees the new files on its next scan.
will this work during a power cut?
Only if the server and the router both stay up. A laptop with a working battery plus a router on a small UPS lets short cuts pass unnoticed, which is the cheap version of this. Longer ones take the whole thing offline, which is fine; the containers come back on their own when power returns, provided you set a restart policy.
Start with one library and three films, get naming and direct play right, then add the rest. The evening your family stops asking you to find the HDMI cable is the evening this pays for itself.
Update history: fixed the hardware-transcoding steps (render group, vainfo path, QSV), updated the image tag with an upgrade warning, replaced the TV-series naming example with a generic one, corrected the remote-access and Raspberry Pi notes, added Plex’s 2025 remote-playback rule and replaced the LinuxServer source with Jellyfin’s own documentation.
Sources
- Jellyfin documentation — installation, library naming conventions and hardware acceleration settings.
- Jellyfin container installation — the official image, its volumes and the
usersetting. - Jellyfin Intel hardware acceleration — render-group passthrough, QSV versus VA-API, and the vainfo check.
- Plex: requirements for remote playback of personal media — the paid-pass rule referenced in the FAQ.
- Arch Wiki: hardware video acceleration — how VAAPI and render devices work on Linux, and how to verify them.