| No active streams |
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:
The ordering is intentional. PrismCast will always choose the reliable path over the fast one.
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.
To add PrismCast channels to Channels DVR:
https://thedudesprismcast.ddns.net/playlist
Copied!Individual channels can also be streamed directly using HLS URLs like https://thedudesprismcast.ddns.net/hls/nbc/stream.m3u8.
PrismCast includes built-in HDHomeRun emulation, allowing Plex to use it as a network tuner for live TV and DVR recording.
192.168.1.100:5004).HDHomeRun emulation is enabled by default and can be configured in the HDHomeRun / Plex configuration tab.
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:
Sites where PrismCast navigates directly to a player page and video starts automatically. Examples: NBC, ABC, Paramount+, USA Network.
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.
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.
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.
Many streaming channels require TV provider authentication before content can be accessed. To authenticate:
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.
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).
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.
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.
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.
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.
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.
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.
Export and import configuration and channel data.
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 a previously saved settings file. After importing, you will need to restart PrismCast for changes to take effect.
Download your custom channel definitions as a JSON file. This includes only user-defined channels, not the predefined channels built into PrismCast.
Import channel definitions from a previously saved file. This will replace all existing user channels.
/root/.prismcast/config.jsonPrismCast provides a RESTful HTTP API for streaming, management, and diagnostics.
| Endpoint | Description |
|---|---|
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. |
| Endpoint | Description |
|---|---|
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. |
| Endpoint | Description |
|---|---|
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. |
| Endpoint | Description |
|---|---|
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. |
| Endpoint | Description |
|---|---|
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. |
| Endpoint | Description |
|---|---|
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 |
{
"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"
}
Settings and channel configurations are preserved across updates.
brew upgrade prismcast prismcast service restart
npm install -g prismcast prismcast service restart
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
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.
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.
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.
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.
Install PrismCast as a service with prismcast service install. See Remote Access above for display capture requirements.
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.
| Problem | Cause | Solution |
|---|---|---|
| "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. |