VirtualChannels

Release Notes

What's new in VirtualChannels.

Every release and what changed. Because VirtualChannels is a direct download, this page is the record — no App Store "What's New" required.

1.1 Latest

26 July 2026

Signed & notarized by Apple

SHA-256
1a48c835392bad262a656290ed3c414191d20f771352cea403c5f14d26f25312

One clean lineup in front of every media server you run. 1.1 is about the guide being right — for Plex, Emby, Jellyfin, and Channels DVR at the same time — and about the app holding up when real tuners and real networks misbehave.

New in 1.1

One channel per station, even with two providers

When two sources carry the same station — say, two MLB servers in different cities for blackout coverage — the lineup now publishes it once; the other provider becomes automatic failover at tune time. 66 duplicate channels became 33 real ones.

Prefer every copy listed? There's an off switch in Settings → Guide.

The lineup is a number line

Broadcast channels first on their real numbers (6.1 stays 6.1), then your stations (100+), then imports (1000+) — consistently in every export: lineup.json, the M3U playlist, and the guide. Channels DVR numbers playlist channels in the order they appear, so this also fixes scrambled ordering there.

Channels DVR, done right

  • The setup guidance is now truthful: Channels DVR's HDHomeRun mode reads lineups from port 80, which macOS reserves — so the app points you at a Custom Channels source instead, which works on any port. The Setup & Help guide has the steps.
  • The device identifies as VChannels2.0 instead of borrowing a real SiliconDust model number.

Guide health check, built in

Settings → Guide → Check Guide Now reads the guide exactly as your servers fetch it and reports what would break an import: channels with no listings, overlaps, gaps, playlist entries that match nothing. Also served at /guide-check.json.

Richer guide data

Real runtimes, video quality and aspect, audio format, and previously-shown markers — so DVRs set to "new episodes only" stop recording every rerun on a virtual channel as a first run.

Fixes

  • Live streams no longer drop data when a server reads slowly while starting a transcode — playback that aborted mid-stream now holds.
  • Sources no longer report "offline" after every app launch; refreshes wait for the network to come up and retry briefly. Same fix for HDHomeRun tuners, which had their own copy of the race.
  • Event channels no longer show day-long holes past the guide window — placeholder filler now covers everything the guide publishes.
  • Double-encoded text from media filenames ("Eddie’s Exes") is repaired before it reaches the guide.
  • Guides that fail strict XMLTV validation can be produced to spec with Settings → Guide → Strict XMLTV (drops the non-standard elements some servers read; leave off unless a client rejects the guide).

Verified

tv_validate_file (strict mode), tv_sort --duplicate-error, xmllint, and the built-in checker all pass clean on a 92-channel lineup mixing a real HDHomeRun, virtual stations, and two IPTV sources.

Requirements. macOS Tahoe (26) on Apple silicon. Signed and notarized by Apple — it opens without security warnings.

Get it. Download VirtualChannels 1.1, drag it to Applications, then add a source and build a channel. The Setup & Help guide walks the whole flow.

1.0

26 July 2026

Signed & notarized by Apple

SHA-256
4444f838127acab7bbb5a8346eb2fb054abe5e6ae1432b7e6dafe57d529b42ce

The first signed public build. VirtualChannels turns folders of media into linear TV channels and presents everything you own — your own channels, a real HDHomeRun, and any IPTV source — to Plex, Emby, and Jellyfin as a single tuner with a single guide.

The reason the app exists

One tuner, every server

A four-tuner HDHomeRun serving four media servers runs out of tuners fast, because each server that tunes a channel takes a tuner of its own. Two people watching the same channel from different servers consumed two tuners to carry identical video.

Point them all at VirtualChannels instead and the second viewer costs nothing. The first opens the upstream; everyone after joins the feed already running.

  • Feeds are shared by channel identity, so the same station arriving from two providers is recognised as one thing.
  • The upstream stays open briefly after the last viewer leaves, so channel surfing doesn't force a real tuner to relock.
  • A client that can't keep up is dropped behind rather than allowed to stall everyone else on the feed.

Verified against real hardware: two clients on the same broadcast channel, one physical tuner in use.

Guide data your server will actually accept

A guide can be perfectly valid and still be thrown away. Several things were being discarded silently, and are now fixed.

  • Programme details survive ingest. Sports and IPTV feeds emit XMLTV elements out of the order the DTD prescribes; strict parsers drop those programmes without a word. Everything is re-emitted in the correct order.
  • No holes. Event channels only publish listings while an event is on, which leaves gaps that some servers render as dead air or drop entirely. Gaps are filled with hour-aligned placeholder blocks.
  • No duplicates. Feeds that list the same slot repeatedly now collapse to one entry.
  • Channel numbers are published in the element servers actually read.
  • Programme synopses are carried through and shown in the app.

Channel artwork

  • Channel logos are taken from the guide for sources that publish no artwork of their own — a tuner's channel list carries none, but its guide does.
  • A channel you build shows its first item's poster when you haven't chosen a logo: the series poster for a show, the film's own poster for a movie.

Channel numbering you choose

Numbering used to be whatever import order produced, which could put a streaming feed ahead of broadcast channel 2. Organize Lineup (in VC Tuner) lays the whole lineup out deliberately:

  • Real tuners keep their broadcast numbers — 6.1 is 6.1.
  • The channels you build follow, from a starting number you set.
  • Imported sources follow those, grouped so each provider stays together.

Numbers you set by hand are never moved, and running it twice changes nothing.

HDHomeRun support

  • Finds your tuner. Discovery now broadcasts on the local network rather than relying on an internet lookup, so it works on an isolated LAN.
  • Uses your subscription. If your device carries a guide entitlement, its listings are imported automatically — nothing to paste. The app states plainly whether the subscription is active, absent, or lapsed.
  • Matches guide to lineup. A tuner's channel list and its guide are published by different systems and don't share identifiers; they are now joined correctly, including for subchannels that share a station name.
  • Manual entry remains for a tuner on another subnet, where a broadcast never arrives.

Streaming honesty

Some providers answer a request for a channel with perfectly valid video that simply isn't that channel — a placeholder clip served when a feed is blacked out, unauthorised, or idle. Nothing about the bytes reveals this.

  • A stream that resolves to a known public demo asset is refused.
  • A channel whose own guide says nothing is on refuses before pulling a single byte, rather than relaying filler.
  • Failed tunes explain themselves in the log instead of failing anonymously.

Playing broadcast television natively

Everything needed to read, decode, and inspect a broadcast stream is now done with Apple frameworks — no external tools involved.

  • A transport-stream reader that handles arbitrary network chunking and recovers from dropped packets.
  • MPEG-2 video decoded through VideoToolbox.
  • AC-3 and E-AC-3 audio decoded through the system's own codecs.

Interface

  • Light and dark, with a toggle at the end of every screen header.
  • Settings reachable from the bottom of the sidebar.
  • Add HDHomeRun is discovery-first: everything answering on the network is listed and labelled, including this Mac, rather than quietly filtered.
  • Guide shows a programme synopsis alongside the schedule.

Library fixes

  • Search matches whole words. Searching for a show no longer pulls in unrelated episodes whose titles merely contain those letters.
  • Select All on a series adds that series, regardless of what's typed in the search box.

Performance

  • Fixed two runaway loops that could pin a CPU core and make the interface unresponsive.
  • Guide data is parsed once and cached rather than re-read on every request; a large subscription guide no longer times out.
  • Removed heavy database work from the interface thread.

Known limitations

Stated plainly, because finding these yourself is worse.

  • Channels DVR wasn't supported in 1.0. Added in 1.1 via a Custom Channels source — see the 1.1 notes above.
  • The tuner has no authentication. Anything that can reach it can watch everything. Fine behind a router or over a private network such as Tailscale. Do not forward its port to the internet. Access control is the next thing being built.
  • No synopses for your own library. Media is catalogued from filenames by design — no online lookups — so channels you build show titles and episode numbers but no descriptions. Broadcast and IPTV channels show full listings from their guides.
  • DTS and TrueHD are passed through to your client rather than decoded in the app; macOS provides no decoder for either.
  • Channel logos in Plex may not appear for channels you create — Plex appears to prefer its own logo service for tuner channels. Its DVR settings let you set a channel image directly.
  • A first scan of a large library takes a while and the app works normally while it runs.

Requirements. macOS Tahoe (26) on Apple silicon. Signed and notarized by Apple — it opens without security warnings.

Getting started. Open the disk image, drag VirtualChannels to Applications, then add a source and build a channel. The Setup & Help guide walks through the whole flow.