stupside/castorPublic

Point it at any web page and it finds the video, extracts the stream, transcodes it and casts in real time to your TV. It even burns subtitles….

AI summary: A CLI tool for extracting and streaming high-quality web video directly to Chromecast and DLNA devices

Stars
2.4K
+8 today
Forks
87
Watchers
5
Open issues
2
Open PRs
1
Contributors
~6
Commits
157
Branches
2

GoMITCreated Feb 8, 2026Last push 2d agoLatest release v1.9.0+49 stars this week+140 this month

Quick answers

What is castor?
A CLI tool for extracting and streaming high-quality web video directly to Chromecast and DLNA devices
What does castor do?
Castor is a command-line utility that allows users to cast web videos to smart TVs at their native quality, bypassing the resolution drops and latency typical of screen mirroring. When pointed at a web page or direct stream URL, Castor launches a headless Chrome instance, monitors network traffic via the Chrome DevTools Protocol to intercept the actual video stream, and then transcodes or streams it directly to the local casting device. It includes a fallback interaction pipeline to simulate user clicks on iframes to trigger playback on stubborn sites. It also supports resolving media IDs against custom sources and burning in auto-generated subtitles.
Who is castor for?
Castor is for terminal-savvy users, cord-cutters, and developers who want direct control over casting web media to their local devices. It requires basic familiarity with the command line and optionally FFmpeg for advanced transcoding setups.
How do I get started with castor?
brew install stupside/tap/castor
How popular is castor on GitHub?
stupside/castor has 2,386 stars and 87 forks on GitHub, and gained 49 stars in the last 7 days.
What license does castor use?
stupside/castor is released under the MIT license.

Star history

since Jul 29, 2026
01K2KJul 2026Aug 2026Sep 2026Oct 2026
2.4K stars as of Oct 3, 2026. Measured daily since Jul 29, 2026; GitHub no longer exposes earlier star timestamps.

Contribution activity

commits per day, last 52 weeks
OctNovDecJanFebMarAprMayJunJulAugSepMonWedFri2025-10-04: 0 commits2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 0 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 0 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 1 commit2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 0 commits2026-02-17: 0 commits2026-02-18: 3 commits2026-02-19: 0 commits2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 0 commits2026-02-23: 0 commits2026-02-24: 0 commits2026-02-25: 0 commits2026-02-26: 0 commits2026-02-27: 0 commits2026-02-28: 0 commits2026-03-01: 0 commits2026-03-02: 0 commits2026-03-03: 0 commits2026-03-04: 0 commits2026-03-05: 0 commits2026-03-06: 0 commits2026-03-07: 0 commits2026-03-08: 0 commits2026-03-09: 0 commits2026-03-10: 0 commits2026-03-11: 0 commits2026-03-12: 0 commits2026-03-13: 0 commits2026-03-14: 0 commits2026-03-15: 0 commits2026-03-16: 0 commits2026-03-17: 0 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 0 commits2026-03-21: 0 commits2026-03-22: 0 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 0 commits2026-03-26: 0 commits2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 0 commits2026-03-30: 0 commits2026-03-31: 0 commits2026-04-01: 0 commits2026-04-02: 0 commits2026-04-03: 0 commits2026-04-04: 0 commits2026-04-05: 0 commits2026-04-06: 0 commits2026-04-07: 0 commits2026-04-08: 0 commits2026-04-09: 0 commits2026-04-10: 0 commits2026-04-11: 0 commits2026-04-12: 0 commits2026-04-13: 0 commits2026-04-14: 0 commits2026-04-15: 0 commits2026-04-16: 0 commits2026-04-17: 0 commits2026-04-18: 0 commits2026-04-19: 0 commits2026-04-20: 0 commits2026-04-21: 0 commits2026-04-22: 0 commits2026-04-23: 0 commits2026-04-24: 0 commits2026-04-25: 0 commits2026-04-26: 0 commits2026-04-27: 0 commits2026-04-28: 0 commits2026-04-29: 0 commits2026-04-30: 0 commits2026-05-01: 0 commits2026-05-02: 0 commits2026-05-03: 0 commits2026-05-04: 0 commits2026-05-05: 0 commits2026-05-06: 0 commits2026-05-07: 0 commits2026-05-08: 0 commits2026-05-09: 0 commits2026-05-10: 0 commits2026-05-11: 1 commit2026-05-12: 0 commits2026-05-13: 0 commits2026-05-14: 0 commits2026-05-15: 0 commits2026-05-16: 0 commits2026-05-17: 0 commits2026-05-18: 1 commit2026-05-19: 0 commits2026-05-20: 0 commits2026-05-21: 0 commits2026-05-22: 0 commits2026-05-23: 0 commits2026-05-24: 0 commits2026-05-25: 0 commits2026-05-26: 0 commits2026-05-27: 0 commits2026-05-28: 0 commits2026-05-29: 0 commits2026-05-30: 0 commits2026-05-31: 0 commits2026-06-01: 0 commits2026-06-02: 0 commits2026-06-03: 0 commits2026-06-04: 0 commits2026-06-05: 0 commits2026-06-06: 0 commits2026-06-07: 0 commits2026-06-08: 0 commits2026-06-09: 0 commits2026-06-10: 0 commits2026-06-11: 0 commits2026-06-12: 0 commits2026-06-13: 0 commits2026-06-14: 0 commits2026-06-15: 0 commits2026-06-16: 0 commits2026-06-17: 0 commits2026-06-18: 0 commits2026-06-19: 0 commits2026-06-20: 0 commits2026-06-21: 0 commits2026-06-22: 0 commits2026-06-23: 0 commits2026-06-24: 0 commits2026-06-25: 0 commits2026-06-26: 0 commits2026-06-27: 0 commits2026-06-28: 0 commits2026-06-29: 0 commits2026-06-30: 0 commits2026-07-01: 17 commits2026-07-02: 3 commits2026-07-03: 0 commits2026-07-04: 3 commits2026-07-05: 13 commits2026-07-06: 1 commit2026-07-07: 0 commits2026-07-08: 2 commits2026-07-09: 0 commits2026-07-10: 0 commits2026-07-11: 0 commits2026-07-12: 0 commits2026-07-13: 0 commits2026-07-14: 0 commits2026-07-15: 0 commits2026-07-16: 0 commits2026-07-17: 0 commits2026-07-18: 0 commits2026-07-19: 27 commits2026-07-20: 20 commits2026-07-21: 23 commits2026-07-22: 8 commits2026-07-23: 2 commits2026-07-24: 3 commits2026-07-25: 0 commits2026-07-26: 9 commits2026-07-27: 5 commits2026-07-28: 0 commits2026-07-29: 0 commits2026-07-30: 0 commits2026-07-31: 0 commits2026-08-01: 0 commits2026-08-02: 0 commits2026-08-03: 7 commits2026-08-04: 0 commits2026-08-05: 0 commits2026-08-06: 0 commits2026-08-07: 0 commits2026-08-08: 0 commits2026-08-09: 0 commits2026-08-10: 0 commits2026-08-11: 0 commits2026-08-12: 0 commits2026-08-13: 0 commits2026-08-14: 0 commits2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 0 commits2026-08-28: 0 commits2026-08-29: 0 commits2026-08-30: 0 commits2026-08-31: 0 commits2026-09-01: 0 commits2026-09-02: 0 commits2026-09-03: 0 commits2026-09-04: 0 commits2026-09-05: 0 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 0 commits2026-09-09: 0 commits2026-09-10: 0 commits2026-09-11: 0 commits2026-09-12: 0 commits2026-09-13: 0 commits2026-09-14: 0 commits2026-09-15: 0 commits2026-09-16: 0 commits2026-09-17: 0 commits2026-09-18: 0 commits2026-09-19: 0 commits2026-09-20: 0 commits2026-09-21: 0 commits2026-09-22: 3 commits2026-09-23: 0 commits2026-09-24: 0 commits2026-09-25: 0 commits2026-09-26: 0 commits2026-09-27: 0 commits2026-09-28: 1 commit2026-09-29: 0 commits2026-09-30: 0 commits2026-10-01: 0 commits2026-10-02: 0 commits2026-10-03: 0 commits
153 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Permissive license

    MIT

  • Continuous integration

    Automated checks passing

What castor does

Castor is a command-line utility that allows users to cast web videos to smart TVs at their native quality, bypassing the resolution drops and latency typical of screen mirroring. When pointed at a web page or direct stream URL, Castor launches a headless Chrome instance, monitors network traffic via the Chrome DevTools Protocol to intercept the actual video stream, and then transcodes or streams it directly to the local casting device. It includes a fallback interaction pipeline to simulate user clicks on iframes to trigger playback on stubborn sites. It also supports resolving media IDs against custom sources and burning in auto-generated subtitles.

Castor is for terminal-savvy users, cord-cutters, and developers who want direct control over casting web media to their local devices. It requires basic familiarity with the command line and optionally FFmpeg for advanced transcoding setups.

  • Stream interception: uses a headless browser and the Chrome DevTools Protocol to intercept raw video streams from complex web players.
  • Native casting: sends the extracted video directly to the TV for full-resolution playback rather than relying on lossy screen mirroring.
  • Automated interaction: runs a pipeline to automatically click through iframes and play buttons to extract streams from recalcitrant websites.
  • Live transcoding: utilizes FFmpeg to convert incompatible video streams into formats supported by the target casting device on the fly.
  • Subtitle burn-in: automatically generates and burns subtitles directly into the video stream before casting.
  • Terminal user interface: provides an interactive CLI for browsing media, selecting casting devices, and managing playback.

Where teams use it

High-Quality Web Casting

Allows users to cast embedded videos from non-standard websites to their smart TV without resorting to laggy screen mirroring.

IPTV Stream Bridging

Enables users to extract direct IPTV streams from obscure web portals and send them reliably to a Chromecast.

Automated Media Resolution

Lets advanced users configure custom sources to automatically resolve IMDB or TMDB IDs into castable video streams.

Format Conversion

Acts as an intermediary to transcode and cast video files or streams that the smart TV natively refuses to play.

Getting started: brew install stupside/tap/castor

README

main branch

Castor

stupside%2Fcastor | Trendshift

Latest Release Go Reference Homebrew License Build Status

Castor

Smart TVs won't cast arbitrary web video, and screen mirroring is laggy and drops resolution. Castor casts the real stream instead, at full quality, from your terminal.

Point Castor at a web page you are watching, or at a direct stream URL, and it finds the video, extracts the stream, transcodes it for your TV, and casts in real time. It can also resolve an IMDB/TMDB id against sources you configure yourself, and burn in auto-generated subtitles.

To extract, it launches headless Chrome and watches network traffic over the Chrome DevTools Protocol, then runs a short action pipeline to start playback: click the page, navigate into the largest iframe, and click again as a fallback. This works on pages that allow automated playback, and won't work everywhere.

A general-purpose casting tool: it casts only what you point it at. See Purpose and disclaimer.

Browsing titles in the castor TUI
Run castor cast to browse titles and cast, without leaving the terminal.

Installation

Run Castor as a native binary (recommended): it runs on your machine, so it shares your TV's network, which device discovery needs. The binary shells out to three tools that must be on your PATH:

Tool Version Used for
Chrome / Chromium Any recent Headless stream extraction
ffmpeg 7.1+ Transcoding (and stream copy)
ffprobe 7.1+ Source format detection

ffmpeg and ffprobe must be 7.1 or newer: Castor uses flags (-readrate_initial_burst, stricter HLS extension handling) that older builds reject. The Docker image bundles a suitable build (Linux only).

Homebrew (macOS)

brew install --cask stupside/tap/castor

Windows

Download castor_<version>_windows_amd64.zip (or _arm64.zip for Windows on ARM) from the latest release, extract castor.exe into a folder on your PATH, and install the tools:

winget install Gyan.FFmpeg     # ffmpeg + ffprobe
winget install Google.Chrome   # skip if Chrome is already installed

Two prompts on first run, both expected:

  • SmartScreen may block the download since the binary is unsigned: choose More info, then Run anyway.
  • Windows Defender Firewall asks whether castor may use the network: allow it on private networks. The TV fetches the stream from Castor and answers discovery over the LAN, so a blocked castor finds no devices and casts nothing.
Build from source (macOS/Linux, needs Go 1.26+ and cmake)

The whisper.cpp bindings are cgo and link a locally built libwhisper.a, so clone with submodules and build with make:

git clone --recurse-submodules https://github.com/stupside/castor.git
cd castor
make          # builds libwhisper.a, then the castor binary

go install won't work: the vendored whisper.cpp bindings come in through a local replace and need that prebuilt static lib.

Quick start

Tell Castor which TV to use: find its name with castor scan and put it in config.yaml.

device:
  name: "Living Room TV"   # exact name from `castor scan`
  type: dlna

Can't discover the device? Pin it by address

If castor scan finds nothing, point Castor straight at the device by IP and it skips discovery:

device:
  name: "Living Room TV"   # now just a label
  type: dlna
  host: 192.168.0.3        # the device's LAN IP

Discovery uses SSDP/mDNS multicast, which doesn't cross VLANs/subnets and is blocked on Android/Termux (you'll see netlinkrib: permission denied). A pinned host reaches the device by unicast instead, so it works across those networks and skips the discovery wait on every cast.

  • DLNA host is the device IP; Castor asks it for its description over a single unicast request. If your TV doesn't answer that, set host to its full description URL instead (e.g. http://192.168.0.3:9197/dmr).
  • Chromecast / Roku host is the device IP.

On Android/Termux, also leave network.interface empty (the default): pinning one needs the same blocked interface lookup.

Now cast a page you are watching, or a stream URL you have:

castor cast player https://example.com/watch/some-video

For the interactive browser, which searches titles and casts them for you, add a TMDB key and a source (see Configuration), then run castor cast:

Selecting a cast target in the castor TUI

The commands you'll use most (run castor --help for all flags):

Command What it does
castor scan List cast targets on your network
castor cast Browse titles and cast, interactively (needs a TMDB key)
castor cast player <url> Cast a web page that has an embedded video player
castor cast url <url> Cast a direct stream or video URL
castor cast movie <id> Resolve a movie id against your sources and cast
castor cast episode <id> --season N --episode N Resolve a TV episode and cast

Configuration

Castor reads config.yaml from the working directory (or --config <path>). The only required key is the device shown in Quick start; everything else (timeouts, probing, capture, transcoding, network interface, Chrome discovery) has working defaults.

Tip

Keep secrets like your TMDB key out of the committed file: put them in a git-ignored config.local.yaml that overlays config.yaml, or in CASTOR_SECTION__FIELD environment variables. See SECURITY.md.

Everything below is optional.

Sources: resolve movie / episode ids against sites you configure

cast movie, cast episode, and the interactive browser resolve a title id against sources you configure. Castor bundles none, so add your own (sites you are authorized to use). There is no catalog and no lookup: Castor substitutes the id into the templates you write, prefixes each of your proxies, and opens the resulting page, then extracts the stream exactly like cast player. For example, castor cast movie tt12300742 opens https://your-source.example/embed/movie/tt12300742.

sources:
  - proxies: ["https://your-source.example"]   # base URLs, tried in order
    templates:
      movie: "/embed/movie/{itemID}"
      episode: "/embed/tv/{itemID}/{season}-{episode}"
Cast: force a local relay with delivery

Castor decides per source whether the device fetches the stream itself or Castor relays it: a source that only answers with the headers Castor captured is always relayed, since a device is handed the URL and none of those headers. A few sources look fetchable and are refused anyway, typically an HLS playlist whose segments are served under a disguised extension (.jpg with image/jpeg), which Castor reads fine but a Chromecast rejects, showing the idle Cast icon. Nothing in the stream reveals this, so delivery: serve is how you say it.

cast:
  delivery: serve   # always relay; "auto" (the default) decides per source

Relaying spends this machine's bandwidth and CPU on every cast, so try it as a one-off first: CASTOR_CAST__DELIVERY=serve castor cast url <url>. Any key works that way, e.g. CASTOR_RESOLVER__MAX_HEIGHT=720.

Resolver: cap resolution with max_height

Source selection and stream probing. All options have sensible defaults; you normally only set max_height to your TV's vertical resolution, which caps both the selected stream and the encoder output.

resolver:
  # The tallest video to cast. Source selection prefers the largest stream no
  # taller than this, and the encoder scales its output down to it. Defaults to
  # 1080; raise it to your TV's native height (e.g. 2160 for a 4K panel) to pass
  # 4K through, or lower it to save bandwidth.
  max_height: 2160
  # hls_timeout: 30s
  # probe_timeout: 30s
  # probe_max_concurrency: 2
  # ffprobe_path: ffprobe
TMDB: API key for the interactive browser

The interactive browser (castor cast) uses a TMDB API key to search titles; direct commands like cast movie <id> do not need it. Get a free key from themoviedb.org and keep it in config.local.yaml:

tmdb:
  api_key: "<KEY>"
Subtitles: auto-transcribe with whisper and burn in (off by default)

Auto-generated subtitles, transcribed with whisper and burned into the video:

whisper:
  enable: true             # off by default
  # language: "fr"         # default: English
  # model_path: ""         # default: ggml-tiny.en (~75 MB, auto-downloaded)
Roku: cast to a Roku TV or player (one-time Developer Mode setup)

Roku devices are not DLNA renderers, so Castor reaches them over Roku's ECP (External Control Protocol). Roku has no supported way to play an arbitrary URL from a preinstalled app, so Castor ships a tiny channel of its own and plays through it. A source Roku already accepts (HLS, MP4, MKV) is passed straight through; anything else is remuxed to live HLS on the fly.

device:
  name: "Living Room"   # the Roku's name, from `castor scan`
  type: roku
  roku:
    # Only needed the first time, to sideload Castor's channel (see below).
    password: "<dev-web-server-password>"

Sideloading the channel uses Roku's developer web server, which you turn on by hand once (there is no remote API for it):

  1. On the Roku remote press Home x3, Up x2, Right, Left, Right, Left, Right.
  2. Enable developer mode and set a web-server password (the device reboots).
  3. Put that password in device.roku.password (keep it in a git-ignored config.local.yaml, or set CASTOR_DEVICE__ROKU__PASSWORD).

On the first cast Castor sideloads its channel automatically; later casts reuse it. If you publish the channel to your account instead, set device.roku.app_id to its numeric id (no dev mode or password needed).

[!NOTE] Roku's live playback is a sliding-window HLS stream and stays roughly 30 s behind the live edge, so expect a longer start delay and more latency than DLNA.

Supported devices

Run castor scan to list what is on your network.

Protocol Works with Status
DLNA / UPnP (MediaRenderer:1) Virtually every smart TV from the last decade (Samsung, LG, Sony Bravia, Panasonic Viera, Philips, Hisense, TCL, VIZIO, Sharp), plus networked players like Kodi, VLC, and Plex Tested on Samsung
Chromecast Google Cast devices Experimental, untested (contributions welcome)
Roku Roku TVs and streaming players (via a sideloaded channel over ECP) Experimental, untested (contributions welcome)

Docker (optional)

The prebuilt ghcr.io/stupside/castor image bundles Chrome, ffmpeg, and ffprobe, so you install nothing by hand. Run it on a Linux host on the same LAN as your TV.

Warning

--network host is required: device discovery (SSDP multicast) and the TV streaming back from Castor both need the container on your real LAN. On Docker Desktop (macOS/Windows) that flag is a no-op, so the container never reaches your TV and scan finds nothing. Use the native binary there instead (macOS, Windows).

# Discover devices (no config needed)
docker run --rm --network host ghcr.io/stupside/castor:latest scan

# Cast, passing the Intel GPU through for hardware transcoding
docker run --rm --network host --device /dev/dri \
  -v "$PWD/config.yaml:/config.yaml" \
  -v castor-cache:/root/.cache \
  ghcr.io/stupside/castor:latest \
  cast player https://example.com/watch/some-video

--device /dev/dri hands the container your Intel GPU for VA-API hardware H.264 encoding; without it (or on a non-Intel host) Castor falls back to software libx264. Either way, when your TV already accepts the source video Castor stream-copies it and skips encoding entirely.

Run commands from the directory holding your config.yaml (mounted at /config.yaml). The castor-cache volume persists the auto-downloaded whisper models.

Tag Build
:latest Latest stable release
:canary Latest preview build
:v1.7.0 A specific pinned version

Purpose and disclaimer

Castor is a general-purpose caster, not a service tied to any particular site.

  • It hosts nothing. No bundled video, catalog, or sources: Castor casts only a page, stream URL, or source you supply and are authorized to use, much like a Chromecast.
  • It does not touch DRM. Castor does not decrypt or circumvent DRM, and cannot cast DRM-protected services.
  • Using it lawfully is your responsibility. Whether a site's terms of use and your local law allow what you do with Castor is on you. Do not use it to infringe copyright.

Castor is provided as-is for lawful, personal, and educational use.

Contributing

See CONTRIBUTING.md.

View on GitHub

Recent activity

commits and pull requests

Releases and announcements

20 total
  1. v1.9.0v1.9.0Sep 28, 202671 downloads

    ## [1.9.0](https://github.com/stupside/castor/compare/v1.8.1...v1.9.0) (2026-09-22) ### Features * **ffmpeg:** read a demuxed program as two inputs ([2333d0f](https://github.com/stupside/castor/commit/2333d0f3f027928be826115649fb7151e463e034)) * **media:** let one program span two renditions ([279407f](https://github.com/stupside/castor/commit/279407f795dd13f7a801207cf111e17bd60fe846)) * **release:** ship windows builds, and carry ffmpeg's side feeds over loopback ([#66](https://github.com/stupside/castor/issues/66)) ([5ffeb79](https://github.com/stupside/castor/commit/5ffeb7936199acba403feab2f2a411b32d650edf)), closes [#61](https://github.com/stupside/castor/issues/61) * **resolve:** keep the chosen variant's audio rendition ([a70b814](https://github.com/stupside/castor/commit/a70b814c9e2300a3b95c7179000565c291682470)) ### Bug Fixes * **cast:** serve sources that need request headers ([#54](https://github.com/stupside/castor/issues/54)) ([f2fe1e1](https://github.com/stupside/castor/commit/f2fe1e11624150052b0d5cc0dad21c60ab9bde1c)) * **deps:** bump golang.org/x/mod v0.38.0 → v0.40.0 ([#62](https://github.com/stupside/castor/issues/62)) ([2cf0627](https://github.com/stupside/c

  2. v1.8.1v1.8.1Jul 27, 2026511 downloads

    ## [1.8.1](https://github.com/stupside/castor/compare/v1.8.0...v1.8.1) (2026-07-27) ### Bug Fixes * **ffmpeg:** pass -nostats to the puller invocation ([5fb1650](https://github.com/stupside/castor/commit/5fb165033857fa7e15033150e952f31cbd233723)) * **resolve:** tiebreak equal-bandwidth candidates by height ([3a25c70](https://github.com/stupside/castor/commit/3a25c70173ec67c143e427a6fe72d6e43327e222))

  3. v1.8.0v1.8.0Jul 27, 202625 downloads

    ## [1.8.0](https://github.com/stupside/castor/compare/v1.7.1...v1.8.0) (2026-07-27) ### Features * add Roku cast target ([#50](https://github.com/stupside/castor/issues/50)) ([f109d47](https://github.com/stupside/castor/commit/f109d47c061ea9a2fe2bff31ab8885967fecfde9)) * **cast:** surround audio and compiler-isolated device strategies ([6434ba6](https://github.com/stupside/castor/commit/6434ba659b2cfb77e0003194dd129a83c20c77d8)) * **device:** connect by pinned host, skipping discovery ([dd876cd](https://github.com/stupside/castor/commit/dd876cde770c5501128d2b5b723cb79b6e1bd142)), closes [#24](https://github.com/stupside/castor/issues/24) * **extract:** disable site isolation to capture cross-origin iframe requests ([bd32c0e](https://github.com/stupside/castor/commit/bd32c0e1d14257cda5aa6cd2d8e6f23aadb62901)) ### Bug Fixes * **cmd:** propagate picked device's type and host, not just name ([3af67b9](https://github.com/stupside/castor/commit/3af67b90e246f018ca424cf8a828d1c19cc90ace)) * **device:** derive each family's SelfFetch from its own selfFetches() ([857ac35](https://github.com/stupside/castor/commit/857ac354d6b92e3d6594da05bb946bd3fc13f0b8)) * **device:** retry DLNA SetAV

  4. v1.7.1v1.7.1Jul 22, 2026229 downloads

    ## [1.7.1](https://github.com/stupside/castor/compare/v1.7.0...v1.7.1) (2026-07-22) ### Bug Fixes * **docker:** hw capable ffmpeg with good flag support ([#43](https://github.com/stupside/castor/issues/43)) ([44460a9](https://github.com/stupside/castor/commit/44460a9768fff628996906a521565ed2b872bd69)) ### Documentation * add Trendshift badge ([016a64a](https://github.com/stupside/castor/commit/016a64afabcd34dc7c9420050d77aec17192ad53)) * restructure installation, configuration, and docker sections ([8ecabb2](https://github.com/stupside/castor/commit/8ecabb22112cbc0dd670277e8e621f7a973cef24))

  5. v1.7.0v1.7.0Jul 21, 202695 downloads

    ## [1.7.0](https://github.com/stupside/castor/compare/v1.6.2...v1.7.0) (2026-07-21) ### Features * show cast target device in browse header ([986b3ee](https://github.com/stupside/castor/commit/986b3eef5b4968100676589d4cb6773ef76e93ae)) ### Bug Fixes * **cast:** return error from BuildPlan instead of panicking for unknown device type ([b4c9a6b](https://github.com/stupside/castor/commit/b4c9a6b43e4dfa6be0d8a1250968a7d33bf288a2)) * **cmd:** use CLI framework for --debug flag instead of scanning os.Args ([d4c307b](https://github.com/stupside/castor/commit/d4c307b4ce40f6ffe37ea971e18ab3ae4d66f625)) * config yaml should be optional ([#38](https://github.com/stupside/castor/issues/38)) ([33eea9f](https://github.com/stupside/castor/commit/33eea9faa9e3ab8d146210a9f174e6918b73dc1b)) * **docker:** cli cannot run in castor because of glibc version ([#40](https://github.com/stupside/castor/issues/40)) ([18b6a88](https://github.com/stupside/castor/commit/18b6a88a6a59b5d3ffe9ab3f6947a50ea6dfa82e)) * suppress unchecked Close() lint warnings ([88be120](https://github.com/stupside/castor/commit/88be1209f3569d5bd10eeb3b7962786c11ff6a90)) * wire picked device name into config before browse ([c2f

Code frequency

additions and deletions
+12.1K-12.1KWeek of 2026-02-08: +3,978 linesWeek of 2026-02-08: -0 linesWeek of 2026-02-15: +241 linesWeek of 2026-02-15: -434 linesWeek of 2026-02-22: +0 linesWeek of 2026-02-22: -0 linesWeek of 2026-03-01: +0 linesWeek of 2026-03-01: -0 linesWeek of 2026-03-08: +0 linesWeek of 2026-03-08: -0 linesWeek of 2026-03-15: +0 linesWeek of 2026-03-15: -0 linesWeek of 2026-03-22: +0 linesWeek of 2026-03-22: -0 linesWeek of 2026-03-29: +0 linesWeek of 2026-03-29: -0 linesWeek of 2026-04-05: +0 linesWeek of 2026-04-05: -0 linesWeek of 2026-04-12: +0 linesWeek of 2026-04-12: -0 linesWeek of 2026-04-19: +0 linesWeek of 2026-04-19: -0 linesWeek of 2026-04-26: +0 linesWeek of 2026-04-26: -0 linesWeek of 2026-05-03: +0 linesWeek of 2026-05-03: -0 linesWeek of 2026-05-10: +16 linesWeek of 2026-05-10: -9 linesWeek of 2026-05-17: +175 linesWeek of 2026-05-17: -161 linesWeek of 2026-05-24: +0 linesWeek of 2026-05-24: -0 linesWeek of 2026-05-31: +0 linesWeek of 2026-05-31: -0 linesWeek of 2026-06-07: +0 linesWeek of 2026-06-07: -0 linesWeek of 2026-06-14: +0 linesWeek of 2026-06-14: -0 linesWeek of 2026-06-21: +0 linesWeek of 2026-06-21: -0 linesWeek of 2026-06-28: +7,854 linesWeek of 2026-06-28: -3,341 linesWeek of 2026-07-05: +1,187 linesWeek of 2026-07-05: -879 linesWeek of 2026-07-12: +0 linesWeek of 2026-07-12: -0 linesWeek of 2026-07-19: +12,111 linesWeek of 2026-07-19: -7,088 linesWeek of 2026-07-26: +2,921 linesWeek of 2026-07-26: -273 linesWeek of 2026-08-02: +1,346 linesWeek of 2026-08-02: -322 linesWeek of 2026-08-09: +0 linesWeek of 2026-08-09: -0 linesWeek of 2026-08-16: +0 linesWeek of 2026-08-16: -0 linesWeek of 2026-08-23: +0 linesWeek of 2026-08-23: -0 linesWeek of 2026-08-30: +0 linesWeek of 2026-08-30: -0 linesFeb 8, 2026Aug 30, 2026
+29.8K lines added, -12.5K removed over the last year.

Commits per week

last 52 weeks
830Week of 2025-10-04: 0 commitsWeek of 2025-10-11: 0 commitsWeek of 2025-10-18: 0 commitsWeek of 2025-10-25: 0 commitsWeek of 2025-11-01: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 0 commitsWeek of 2026-01-18: 0 commitsWeek of 2026-01-25: 0 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 1 commitsWeek of 2026-02-15: 3 commitsWeek of 2026-02-22: 0 commitsWeek of 2026-03-01: 0 commitsWeek of 2026-03-08: 0 commitsWeek of 2026-03-15: 0 commitsWeek of 2026-03-22: 0 commitsWeek of 2026-03-29: 0 commitsWeek of 2026-04-05: 0 commitsWeek of 2026-04-12: 0 commitsWeek of 2026-04-19: 0 commitsWeek of 2026-04-26: 0 commitsWeek of 2026-05-03: 0 commitsWeek of 2026-05-10: 1 commitsWeek of 2026-05-17: 1 commitsWeek of 2026-05-24: 0 commitsWeek of 2026-05-31: 0 commitsWeek of 2026-06-07: 0 commitsWeek of 2026-06-14: 0 commitsWeek of 2026-06-21: 0 commitsWeek of 2026-06-28: 23 commitsWeek of 2026-07-05: 16 commitsWeek of 2026-07-12: 0 commitsWeek of 2026-07-19: 83 commitsWeek of 2026-07-26: 14 commitsWeek of 2026-08-02: 7 commitsWeek of 2026-08-09: 0 commitsWeek of 2026-08-16: 0 commitsWeek of 2026-08-23: 0 commitsWeek of 2026-08-30: 0 commitsWeek of 2026-09-06: 0 commitsWeek of 2026-09-13: 0 commitsWeek of 2026-09-20: 3 commitsWeek of 2026-09-27: 1 commitsOct 4, 2025Sep 27, 2026
153 commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 2 commitsSun 1:00 — 5 commitsSun 2:00 — 8 commitsSun 3:00 — 3 commitsSun 4:00 — 4 commitsSun 5:00 — 2 commitsSun 6:00 — 0 commitsSun 7:00 — 0 commitsSun 8:00 — 0 commitsSun 9:00 — 0 commitsSun 10:00 — 0 commitsSun 11:00 — 0 commitsSun 12:00 — 0 commitsSun 13:00 — 5 commitsSun 14:00 — 2 commitsSun 15:00 — 1 commitsSun 16:00 — 3 commitsSun 17:00 — 0 commitsSun 18:00 — 1 commitsSun 19:00 — 2 commitsSun 20:00 — 1 commitsSun 21:00 — 7 commitsSun 22:00 — 3 commitsSun 23:00 — 0 commitsMon 0:00 — 1 commitsMon 1:00 — 2 commitsMon 2:00 — 1 commitsMon 3:00 — 0 commitsMon 4:00 — 0 commitsMon 5:00 — 0 commitsMon 6:00 — 0 commitsMon 7:00 — 0 commitsMon 8:00 — 0 commitsMon 9:00 — 0 commitsMon 10:00 — 0 commitsMon 11:00 — 0 commitsMon 12:00 — 0 commitsMon 13:00 — 1 commitsMon 14:00 — 0 commitsMon 15:00 — 0 commitsMon 16:00 — 0 commitsMon 17:00 — 1 commitsMon 18:00 — 0 commitsMon 19:00 — 3 commitsMon 20:00 — 3 commitsMon 21:00 — 6 commitsMon 22:00 — 15 commitsMon 23:00 — 3 commitsTue 0:00 — 5 commitsTue 1:00 — 0 commitsTue 2:00 — 0 commitsTue 3:00 — 0 commitsTue 4:00 — 0 commitsTue 5:00 — 0 commitsTue 6:00 — 0 commitsTue 7:00 — 0 commitsTue 8:00 — 0 commitsTue 9:00 — 0 commitsTue 10:00 — 0 commitsTue 11:00 — 0 commitsTue 12:00 — 0 commitsTue 13:00 — 3 commitsTue 14:00 — 3 commitsTue 15:00 — 0 commitsTue 16:00 — 0 commitsTue 17:00 — 0 commitsTue 18:00 — 9 commitsTue 19:00 — 3 commitsTue 20:00 — 0 commitsTue 21:00 — 1 commitsTue 22:00 — 1 commitsTue 23:00 — 1 commitsWed 0:00 — 2 commitsWed 1:00 — 1 commitsWed 2:00 — 0 commitsWed 3:00 — 0 commitsWed 4:00 — 0 commitsWed 5:00 — 0 commitsWed 6:00 — 0 commitsWed 7:00 — 0 commitsWed 8:00 — 0 commitsWed 9:00 — 1 commitsWed 10:00 — 0 commitsWed 11:00 — 0 commitsWed 12:00 — 0 commitsWed 13:00 — 0 commitsWed 14:00 — 0 commitsWed 15:00 — 0 commitsWed 16:00 — 0 commitsWed 17:00 — 3 commitsWed 18:00 — 0 commitsWed 19:00 — 3 commitsWed 20:00 — 0 commitsWed 21:00 — 1 commitsWed 22:00 — 0 commitsWed 23:00 — 19 commitsThu 0:00 — 1 commitsThu 1:00 — 1 commitsThu 2:00 — 0 commitsThu 3:00 — 0 commitsThu 4:00 — 0 commitsThu 5:00 — 0 commitsThu 6:00 — 0 commitsThu 7:00 — 0 commitsThu 8:00 — 0 commitsThu 9:00 — 0 commitsThu 10:00 — 0 commitsThu 11:00 — 0 commitsThu 12:00 — 0 commitsThu 13:00 — 2 commitsThu 14:00 — 0 commitsThu 15:00 — 0 commitsThu 16:00 — 0 commitsThu 17:00 — 0 commitsThu 18:00 — 0 commitsThu 19:00 — 0 commitsThu 20:00 — 0 commitsThu 21:00 — 0 commitsThu 22:00 — 1 commitsThu 23:00 — 0 commitsFri 0:00 — 0 commitsFri 1:00 — 1 commitsFri 2:00 — 0 commitsFri 3:00 — 0 commitsFri 4:00 — 0 commitsFri 5:00 — 0 commitsFri 6:00 — 0 commitsFri 7:00 — 0 commitsFri 8:00 — 0 commitsFri 9:00 — 0 commitsFri 10:00 — 0 commitsFri 11:00 — 0 commitsFri 12:00 — 0 commitsFri 13:00 — 0 commitsFri 14:00 — 0 commitsFri 15:00 — 0 commitsFri 16:00 — 0 commitsFri 17:00 — 0 commitsFri 18:00 — 0 commitsFri 19:00 — 0 commitsFri 20:00 — 2 commitsFri 21:00 — 1 commitsFri 22:00 — 0 commitsFri 23:00 — 0 commitsSat 0:00 — 0 commitsSat 1:00 — 0 commitsSat 2:00 — 0 commitsSat 3:00 — 0 commitsSat 4:00 — 0 commitsSat 5:00 — 0 commitsSat 6:00 — 0 commitsSat 7:00 — 0 commitsSat 8:00 — 0 commitsSat 9:00 — 0 commitsSat 10:00 — 0 commitsSat 11:00 — 0 commitsSat 12:00 — 0 commitsSat 13:00 — 0 commitsSat 14:00 — 0 commitsSat 15:00 — 0 commitsSat 16:00 — 0 commitsSat 17:00 — 0 commitsSat 18:00 — 0 commitsSat 19:00 — 0 commitsSat 20:00 — 0 commitsSat 21:00 — 0 commitsSat 22:00 — 0 commitsSat 23:00 — 3 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.

Who is committing

last 52 weeks
Maintainer commits144 (92%)
Community commits13 (8%)

157 commits in total over the last year.

DateListRankStars gained
Jul 19, 2026daily#18+5
  • avelino/awesome-go

    A curated list of awesome Go frameworks, libraries and software

    186.9K stars · Go

  • Genymobile/scrcpy

    Display and control your Android device

    151K stars · C

  • iptv-org/iptv

    Collection of publicly available IPTV channels from all over the world

    140.3K stars · TypeScript

  • harry0703/MoneyPrinterTurbo

    利用 AI 大模型和自动化工作流,根据主题或关键词一键生成高清短视频。Generate HD short videos from a topic or keyword with an automated AI workflow.

    128.4K stars · Python

  • kubernetes/kubernetes

    Production-Grade Container Scheduling and Management

    128.3K stars · Go

  • microsoft/TypeScript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

    111.3K stars · Go