Introducing PrismCast: Browser-based Live TV Capture for Channels DVR and Plex

I know it's been a couple of months, but rest assured I've been working behind the scenes...enjoy the new release:

PrismCast v1.11.0 is here, and it's got a lot in it. Three of the headline features in this release, along with a whole lot of refinements and fixes:

HDHomeRun LAN discovery for Plex. PrismCast now responds to standard HDHomeRun discovery broadcasts, so Plex finds it on your network automatically β€” no more entering an address by hand. It's on by default under the HDHomeRun / Plex settings; turn it off in multi-tenant environments or if a real HDHomeRun is already on the network. Channels DVR users continue adding PrismCast manually as a Custom Channels source β€” Channels DVR's auto-discovery assumes port 80, which most installations can't bind. That's a Channels DVR constraint, not PrismCast.

Channel lineups that survive restarts. PrismCast now remembers each service's discovered channels and their direct watch addresses across restarts, so you can tune immediately after a restart even if the startup channel scan failed or hasn't run yet. Remembered addresses are always verified on use β€” if one has gone stale, the tune falls back to the guide in the same attempt, and the lineup refreshes itself on the next successful scan. Paired with this, a guide page that fails to render is now retried instead of accepted: the startup scan reloads and re-reads an empty service (with one more pass a few minutes later if needed), and a tune that finds no guide reloads the page and retries once. If you've ever seen "zero channels precached" after a reboot and had to restart to fix it, this release is for you.

Automatic consent-prompt handling. Sites that gate their player behind a cookie-consent or "enable tracking" prompt now tune on their own, so channels like France 24 work on a fresh setup without a trip through login mode. Prompts that genuinely can't be handled automatically will point you to dismiss them once in login mode.

Beyond the headlines, there's a lot more in this release:

  • Recovery that can't defeat itself β€” a browser tab that freezes mid-stream can no longer snowball into a dead recording. Health checks run one at a time, hung tabs are still detected and replaced in about twenty seconds, a channel's remembered watch address survives a mid-tune browser hiccup, and nothing left over from an old stream can disturb a newer one on the same channel.
  • Native HLS, overhauled for long recordings β€” streams stay locked to the channel you actually tuned (token refreshes hours into a recording re-verify the same channel instead of drifting to the provider's default), high-bitrate channels like Marquee Sports no longer degrade and fail after an hour, and modern fMP4/CMAF channels now stream natively end to end.
  • Self-healing capture β€” PrismCast now detects when Chrome is connected but can no longer actually capture video, and relaunches it automatically instead of serving silently broken streams until you restart the server.
  • HDHomeRun quality of life β€” emulation settings apply live without a restart, the last tuner is no longer wrongly rejected at full capacity, and friendly names like "Living Room & Office" no longer break Plex's tuner discovery.
  • Per-channel "always use screen capture" β€” for sites whose native HLS stream misbehaves, force a channel to skip native streaming right from the channel editor.
  • The in-app upgrade button now works on npm and Homebrew installs.
  • Numerous fixes and improvements β€” steadier channel discovery across Sling, HBO Max, DirecTV, Xfinity, Cox, and YouTube TV, sturdier profile and settings editing, cleaner startup and shutdown in bad conditions, and more. The full changelog below has every detail.

As always, I really appreciate the feedback, enthusiasm, and passion around PrismCast. Almost every feature added since 1.0.0 has come from thoughtful, respectful discussion with this community.

My only ask is simple: please be kind, not demanding. PrismCast started as a project for my own needs, and I share it because I enjoy this community and wanted to give something back. Respectful feedback is always welcome; entitlement is not.

Thank you to everyone who's shared encouragement or joy in using PrismCast β€” it genuinely keeps this project fun to work on.

One more note for everyone's benefit: please don't repost the same questions in this thread. Many of them have already been asked and answered, and the forum's topic-only search works well. Keeping discussions focused helps everyone. Please treat the thread and each other with the same consideration you'd expect in return.

To reiterate from prior release notes:

If you've created user-defined channels that are now covered by predefined options, I recommend deleting those overrides and using the defaults. Predefined channels are what I test and maintain; overrides are entirely optional, but they do create long-term configuration debt for you as PrismCast evolves.


1.11.0 (2026-08-16)

  • New feature: HDHomeRun LAN discovery - PrismCast now responds to standard HDHomeRun discovery broadcasts on UDP port 65001, so Plex finds PrismCast on the local network automatically without entering an address by hand. The new "Enable LAN Discovery" setting under HDHomeRun / Plex is on by default; turn it off in multi-tenant environments or when another real HDHomeRun device is already on the network. Channels DVR users continue to add PrismCast manually as a Custom Channels source - Channels DVR's HDHR auto-discovery assumes the standard HDHomeRun port 80, which most installations cannot bind.
  • New feature: automatic consent-prompt handling - sites that gate their player behind a cookie-consent or "enable tracking" prompt now tune on their own, so channels like France 24 work on a fresh setup. Prompts that can't be handled automatically point you to dismiss them once in login mode.
  • New feature: a per-channel "always use screen capture" option - for sites whose native HLS stream misbehaves, you can now force a channel to skip native streaming from the channel editor.
  • New feature: channel lineups now persist across restarts - PrismCast remembers each service's discovered channels and their direct watch addresses, so after a restart you can tune immediately even if the startup channel scan failed or hasn't run yet. A remembered address is always verified on use: if it has gone stale, the tune falls back to the guide in the same attempt and the lineup refreshes itself on the next successful scan.
  • Improvement: HDHomeRun emulation settings now apply live - turning emulation on or off, or changing the port, friendly name, or device ID, takes effect immediately without restarting the server. Settings outside HDHomeRun still require a restart, and the save confirmation tells you which changes applied live and which need one.
  • Improvement: PrismCast now recovers automatically when Chrome is connected but can no longer actually capture video - a state that used to produce silently broken streams until you restarted the server. It checks real capture readiness at every browser launch and relaunches a browser that has gone bad, with a loop-safe governor that backs off instead of thrashing when a browser keeps failing.
  • Improvement: a provider's guide page failing to render is now retried instead of accepted - the startup channel scan reloads and re-reads a service that returned no channels (and takes one more pass a few minutes later if it's still empty), and a tune that finds no guide reloads the page and retries channel selection once. Together these address the "zero channels precached, tuning failed until a restart" failure some services could hit on a slow boot.
  • Improvement: native HLS streaming is more robust over long recordings - encrypted streams now tolerate brief network hiccups on the audio track as patiently as on video, malformed decryption data is dropped instead of garbling the picture, channels with short-lived access tokens (some sports feeds) refresh cleanly at the token boundary instead of repeatedly reloading the page, and memory stays flat across very long sessions.
  • Improvement: the web interface is hardened against malformed or malicious channel data - logos, service URLs, show names, and stream URLs are consistently escaped and link schemes vetted, so untrusted text from a provider or imported service pack can't break the page or inject markup.
  • Improvement: when a Sling TV channel isn't found, the suggested-channels list in the log now leaves out channels a builtin preset already covers, matching the other providers.
  • Improvement: robustness work across the debugging surface, login-tab handling, and ad-hoc streaming, with no change to normal operation.
  • Fix: high-bitrate native HLS channels no longer degrade and fail after roughly an hour - PrismCast downloads several segments in parallel while serving them strictly in broadcast order, so delivery keeps pace with channels like Marquee Sports, and stopping a stream cancels its in-flight downloads immediately. A corrupted or truncated video fragment can no longer freeze the server in an endless parsing loop, and a failed audio-mute step can no longer take down a native stream.
  • Fix: channels that deliver modern fMP4/CMAF video over HLS now stream natively end to end - initialization data is carried through, segments are served under their true container type, and HDHomeRun/MPEG-TS clients receive a proper remux - so channels like Marquee Sports play correctly. Quality selection is also smarter about imperfect providers: when the top variant is broken, tuning falls back to the next-best feed instead of abandoning native streaming, the audio track is paired to the video variant actually selected, recordings no longer drift out of sync when a stream brings up a second audio or video track partway through capture, and encrypted channels whose playlists write the decryption IV in uppercase hex decrypt correctly.
  • Fix: native HLS streams now stay locked to the channel you tuned - the manifest PrismCast adopts is tied to the channel actually selected rather than whichever happened to arrive last, a token refresh hours into a recording re-tunes and verifies that same channel instead of silently drifting to the provider's default, and a refresh that hits transient trouble retries with backoff while binding the best feed the running stream can actually use, so token-protected channels survive refresh trouble without timers piling up.
  • Fix: services that put a static "channel bumper" in front of their live player (PBS Kids, for example) no longer produce a frozen stream that repeats one slate image - PrismCast now recognizes the bumper at tune time and serves the channel through screen capture immediately.
  • Fix: channel recovery is more reliable across providers - a stream that has to re-tune itself on Xfinity, Cox, DirecTV, or Hulu no longer stalls or falls back to a slow full guide reload; empty-guide recovery on Spectrum and YouTube TV recovers the one stream alone instead of clearing site data out from under a second active stream on the same service, releasing the browser resources it borrowed; and a resolution-degraded stream no longer gets stuck in a recovery loop after the page reloads.
  • Fix: Hulu channels whose guide name differs from the name you tune - local affiliates showing call signs, and punctuation variants like C-SPAN3 - now reuse their remembered guide position on repeat tunes instead of re-running the full 10-15 second guide search every time.
  • Fix: a browser tab that freezes mid-stream can no longer snowball into a dead recording - health checks now run one at a time instead of piling up against the frozen tab, where the pile-up could burn the entire recovery budget in an instant and terminate the stream while the real fix (replacing the hung tab) was still in flight. Hung tabs are still detected and replaced in about twenty seconds, and each recovery gets its full grace period, measured from when the recovery finished rather than when the health check began.
  • Fix: a channel's remembered direct watch URL now survives a tune that fails because the page or tab died mid-tune - only failures that say something about the URL itself evict it, so one browser hiccup no longer forces every later tune through full guide navigation, the path most likely to also be struggling during a provider incident.
  • Fix: nothing left over from an old stream can disturb a newer one on the same channel - a stream that is re-tuning no longer interferes with its replacement, a circuit-breaker verdict arriving after the channel was re-tuned terminates only the stream whose monitor reached it (never the replacement, and never twice), and stopping a stream responds immediately instead of waiting out a timeout.
  • Fix: starting two streams at the same instant could take the whole server down - capture startup is now serialized, so a failure affects only the stream that hit it. A stream request arriving while the old Chrome is still shutting down waits its turn instead of launching a second browser against the same profile, and a failed post-cooldown test launch re-enters the cooldown instead of resuming immediate relaunches.
  • Fix: stopping or restarting the server no longer leaves a stray Chrome process behind, and your latest channel health is saved on the way out. Slow-tuning channels can no longer have their browser tab closed out from under them mid-tune by the stale-page cleanup, and page tracking is fully reset at stream end and across browser restarts.
  • Fix: startup and shutdown are better behaved in bad conditions - when its port is already in use, PrismCast logs a clear message and exits instead of appearing to start while serving nothing, a shutdown signal during startup no longer wipes your channel health history, and a hung FFmpeg encode during startup degrades startup instead of hanging the server.
  • Fix: the in-app upgrade button now works - clicking "Start Upgrade" reported an error instead of upgrading on npm and Homebrew installs. Upgrading from the command line was unaffected.
  • Fix: web interface flow is smoother - the deferred-restart prompt now closes and restarts on its own once your streams end, the Channels DVR playlist reload hint appears for every change that affects the playlist (bulk operations and tag management included), and switching between the Config and Channels tabs no longer carries the other tab's subtab into the address bar, which could land a blank panel on back or forward navigation.
  • Fix: channel and configuration edits take effect predictably - configuration saves applied in rapid succession always leave the server running the newest saved state, editing a channel's URL, selector, or profile applies on the next tune instead of being masked for up to a day by a cached encryption probe, and editing a channel back to a variant's predefined values reverts it cleanly instead of leaving stale overrides behind.
  • Fix: profile editing is sturdier...a hand-edited profile that inherits from itself no longer hangs the settings page or the playlist, fields keep their exact text across editing round trips - a value containing an ampersand or markup-like text no longer changes each time the profile is reopened and saved - and imported settings and service packs are checked more carefully, rejecting values that don't match their expected type and stripping stray whitespace and invisible characters from text settings.
  • Fix: channel discovery is more dependable across Sling, HBO Max, DirecTV, Xfinity, Cox, and YouTube TV - a partial lineup read retries instead of being marked complete, removed channels drop from the cached lineup, a refreshed discovery no longer inherits stragglers from the walk it cancelled, and aborted discoveries settle promptly instead of polling out their clocks.
  • Fix: a channel that names a profile requiring a channel selector it doesn't define no longer has its choice silently replaced - a warning names the substitution at tune time.
  • Fix: HDHomeRun emulation plays nicer at the edges - the last available tuner is no longer wrongly rejected with an "all tuners in use" error when you're at the maximum number of concurrent streams, and an ampersand or angle bracket in your friendly name no longer breaks Plex's tuner discovery, so names like "Living Room & Office" work.
  • Fix: service management on Linux is more dependable - prismcast service install --force restarts a running service instead of leaving the old process in place, installing as a systemd service from a path containing a space generates a working service file, and the stale-path check reads both old and new service files.
  • Housekeeping.
7 Likes

It's not installing using homebrew.

Got the same error (npm error notarget No matching version found for [email protected]) doing brew upgrade prismcast, so did brew uninstall prismcast and then brew install prismast.

chDVRuser@chDVRusers-Mac-mini ~ % brew install hjdhjd/prismcast/prismcast
==> Would install 1 formula:
prismcast
==> Fetching downloads for: prismcast
βœ”οΈŽ Formula prismcast (1.11.0)                                                                Verified      1.5MB/  1.5MB
==> Installing prismcast from hjdhjd/prismcast
==> npm install --loglevel=silly --global --build-from-source --min-release-age=1 --cache=/Users/chDVRuser/Library/Cache
Last 15 lines from /Users/chDVRuser/Library/Logs/Homebrew/prismcast/01.npm.log:
npm verbose stack     at module.exports (/opt/homebrew/Cellar/node/26.7.0/libexec/lib/node_modules/npm/node_modules/npm-pick-manifest/lib/index.js:210:23)
npm verbose stack     at RegistryFetcher.manifest (/opt/homebrew/Cellar/node/26.7.0/libexec/lib/node_modules/npm/node_modules/pacote/lib/registry.js:130:54)
npm verbose stack     at async #fetchManifest (/opt/homebrew/Cellar/node/26.7.0/libexec/lib/node_modules/npm/node_modules/@npmcli/arborist/lib/arborist/build-ideal-tree.js:1346:20)
npm error code ETARGET
npm error notarget No matching version found for [email protected] with a date before 8/16/2026, 2:30:51 AM.
npm error notarget In most cases you or one of your dependencies are requesting a package version that doesn't exist.
npm silly unfinished npm timer reify 1786933851722
npm silly unfinished npm timer reify:loadTrees 1786933851723
npm verbose cwd /private/tmp/prismcast-20260816-44520-s9gqup/package
npm verbose os Darwin 25.6.0
npm verbose node v26.7.0
npm verbose npm  v11.19.0
npm verbose exit 1
npm verbose code 1
npm error A complete log of this run can be found in: /Users/chDVRuser/Library/Caches/Homebrew/npm_cache/_logs/2026-08-17T02_30_51_648Z-debug-0.log

If reporting this issue please do so at (not Homebrew/* repositories):
  https://github.com/hjdhjd/homebrew-prismcast/issues
1 Like

looks like you gotta wait 24 hours bc of a new dependancy

Guess I shouldn't have uninstalled the old version of prismcast.
Is there a way using brew install to install the older version 1.10.3?

I'm still working on prismcast+ I wish some of my additions could be merged like support for click behavior and auto logins I'm working on
.I also will be releasing these channels on linear (it baton hands off between events and then shows schedule when no event on so you can dvr stuff better before it airs so you don't miss anything

ESPN on abc
SEC+ 1-7
ACCX 1-7
ESPNSelect 1-80(maybe 100) not sure

Right now espn4cc4c only works per event as does a4hc it doesn't baton handoff. Mine scrapes guide data and grabs links and baton hands off

Would be cool if we could merge the code together so linear channels work too. I have those working already. Though it has to reload after the title switches as well so it loads the page twice. Suboptimal but it doesn't have to be manually loaded, ESPN will just play as will ESPNSelect and abc/sec+/accx

Uh oh. New update broke prismcast. I can't even start it

[2026/08/17 06:20:49.753 AM] [ERROR] Fatal startup error occurred: AsyncDisposableStack is not defined.

My provider is Xfinity. When I use Manage Channels to set up service, it seems to work: instead of giving me a login page, it indicates that it recognizes me - from previous logins, I assume.

However, often as not, when I try to actually play a channel, in Chrome I get an endless loop of a big purplescreen saying "xfinity stream" with 3 cycling dots underneath. That lasts for a few seconds, then the same thing repeats. And of course in Channels, I get no video and it gives up.

Sometimes I've been able to get this behavior to "reset" by killing the server and restarting it, or rebooting, but more commonly, it just continues on like this until it somehow breaks out and I get the expected behavior - but finding the right stick to poke at it to break out of it (it seems kinda random) can take hours or longer.

I'd hoped that 1.11 would fix the issue, but if anything, it's gotten worse. Help would be greatly appreciated.

I did search posts and if there's anything similar there I didn't find it.

1 Like

Also seeing problems when trying to upgrade, fortunately on my "test server". Stack is stuck in perpetual "starting up".

Logs from Stack install show this error repeating (same as @Jean0987654321):

[2026/08/17 10:07:08.667 AM] [ERROR] Fatal startup error occurred: AsyncDisposableStack is not defined.

This is on a Debian Server Linux 13.6.

Chat GBT was able to help me identify the issue and get a workaround. Not sure if the below modification to the YAML/Stack is an edge case solution just for me or if others would have need to this solution (GhatGBT should be able to help you find the right path if it's different than mine).

Biggest headache was getting the commands typed in the Container bash prompt as ChatGBT was trying to diagnose the issue, it kept reseting every 10-12 seconds and copy and past was pulling in weird characters so I had to quickly type and/or modify and hit enter otherwise I had to start over.

The PrismCast 1.11.0 image already contains the fixβ€”it just isn't loading the polyfill before app.js tries to use AsyncDisposableStack.

We can work around this without changing Node, Debian, your GPU setup, or your /opt/prismcast data.

What we're going to do

We'll tell Node to load the PrismCast polyfill before PrismCast starts.

The cleanest way is to use Node's NODE_OPTIONS environment variable with --import.

1. Edit your Portainer stack

Go to:

Portainer β†’ Stacks β†’ prismcast β†’ Editor

Find:

    environment:
      - PORT=${PORT:-5589}

Change it to:

    environment:
      - PORT=${PORT:-5589}
      - NODE_OPTIONS=--import=/usr/lib/node_modules/prismcast/node_modules/homebridge-plugin-utils/dist/polyfills.js
      - VNC_PORT=${VNC_PORT:-5900}
      - NOVNC_PORT=${NOVNC_PORT:-6080}
      - HDHR_PORT=${HDHR_PORT:-5004}
      - DISPLAY_NUM=${DISPLAY_NUM:-99}
      - SCREEN_WIDTH=${SCREEN_WIDTH:-3840}
      - SCREEN_HEIGHT=${SCREEN_HEIGHT:-2160}
      - SCREEN_DEPTH=${SCREEN_DEPTH:-24}
      - LIBVA_DRIVER_NAME=${LIBVA_DRIVER_NAME:-iHD}

Don't add a second environment: section. Just add that one NODE_OPTIONS line to your existing section.
1 Like

Huh, I thought I'd be the one to have a problem, but, for me, it's working great in Windows 10 with native install. Did a bunch of 10 minute tests with both direct and PrismCast DRM bridge, and all seemed happy and relatively stable.

Just ran brew install hjdhjd/prismcast/prismcast and now it installed.
Not sure why I was getting that error yesterday.

I suspect it's some sort of security thing to make sure brand new dependencies are a certain age? straight guessing here.

1 Like

In place upgrade failed with message "Upgrade failed: streamData is not defined"
Trying a manual reinstall next
Got this
C:\Users\Bill>prismcast upgrade
Upgrading PrismCast...
Install method: npm (global)
Running: npm install -g prismcast@latest

Upgrade is running in the background.
If PrismCast is registered as a Windows service, the helper will restart it when the upgrade completes; otherwise, restart PrismCast manually.
Helper log: C:\Users\Bill.prismcast\upgrade.log
Assertion failed: !(handle->flags & UV_HANDLE_CLOSING), file src\win\async.c, line 76

C:\Users\Bill># or: npm install -g prismcast

Ran
npm install -g prismcast...............upgrade all good
and upgraded npm while i was mucking around mt Win 11 Chanels PC

oh yeah i'm crash-looping

Looks like same node issue

Image ships with node 22.x - Node 24 provides the AsyncDisposableStack api

Hmm...bizarre but I was able to get it going on Docker/Lubuntu system with @jator solution

There is an issue with Prismcast V 1.11.0.
It has been noted in the issues section on github for Prismcast.
"Update node to 24 to support AsyncDisposableStack
#49"
This app can no longer use node 22.20 because of AsyncDisposableStack. Update the package.json and make the minimum version of node to 24 then delete the package-lock file and node modules folder and re-run npm install and commit to resolve this issue.

This is where it errors out. You have to use version [v1.10.3] if you want avoid this error. Or wait for the developer to fix it in an upcoming version.

And wait, and wait ... :wink:

13 posts were split to a new topic: Need Help with PrismCast Crashes, Lock-Ups and Being Unable to Install It with the Latest Chrome in Windows 11

Which version installed?

1.11.0

So question.. when I try to use NFL Network which uses Xfinity Stream, when I first try to launch it will give an error about not loading.. if I do it maybe 3 more times,then it eventually loads. Is there a threshold settting I need to adjust?

Thank you!