Download any media from the web. All local.

Operant is a free, open-source (GPL-3.0) browser extension that detects video, audio and image streams on any page, hands them to ffmpeg and yt-dlp through a local Python host, and processes everything on your machine. No accounts, no servers, no telemetry.

01Setup

Up and running in two minutes

Download the zip, load it unpacked and pin it. No build step, no account, no telemetry. The extension works on its own; add the native host if you want to process media with ffmpeg and yt-dlp.

  1. Download the .zip with the button above and unzip it
  2. Type chrome://extensions in the address bar and enable Developer mode
  3. Click Load unpacked and select the unzipped operant folder
  4. Open the extensions menu (puzzle icon) and pin Operant to your toolbar

02Features

What it does

The browser sandbox cannot spawn native binaries or reassemble heavy streams. Operant bridges that gap with a small, auditable local host.

Stream capture

Detects HLS (.m3u8) and DASH (.mpd) manifests through webRequest, plus images, video and audio in the DOM. Downloads are reconstructed with the real page Referer via ephemeral declarativeNetRequest rules.

Python native host

A standard-library-only daemon talks to the extension over stdio. It manages isolated ffmpeg and yt-dlp binaries under ~/Operant/bin without touching your PATH or system configuration.

Parallel downloads

Chunked range requests with concurrent queues, in-memory ZIP packaging and structured URL export for data pipelines.

ffmpeg pipeline

Remux, compress, resize, extract audio and merge split audio/video tracks, at native speed, outside the browser sandbox.

Side panel UI

A persistent Chromium side panel with grid and list views, filters by dimensions and media type, and live queue status.

Agent-ready

The native host doubles as a local gateway for automation: Playwright, Browser-Use or any Python tooling can drive the active tab without CORS constraints.

03Architecture

Three decoupled layers

Strict separation of responsibilities keeps the UI responsive, the interception event-driven and the heavy processing native. Wiring details, the full protocol and host internals live in the documentation.

Side panel

Vanilla JS · rendered on demand

  • Media detection and filters
  • Download queue manager
  • ffmpeg / yt-dlp console
chrome.runtime port messaging

Service worker & content engine

Manifest V3 · event-driven

  • DOM scanner (img, video, srcset, CSS backgrounds)
  • webRequest stream sniffer (m3u8, mpd, fMP4 segments)
  • declarativeNetRequest Referer injection
Native messaging · 4-byte LE framing over stdio

Python host daemon

operant_host.py · runs unsandboxed

  • ffmpeg: remux, compress, resize, audio extraction
  • yt-dlp: best video + audio merge
  • Local IPC gateway for automation tooling

FAQ

Direct answers about architecture, security and behavior.

Why does Operant need a native host?

Browser extensions run in a sandbox that cannot execute compiled binaries or access the file system freely. The native host is a thin, auditable bridge that lets ffmpeg and yt-dlp run at native speed with full file system access.

Is the native host safe?

It is written with the Python standard library only and its source is fully auditable. It communicates exclusively over stdio and only accepts messages from the exact extension ID registered on your system; no other program or web page can reach it.

How are HLS and DASH streams captured?

A content script scans media elements in the DOM while a webRequest observer watches for manifest requests (.m3u8, .mpd). When a segmented video is detected it appears in the side panel; from there the host downloads the fragments or lets ffmpeg assemble the stream directly.

Does Operant send any data anywhere?

No. There is no telemetry, no analytics and no intermediary server. Media detection, native messaging and ffmpeg processing all happen on your machine.

How will automation and AI be integrated?

Through the same native messaging channel. The Python host can run Playwright or connect to local LLMs (Ollama or APIs) to receive natural-language instructions from the panel and execute automation tasks on the active tab.