Local-first CLI + MCP server that turns long-form audio/video into personalized, cited, navigable briefings — everything runs on your machine.
Project description
OpenPod
Pull the ten minutes that matter — to you.
Hundreds of hours pile up across the shows you follow. OpenPod pulls out the minutes you're chasing — cited, timestamped to verify, extracted on your own machine — as the starting point your AI agent works from.
OpenPod is a local-first agent toolkit — primitives plus packaged skills — that your agent drives over MCP or the CLI. It connects to nothing external; the only corpus is your library on disk.
pip install openpod
openpod catch "https://example.com/podcast/feed.xml"
Catch your first episode — one command, about a minute. You get a timestamped transcript, the key ideas, and jump-to-moment links, all as plain files in a folder you own.
0 servers · 0 accounts · 0 telemetry · $0 to run · test suite runs fully offline
Status: Stage 1 alpha. Local-pure, pull-only. It does what this page shows — nothing more yet.
The problem
You subscribe to twelve shows. You're forty episodes behind, every one is three hours long, and the one segment you actually needed last week — you can't find it, because nobody remembers a timestamp. So the backlog grows, the guilt compounds, and "I'll listen on the weekend" becomes a lie you tell yourself on Mondays.
Cloud summarizers answer this by asking you to upload what you listen to — and to trust their summary with no way to check it. OpenPod doesn't summarize your listening on someone else's computer. It gives your agent the ability to listen, cite, and link — locally.
What you get
Point OpenPod (or your agent) at an RSS feed or a YouTube link. In return:
- A briefing you can verify. Every claim carries a timestamp and a deep link. Don't trust the summary? Click and hear the source in the native player. OpenPod never re-hosts anyone's audio — it navigates you to the moment.
- A library that compounds. Everything you catch lands in
.openpod/as plain files — transcripts, briefings, ideas, notes, clips. Searchable across everything you've ever caught, keyword and semantic, all local. - Personalized by your own agent. OpenPod reads your local
persona.md, so your AI foregrounds the decisions, tools, and numbers you care about and drops the rest — the same episode briefs differently for you than for the next person, and no cloud model ever sees who you are.
Nothing leaves your machine
There is no OpenPod server, no account, no telemetry — there is nothing to opt out of, because nothing phones home. The only corpus is your own library on disk. Publisher transcripts and captions are used when they exist; otherwise audio is transcribed locally with Whisper. Your agent brings the intelligence; OpenPod supplies extraction, structure, citations, deep links, and local search. That's the whole trade — and it's why running it costs nothing.
Your agent can drive all of it
OpenPod's toolkit is exposed as an MCP server, so Claude Code, Cowork, Codex — any MCP client — can catch, search, clip, and brief by name:
openpod-mcp
{
"mcpServers": {
"openpod": { "command": "openpod-mcp", "env": { "OPENPOD_HOME": "/path/to/your/workspace" } }
}
}
Say "catch me up on this episode" and the agent runs catch, reads your local persona file, and writes a cited briefing back into your library — then hands you the path. Mid-conversation, no dashboard, no copy-paste.
The four primitives
| Tool | Does | Writes |
|---|---|---|
catch <link> |
Ingest → transcribe → structure → brief | transcript.json, ideas.md, briefing.md |
search <query> |
Retrieve across your local library | ranked cues with deep links |
export_timestamps <entry> |
Navigable TOC with deep links | JSON / Markdown |
clip <entry> <start> <end> |
Sentence-snapped local cut + shareable deep-link card | media in clips/, card |
Every mutating command prints the path it wrote — the output of an action is the address of the artifact it produced. Every read command takes --json, shaped identically to the matching MCP tool.
Skills — the features, by name
Primitives are the API; skills are the product. Each is a versioned instruction bundle (openpod skills lists them; the MCP server exposes them as prompts) that tells an agent how to compose the primitives and report back:
| Skill | You ask | It writes |
|---|---|---|
| Catch Me Up | "Brief me on this episode" | briefing.md, ideas.md |
| Find the Moment | "Where did they talk about X?" | deep-linked hits |
| What's New | "What dropped in my feeds?" | digest |
| Cut the Clip | "Pull the shareable minute" | media + share card |
| Chapter It | "Give me a navigable TOC" | timestamps (md/json) |
| Follow This | "Keep me on this show" | follows.yaml entry |
| Set Up My Persona | "Learn who I am" | persona.md — yours, local |
| Sharpen My Persona | "Update what you know about me" | persona Derived block |
| Bring In My World | "Import my subscriptions" | imports/, follows.yaml |
More things it does
# Already have a transcript? Skip the network entirely.
openpod catch "https://example.com/ep1" --kind podcast --transcript ./ep1.vtt
# Search everything you've ever caught (keyword + local semantic)
openpod search "what did they say about raft consensus"
# Follow feeds locally; see what's new on your schedule — nothing polls in the background
openpod follow "https://example.com/feed.xml"
openpod digest
# Cut a local, sentence-snapped clip (needs ffmpeg) + a shareable deep-link card
openpod clip "test-pod/episode-one-consensus" 320 385
# Import subscriptions from a file you export (OPML) — point-in-time, opt-in
openpod import ~/Downloads/overcast.opml
# Annotate; notes feed future personalization
openpod note "test-pod/episode-one-consensus" "the Raft segment matters for our design"
Everything lands in a plain, user-owned tree:
.openpod/
persona.md # who you are (evolving, local)
follows.yaml # subscribed RSS + YouTube channels
library/<show>/<episode>/
transcript.json briefing.md ideas.md notes.md clips/
index/ # local search index (SQLite FTS + embeddings)
Want it on two machines? Put the tree in git or Dropbox yourself. OpenPod won't sync it for you.
Install options
pip install openpod # core: RSS ingest, local search, deep links, clip
pip install 'openpod[youtube]' # + YouTube captions & audio
pip install 'openpod[asr]' # + local Whisper transcription
pip install 'openpod[mcp]' # + the MCP server
pip install 'openpod[all]' # everything
ffmpeg on your PATH is required for clip.
Use it as a library
from openpod import catch, search
result = catch("https://example.com/ep1", transcript_path="ep1.vtt", kind="podcast")
print(result.entry_id, len(result.transcript), result.ideas)
for hit in search("consensus algorithms"):
print(hit.show, hit.start, hit.deeplink)
Trust & posture FAQ
Does OpenPod download or re-host other people's content? It navigates, it doesn't republish. Deep links open the moment in YouTube, Spotify, or the open podcast enclosure. Podcast RSS — content published for open distribution — is the primary surface; YouTube support is an optional module that uses official captions, or local transcription of audio you can already access. OpenPod never touches DRM, paywalls, or age gates.
What data do you collect about me? None. There is no endpoint to send it to.
How is transcription chosen?
Publisher-provided timed transcripts and captions first — free, fast, good for navigation (±2–4s cue timing). Otherwise local Whisper (asr extra). Nothing is uploaded either way. clip snaps cuts to cue boundaries so clips land on sentences.
Why MIT? MIT: maximally permissive and frictionless — install it at work without tripping a license policy, embed it, build on it, no obligations. OpenPod isn't protected by its license; it's protected by being local-pure and simple. No copyleft, no lock-in.
Can I hack on it without heavy models or network? Yes — the test suite runs fully offline against fixtures.
Built by Yoav — building OpenPod in public.
Development
git clone https://github.com/openpodhq/openpod
cd openpod
python -m venv .venv && . .venv/bin/activate
pip install -e '.[dev]'
pytest
Contributions that package or connect OpenPod travel furthest: Homebrew formula, Docker image, MCP client recipes, note-app bridges. Open an issue first; response is fast.
Long-form is a lot. OpenPod pulls the ten minutes that matter — to you — with a link straight to every one.
pip install openpod
If it saved you an hour this week, star the repo — stars are how the next person finds it.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file openpod-0.1.0.tar.gz.
File metadata
- Download URL: openpod-0.1.0.tar.gz
- Upload date:
- Size: 173.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c4ae1f7971d633df7c5d3fd57911d9b62cffdd54a90358cb65c0058ae5b0b3ca
|
|
| MD5 |
768f806193110bf14808ccd79dd0be80
|
|
| BLAKE2b-256 |
68f93d3b313c4163416aab56ea74bb545227e6d5e24e8b1636742d77a87711ec
|
Provenance
The following attestation bundles were made for openpod-0.1.0.tar.gz:
Publisher:
release.yml on openpodhq/openpod
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
openpod-0.1.0.tar.gz -
Subject digest:
c4ae1f7971d633df7c5d3fd57911d9b62cffdd54a90358cb65c0058ae5b0b3ca - Sigstore transparency entry: 2186961267
- Sigstore integration time:
-
Permalink:
openpodhq/openpod@955bdaa675a6a1fe7dba770e71683148b17e2546 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/openpodhq
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@955bdaa675a6a1fe7dba770e71683148b17e2546 -
Trigger Event:
release
-
Statement type:
File details
Details for the file openpod-0.1.0-py3-none-any.whl.
File metadata
- Download URL: openpod-0.1.0-py3-none-any.whl
- Upload date:
- Size: 161.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1c2a88634b3f080b4802db88086b1108e87466da735dda8a7a5fb6d2790939ea
|
|
| MD5 |
66efd819c1f1a33fcf9fec0c0489f795
|
|
| BLAKE2b-256 |
b97090ad5fae77213f9208eec5561f73cb182ef636e124e4e0f756100d173d33
|
Provenance
The following attestation bundles were made for openpod-0.1.0-py3-none-any.whl:
Publisher:
release.yml on openpodhq/openpod
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
openpod-0.1.0-py3-none-any.whl -
Subject digest:
1c2a88634b3f080b4802db88086b1108e87466da735dda8a7a5fb6d2790939ea - Sigstore transparency entry: 2186961279
- Sigstore integration time:
-
Permalink:
openpodhq/openpod@955bdaa675a6a1fe7dba770e71683148b17e2546 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/openpodhq
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@955bdaa675a6a1fe7dba770e71683148b17e2546 -
Trigger Event:
release
-
Statement type: