Pillarfree
Watch your over-the-air DVR recordings in any browser — and crop the pillarbox bars off classic 4:3 shows.
If you record old TV off an antenna, you have probably noticed the problem: a 4:3 show broadcast inside a 16:9 frame arrives with thick black bars down both sides. On a tablet that leaves you watching a small square in the middle of the screen, and the official apps give you no way to zoom in.
Pillarfree runs on any Linux machine on your network. It reads the recordings off your DVR, transcodes them on the fly into something a browser can actually play, and serves them as a web page you can open on an iPad, a laptop, or a phone — with a zoom control that pushes those bars off the screen.
What it does
- Plays anywhere. Recordings are broadcast MPEG-2 with AC3 audio, which no browser can decode. Pillarfree transcodes to H.264/AAC and serves HLS, which iPad Safari plays natively.
- Kills the pillarbox. A zoom/crop control fills the screen with the actual picture. It is a CSS transform on the video, so nothing is re-encoded and quality is untouched. It remembers your setting per series.
- Seeks instantly. The whole recording is published as a VOD playlist up front and segments are transcoded on demand, so you can skip commercials without waiting for anything to restart.
- Live TV, buffered. Live channels are re-segmented and deliberately played ~24 seconds behind the live edge. That slack is what stops the stuttering when you are watching over a VPN — and it doubles as a ten-minute pause/rewind buffer, with a Jump to live button to catch back up.
- Offline copies. One click converts a whole episode to an MP4 with the 4:3 crop baked in — detected automatically — which you can download to an iPad and watch on a plane.
- Commercials cut out. On these broadcasts the show is 4:3 pillarboxed inside the 16:9 frame while the ads fill it edge to edge, so the black bars tell you which is which. Converted episodes come out with the breaks removed — typically about 46 minutes of show from a 61-minute recording.
- Star a series. Mark a show and every episode of it is converted for the iPad automatically, commercials and pillarbox gone, as it records.
- Remembers your place. Copies track how far you got and mark themselves watched when you finish, so whatever you're partway through sits at the top of the list waiting to resume.
- Stays local. No cloud account, no login, no telemetry. It talks only to the DVR on your own network.
Download
pillarfree.tar.gz ↓tar xzf pillarfree.tar.gz
cd pillarfree
./install.sh
The installer checks for its dependencies (Node 18+ and ffmpeg, installing
them via apt if needed), finds your DVR on the network by itself,
sets it up as a service that starts at boot, and prints the address to open
on your iPad. Re-running it is safe, and ./install.sh --uninstall removes
the service without touching your files.
It is built to come back on its own after a reboot. If the network or the DVR isn't ready yet, it keeps retrying rather than exiting — exiting is worse than it sounds, because systemd stops restarting a service that fails a few times in quick succession, and it would sit dead until you noticed. Episodes recorded while the machine was off are picked up on the next scan, and if the DVR's address changed over DHCP it is simply found again.
What you need
- A 4th-generation Tablo — the small tuner-only model. The older Tablos speak a different API and will not work.
- A Linux machine on the same network with enough CPU to transcode video. A Raspberry Pi 4, an old laptop, or any small x86 box is plenty; for reference, a low-end Intel N5095 handles standard definition at about six times real time.
It is a single Node script with no npm dependencies — just built-ins and ffmpeg — so there is nothing to audit but the source you unpack.
Why it exists
It started as a way to watch Star Trek reruns on an iPad without the black bars, and turned into a fair amount of work on the parts that are easy to get subtly wrong: segments are cut to a whole number of video frames, and audio frames are partitioned so every one belongs to exactly one segment. Skip either and the audio slowly drifts out of sync over an episode. The README that ships with it documents all of that, in case you want to build on it.