PrismCast

v1.4.0-2026.02.20 → v1.13.0 GitHub · More by HJD
● Connecting...
No active streams

What Is PrismCast?

PrismCast captures live video from web-based TV players by driving a real Chrome browser. It navigates to streaming sites, captures the screen and audio output, and serves the result as HLS streams over HTTP. Think of it as a virtual TV tuner for web-based content — it lets Channels DVR (and other applications) record and watch content from streaming sites that do not offer direct video URLs.

PrismCast is built around three priorities, in order:

  1. Reliability — tuning a channel always delivers that channel. When the primary approach fails, fallback strategies ensure the tune still succeeds.
  2. Health monitoring — once a channel is playing, PrismCast continuously monitors the stream and takes corrective action automatically if issues arise.
  3. Speed — tuning and recovery should be as fast as possible, but never at the expense of reliability.

The ordering is intentional. PrismCast will always choose the reliable path over the fast one.

Video Quality

PrismCast delivers H.264 video with AAC stereo audio at configurable quality presets ranging from 480p to 1080p. Quality presets can be changed in the Configuration tab.

This is not a replacement for native 4K, HDR, Dolby Vision, or surround sound — it is screen capture, not a direct feed. PrismCast captures directly from Chrome's media pipeline with no video transcoding, which is why tuning is fast and CPU usage stays low. The result is good quality video that works well for everyday viewing and DVR recording. PrismCast is designed for content you cannot get any other way in Channels DVR: network streaming sites, free ad-supported TV, and live channels that only exist on the web.

Quick Start

To add PrismCast channels to Channels DVR:

  1. Go to Settings → Custom Channels in your Channels DVR server.
  2. Click Add Source and select M3U Playlist.
  3. Enter the playlist URL: https://thedudesprismcast.ddns.net/playlist Copied!
  4. Set Stream Format to HLS.
  5. The 105 configured channels will be imported automatically.

Individual channels can also be streamed directly using HLS URLs like https://thedudesprismcast.ddns.net/hls/nbc/stream.m3u8.

Plex Integration

PrismCast includes built-in HDHomeRun emulation, allowing Plex to use it as a network tuner for live TV and DVR recording.

  1. In Plex, go to Settings → Live TV & DVR → Set Up Plex DVR.
  2. Enter your PrismCast server address with port 5004 (e.g., 192.168.1.100:5004).
  3. Plex will detect PrismCast as an HDHomeRun tuner and import available channels.

HDHomeRun emulation is enabled by default and can be configured in the HDHomeRun / Plex configuration tab.

Tuning Speed

When a client requests a channel, PrismCast navigates Chrome to the streaming site, locates the video player, starts capture, and serves the first HLS segment. How long this takes depends on the channel type:

Direct URL Channels (~3–5 seconds)

Sites where PrismCast navigates directly to a player page and video starts automatically. Examples: NBC, ABC, Paramount+, USA Network.

Guide-Based Providers — First Tune (~5–10 seconds)

Sites where PrismCast navigates a live TV guide to find and select the channel. The first tune for a given channel is slower because the guide grid must be searched. Examples: HBO Max, Hulu, Sling TV, YouTube TV, Fox.

Guide-Based Providers — Subsequent Tunes (~3–5 seconds)

After the first tune, PrismCast caches channel data for HBO Max, Hulu, Sling TV, and YouTube TV. Subsequent tunes skip guide navigation entirely and are comparable to direct URL channels. If cached data becomes stale, PrismCast falls back to guide navigation transparently.

Idle Window

Streams stay alive for 30 seconds after the last client disconnects (configurable in the Configuration tab). This means channel surfing in Channels DVR is instant for recently-viewed channels — no re-tuning is needed. Combined with channel caching, the system gets faster the more you use it.

Channel Authentication

Many streaming channels require TV provider authentication before content can be accessed. To authenticate:

  1. Go to the Channels tab.
  2. Click the Login button next to the channel you want to authenticate.
  3. A browser window will open with the channel's streaming page.
  4. Complete the TV provider sign-in process in the browser.
  5. Click Done when authentication is complete.

Your login credentials are saved in the browser profile and persist across restarts. You only need to authenticate once per TV provider. The Login button is stateless and always displays “Login” regardless of authentication status — successful authentication is confirmed when the channel streams correctly. Some TV providers periodically expire sessions on their end, requiring re-authentication. This is a provider limitation, not a PrismCast issue — simply click Login again to re-authenticate.

If PrismCast is running headless or on a remote server, use a VNC client to access the browser for authentication.

Working with Channels

Predefined Channels

PrismCast ships with channels across multiple streaming providers, maintained and updated with each release. You can disable any channels you do not need from the Channels tab. The predefined set covers common networks and is a good starting point — enable what you watch and disable the rest. You can also override any predefined channel with your own custom definition (see Overriding Predefined Channels below).

Provider Variants

Some channels (ESPN, Fox, NBC, etc.) are available from multiple streaming providers. The provider dropdown on each channel lets you choose which service to use for that channel. Different providers may offer different tuning performance.

Provider Filter

If you only subscribe to certain streaming services, use the provider filter on the Channels tab toolbar to show only relevant channels. This filter also applies to the M3U playlist, so Channels DVR only imports channels from providers you actually use. You can also filter programmatically using the ?provider= query parameter on the playlist URL.

Bulk Operations

The Set all channels to dropdown on the Channels tab toolbar switches every multi-provider channel to a single provider at once. This is useful when you want all channels routed through one streaming service. The operation can be undone by switching individual channels back or selecting a different provider from the same dropdown.

User-Defined Channels

You can add custom channels for any streaming site. Provide a URL, select a site profile, and PrismCast will capture it. For sites with multiple live channels (like a live TV provider), the Channel Selector field tells PrismCast which channel to tune to — the expected value depends on the provider. When adding or editing a channel, select a profile to see the Profile Reference section with site-specific guidance, including expected channel selector formats for known providers.

Overriding Predefined Channels

To override a predefined channel, create a user-defined channel with the same channel key. Both versions will appear in the provider dropdown — yours labeled Custom and the original with its provider name. You can switch between them at any time.

For automation and integration with other workflows, see the API Reference tab for the full HTTP API.

Requirements

See the Help tab for platform-specific requirements and troubleshooting.

Define and manage streaming channels for the playlist. Your custom channels are highlighted.

Tip: To override a predefined channel, add a custom channel with the same key. When adding or editing a channel, select a profile to see the Profile Reference with site-specific guidance for known providers.

Providers:
YouTube TV
Set all channels to:
Key Name Source Profile Actions
abc ABC auto
ae A&E auto
ahc American Heroes Food Network auto
amc AMC auto
amcthrillers AMC Thrillers YouTube TV auto
animal Animal Planet auto
bet BET auto
bigten Big 10 auto
bravo Bravo auto
bravop Bravo (Pacific) NBC.com auto
cbs CBS auto
cmt CMT auto
cnbc CNBC auto
cnn CNN auto
cnni CNN International auto
comedycentral Comedy Central auto
cooking Cooking Food Network auto
cspan C-SPAN auto
cspan2 C-SPAN 2 auto
cspan3 C-SPAN 3 auto
cw CW auto
discovery Discovery auto
discoverylife Discovery Life Food Network auto
discoveryturbo Discovery Turbo auto
disney Disney auto
disneyjr Disney Jr. auto
disneyxd Disney XD auto
e E! auto
ep E! (Pacific) No available providers auto
espn ESPN auto
espn2 ESPN2 auto
espnacc ACC Network auto
espndeportes ESPN Deportes auto
espnews ESPNews auto
espnsec SEC Network auto
espnu ESPNU auto
fbc Fox Business auto
fnc Fox News auto
food Food Network auto
fox Fox auto
foxdeportes Fox Deportes auto
foxsoccerplus Fox Soccer Plus auto
france24 France 24 auto
france24fr France 24 (French) auto
fs1 FS1 auto
fs2 FS2 auto
fx FX auto
fxm FXM auto
fxp FX (Pacific) ABC.com auto
fxx FXX auto
fxxp FXX (Pacific) ABC.com auto
fyi FYI auto
golf Golf auto
hallmark Hallmark auto
hallmarkfamily Hallmark Family auto
hallmarkmystery Hallmark Mystery auto
hbo HBO auto
hbocomedy HBO Comedy auto
hbodrama HBO Drama auto
hbohits HBO Hits auto
hbomovies HBO Movies auto
hgtv HGTV auto
history History auto
hln HLN auto
id Investigation Discovery auto
ifc IFC auto
indieplex IndiePlex No available providers auto
lifetime Lifetime auto
lmn Lifetime Movie Network No available providers auto
magnolia Magnolia Network auto
mlb MLB Network No available providers auto
movieplex MoviePlex No available providers auto
msnow MS NOW auto
natgeo National Geographic auto
natgeop National Geographic (Pacific) Nat Geo auto
natgeowild Nat Geo Wild auto
nba NBA TV auto
nbc NBC auto
nbcnews NBC News Now auto
nbcsbayarea NBC Sports Bay Area NBC.com auto
nbcsboston NBC Sports Boston NBC.com auto
nbcscalifornia NBC Sports California NBC.com auto
nbcsphiladelphia NBC Sports Philadelphia NBC.com auto
necn NECN NBC.com auto
own OWN auto
oxygen Oxygen auto
oxygenp Oxygen (Pacific) No available providers auto
pbs PBS auto
pbschicago PBS Chicago (WTTW) auto
pbslakeshore PBS Lakeshore (WYIN) auto
retroplex RetroPlex No available providers auto
science Science Food Network auto
showtime Showtime auto
showtimep Showtime (Pacific) No available providers auto
starz Starz auto
starzcinema Starz Cinema auto
starzcomedy Starz Comedy auto
starzedge Starz Edge auto
starzencore Starz Encore auto
starzencoreaction Starz Encore Action auto
starzencoreblack Starz Encore Black auto
starzencoreclassic Starz Encore Classic auto
starzencorefamily Starz Encore Family auto
starzencorep Starz Encore West auto
starzencoresuspense Starz Encore Suspense auto
starzencorewesterns Starz Encore Westerns auto
starzinblack Starz in Black auto
starzkids Starz Kids & Family auto
starzp Starz West auto
syfy Syfy auto
syfyp Syfy (Pacific) No available providers auto
tbs TBS auto
tbsp TBS (Pacific) auto
tlc TLC auto
tnt TNT auto
tntp TNT (Pacific) auto
travel Travel auto
trutv truTV auto
trutvp truTV (Pacific) auto
usa USA Network auto
usap USA Network (Pacific) No available providers auto
vh1 VH1 auto
weather The Weather Channel auto
Connecting...
Environment Variable Overrides
Some settings are overridden by environment variables and cannot be changed through this interface. To modify these settings, update your environment variables and restart the server.

Configure common server and streaming options.

Reset to Defaults
Server
TCP port for the HTTP server. Channels DVR and other clients connect here.
Default: 5589
IP address to bind the HTTP server. Use 0.0.0.0 for all interfaces, 127.0.0.1 for local only.
Default: 0.0.0.0
Browser
Path to Chrome executable. Leave empty to autodetect.
Default: autodetect
Overridden by environment variable: CHROME_BIN=/usr/local/bin/chrome-no-sandbox
seconds
Maximum wait after browser launch for the puppeteer-stream extension to initialize. The system polls for readiness and proceeds early when ready. Increase if streams start with blank frames.
Default: 1 second
Capture
FFmpeg (recommended) provides reliable capture for long recordings. Native mode captures directly from Chrome without an external process, but may require stream recovery after 20-30 minutes of continuous use.
Native capture mode is temporarily disabled due to a Chrome bug that causes fMP4 MediaRecorder to produce corrupt output after 20-30 minutes of continuous recording. FFmpeg mode is required until a future Chrome release resolves this issue.
Default: ffmpeg
Video quality preset. Determines capture resolution. Bitrate and frame rate can be further customized.
Default: 720p-high
Mbps
Video bitrate for browser capture. HLS copies this stream directly (no re-encoding). 8Mbps suits 720p; 15-20Mbps for 1080p.
Default: 12 Mbps
kbps
Audio bitrate for browser capture. HLS copies this stream directly (no re-encoding). 256kbps provides high-quality stereo audio.
Default: 256 kbps
fps
Target frame rate. 60fps is ideal for sports; 30fps works for most TV content.
Default: 60 fps
HDHomeRun / Plex
Enable HDHomeRun emulation for Plex integration. When enabled, PrismCast runs a second HTTP server that emulates an HDHomeRun tuner, allowing Plex to use PrismCast as a live TV source. In Plex, go to Settings > Live TV & DVR > Set Up Plex DVR and enter this server's address manually as IP:port (e.g., 192.168.1.100:5004).
Default: true
TCP port for the HDHomeRun emulation server. This is the port you enter in Plex when manually adding the tuner (e.g., 192.168.1.100:5004).
Default: 5004
Display name shown in Plex for this tuner. Helps identify PrismCast when you have multiple HDHomeRun devices.
Default: PrismCast

Expert tuning options. The defaults work well for most setups.

Reset All to Defaults
▶ HLS (3 settings)
seconds
Target duration for each HLS segment. Shorter segments reduce latency but increase overhead.
Default: 2 seconds
Maximum segments to keep in memory per stream. Controls buffer depth and memory usage.
Default: 10
seconds
Time before an idle HLS stream is terminated. Applies when no segment requests are received.
Default: 30 seconds
▶ Logging (2 settings)
HTTP request logging level. "none" disables logging, "errors" logs only 4xx/5xx responses, "filtered" logs important requests while skipping high-frequency endpoints, "all" logs everything.
Default: errors
MB
Maximum log file size in bytes. When exceeded, the file is trimmed to half this size keeping the most recent logs.
Default: 1 MB
▶ Paths (2 settings)
Absolute path override for Chrome's user data directory. When set, Chrome profile data is stored at this path instead of the default location inside the data directory. Useful for placing Chrome data on a different volume.
Default: autodetect
Absolute path override for the log file. When set, logs are written to this path instead of the default location inside the data directory.
Default: autodetect
▶ Playback (12 settings)
seconds
Grace period for buffering before declaring a stall. Prevents false positives from brief network hiccups.
Default: 10 seconds
seconds
Delay after clicking a channel selector before checking for video.
Default: 5 seconds
seconds
Delay after channel switch for stream to stabilize before health monitoring begins.
Default: 4 seconds
seconds
Delay after clicking video element to initiate playback on Brightcove-based players. Currently unused — waitForVideoReady() handles the wait automatically.
Default: 1 second
seconds
Delay for iframe content to initialize before searching for video elements.
Default: 1.5 seconds
Maximum full page navigations allowed within the reload window. Prevents reload loops on broken streams.
Default: 3
seconds
Interval between playback health checks. Shorter intervals detect problems faster but use more CPU.
Default: 2 seconds
minutes
Time window for tracking page reload frequency. After this period, the reload counter resets.
Default: 15 minutes
seconds
Delay after reloading video source before resuming monitoring.
Default: 2 seconds
Consecutive stalled checks before triggering recovery.
Default: 2
seconds
Minimum change in video.currentTime (seconds) to consider playback progressing.
Default: 0.1 seconds
seconds
Duration of healthy playback required before resetting escalation level. Prevents stutter loops.
Default: 60 seconds
▶ Recovery (6 settings)
seconds
Random jitter added to retry delays. Prevents thundering herd on retries.
Default: 1 second
Failures within circuit breaker window that trigger stream termination.
Default: 10
minutes
Time window for counting failures toward circuit breaker.
Default: 5 minutes
seconds
Maximum delay between retry attempts. Exponential backoff is capped at this value.
Default: 3 seconds
seconds
Interval between stale page cleanup runs. Identifies and closes orphaned browser pages.
Default: 60 seconds
seconds
Grace period before closing a page that appears stale. Prevents race conditions during initialization.
Default: 30 seconds
▶ Streaming (4 settings)
Maximum simultaneous streams. Each stream uses a browser tab and resources.
Default: 10
Maximum navigation retry attempts before giving up.
Default: 4
seconds
Timeout for page navigation. Increase for slow networks or heavy pages.
Default: 10 seconds
seconds
Timeout for video element to become ready after navigation.
Default: 11 seconds

Export and import configuration and channel data.

Settings Backup

Download Settings

Download your current server configuration as a JSON file. This includes all settings (server, browser, streaming, playback, etc.) but does not include channel definitions.

Import Settings

Import a previously saved settings file. After importing, you will need to restart PrismCast for changes to take effect.

Channels Backup

Download Channels

Download your custom channel definitions as a JSON file. This includes only user-defined channels, not the predefined channels built into PrismCast.

Import Channels

Import channel definitions from a previously saved file. This will replace all existing user channels.

Configuration file: /root/.prismcast/config.json

PrismCast provides a RESTful HTTP API for streaming, management, and diagnostics.

Streaming

EndpointDescription
GET /hls/:name/stream.m3u8 HLS playlist for a named channel. Example: /hls/nbc/stream.m3u8
GET /hls/:name/init.mp4 fMP4 initialization segment containing codec configuration.
GET /hls/:name/:segment.m4s fMP4 media segment containing audio/video data.
GET /play Stream any URL without creating a channel definition. Pass the URL as ?url=<url>. Advanced: &profile= overrides auto-detection, &selector= picks a channel on multi-channel sites, &clickToPlay=true clicks the video to start playback, &clickSelector= specifies a play button element to click (implies clickToPlay).
GET /stream/:name MPEG-TS stream for HDHomeRun-compatible clients (e.g., Plex). Remuxes fMP4 to MPEG-TS with codec copy.

Playlist

EndpointDescription
GET /playlist M3U playlist of all channels in Channels DVR format. Use this URL when adding PrismCast as a custom channel source. Optional ?provider= query parameter filters by streaming provider: ?provider=yttv (single), ?provider=yttv,sling (multi-include), ?provider=-hulu (exclude). Tags are case-insensitive. This only controls which channels appear in the playlist, not which provider is used for tuning.

Management

EndpointDescription
GET /channels List all channels (predefined + user) as JSON with source, enabled status, and channel metadata.
GET /streams List all currently active streams with their ID, channel, URL, duration, and status.
GET /streams/status Server-Sent Events stream for real-time stream and system status updates.
DELETE /streams/:id Terminate a specific stream by its numeric ID. Returns 200 on success, 404 if not found.

Authentication

EndpointDescription
POST /auth/login Start login mode for a channel. Body: { "channel": "name" } or { "url": "..." }
POST /auth/done End login mode and close the login browser tab.
GET /auth/status Get current login status including whether login mode is active and which channel.

Configuration

EndpointDescription
POST /config Save configuration settings. Returns { success, message, willRestart, deferred, activeStreams }
GET /config/export Export current configuration as a JSON file download.
POST /config/import Import configuration from JSON. Server restarts to apply changes (if running as service).
POST /config/restart-now Force immediate server restart regardless of active streams. Only works when running as a service.
POST /config/channels Add, edit, or delete user channels. Body includes action (add/edit/delete) and channel data.
GET /config/channels/export Export user-defined channels as a JSON file download.
POST /config/channels/import Import channels from JSON, replacing all existing user channels.
POST /config/channels/import-m3u Import channels from M3U playlist. Body: { "content": "...", "conflictMode": "skip" | "replace" }
POST /config/channels/toggle-predefined Enable or disable a single predefined channel. Body: { "key": "nbc", "enabled": true }
POST /config/channels/toggle-all-predefined Enable or disable all predefined channels. Body: { "enabled": true }
POST /config/provider Update provider selection for a multi-provider channel. Body: { "channel": "nbc", "provider": "nbc-hulu" }
POST /config/provider-filter Set enabled provider tags. Body: { "enabledProviders": ["hulu", "yttv"] }. Empty array disables filter.
POST /config/provider-bulk-assign Assign a provider to all multi-provider channels. Body: { "provider": "hulu" }. Returns { affected, previousSelections, selections }
POST /config/provider-bulk-restore Restore previous provider selections (undo bulk assign). Body: { "selections": { "nbc": "nbc-hulu", "fox": null } }. A null value restores the channel to its default provider.

Diagnostics

EndpointDescription
GET /health Health check returning JSON with browser status, memory usage, stream counts, and configuration.
GET /logs Recent log entries as JSON. Query params: ?lines=N (default 100, max 1000), ?level=error|warn|info
GET /logs/stream Server-Sent Events stream for real-time log entries. Query param: ?level=error|warn|info

Example: Health Check Response

{
  "browser": { "connected": true, "pageCount": 2 },
  "captureMode": "ffmpeg",
  "chrome": "Chrome/144.0.7559.110",
  "clients": { "byType": [{ "count": 1, "type": "hls" }], "total": 1 },
  "ffmpegAvailable": true,
  "memory": { "heapTotal": 120000000, "heapUsed": 85000000, "rss": 150000000, "segmentBuffers": 25000000 },
  "status": "healthy",
  "streams": { "active": 1, "limit": 10 },
  "timestamp": "2026-01-26T12:00:00.000Z",
  "uptime": 3600.5,
  "version": "1.0.12"
}

Updating PrismCast

Settings and channel configurations are preserved across updates.

Homebrew (macOS)

brew upgrade prismcast
prismcast service restart

npm

npm install -g prismcast
prismcast service restart

Docker

Pull the latest image and recreate the container. If using Watchtower, updates are applied automatically.

docker pull ghcr.io/hjdhjd/prismcast:latest
docker compose up -d

Display and Resolution

PrismCast captures video from Chrome's display output. The capture resolution must be smaller than the physical display resolution because browser toolbars and window chrome consume approximately 100–150 vertical pixels. For example, to capture at 1080p (1920×1080), the display must be larger than 1080p.

When the selected quality preset exceeds what the display can provide, PrismCast logs a warning and automatically degrades to the best available preset. This is not an error — PrismCast is adapting to your display.

Headless Servers

macOS works without a physical monitor. Windows and Linux servers without a display need an HDMI dummy plug or a virtual display adapter to provide a display resolution for Chrome to render into.

Remote Access

macOS Screen Sharing and VNC work correctly. Windows Remote Desktop (RDP) does not work — RDP creates a virtual display with different properties that interfere with Chrome's rendering. Use VNC or connect a physical display on Windows.

Platform Notes

macOS

Chrome on macOS uses GPU hardware acceleration for video encoding, providing the best capture performance. After installing Node.js, go to System Settings → Privacy & Security → App Management and allow Node.js. Use Screen Sharing or VNC for remote access to the PrismCast machine.

Windows

Install PrismCast as a service with prismcast service install. See Remote Access above for display capture requirements.

Linux / Docker

Chrome cannot use GPU hardware acceleration with virtual displays on Linux (a Chrome limitation), so Docker containers rely on software rendering. Access the browser via VNC for authentication — Docker containers expose noVNC at port 6080.

Troubleshooting

ProblemCauseSolution
"Browser Offline" or "Browser is not connected" An existing Chrome process is running. Quit all Chrome instances, then restart PrismCast.
"All tuners in use" despite no active streams Stale stream state. Restart PrismCast service.
Chrome won't open for login Running headless or as a service. Access the PrismCast machine via VNC or Screen Sharing to complete authentication.
macOS blocks Node.js after install App Management security gate. System Settings → Privacy & Security → App Management → Allow Node.js.
Port conflict (address in use) Another service using port 5589. Stop the conflicting service, or change the port in Configuration.

Known Limitations

Restart Required

Configuration saved. 0 active stream(s) will be interrupted if you restart now.

Waiting for streams to end...

What's new

Loading...
View on GitHub