Turns your Overcast listening history into a structured knowledge base, then surfaces insights
from recent episodes and connects them to your current work and interests.
Built on three tools by Harold Martin:
uv tool install overcast-to-sqlite
uv tool install podcast-transcript-convert
overcast-to-sqlite auth
# Logs into Overcast and saves an auth cookie to ./auth.json
# Your password is NOT saved — only the session cookie
Store auth.json somewhere stable, e.g. ~/.overcast/auth.json:
mkdir -p ~/.overcast
mv auth.json ~/.overcast/auth.json
overcast-to-sqlite all -a ~/.overcast/auth.json ~/.overcast/overcast.db -v
This runs save → extend → transcripts → chapters sequentially.
First run downloads XML for every subscribed feed — may take several minutes.
Transcripts are saved to ~/.overcast/archive/transcripts/ by default.
Run this to pull in the latest listening activity:
overcast-to-sqlite all -a ~/.overcast/auth.json ~/.overcast/overcast.db
Or for a faster update (skips feed XML re-download):
overcast-to-sqlite save -a ~/.overcast/auth.json ~/.overcast/overcast.db
overcast-to-sqlite transcripts -a ~/.overcast/auth.json ~/.overcast/overcast.db
To fetch transcripts for starred episodes only:
overcast-to-sqlite transcripts -s -a ~/.overcast/auth.json ~/.overcast/overcast.db
> Suggested cron schedule: run overcast-to-sqlite all once daily, e.g. at 4am before
> any morning digest jobs that depend on it. Use launchd on macOS or cron on Linux.
Use these SQL queries against ~/.overcast/overcast.db:
SELECT
e.title,
f.title AS podcast,
e.overcastUrl,
e.userRecommendedDate,
e.transcriptDownloadPath,
e.progress,
e.played
FROM episodes e
JOIN feeds f ON e.feedId = f.overcastId
WHERE (e.played = 1 OR e.progress > 300)
AND e.userUpdatedDate >= datetime('now', '-1 day')
ORDER BY
e.userRecommendedDate DESC,
e.userUpdatedDate DESC;
SELECT
e.title,
f.title AS podcast,
e.overcastUrl,
e.userRecommendedDate,
e.transcriptDownloadPath
FROM episodes_starred e
JOIN feeds f ON e.feedId = f.overcastId
WHERE e.transcriptDownloadPath IS NOT NULL
ORDER BY e.userRecommendedDate DESC
LIMIT 20;
SELECT c.content, e.title, f.title AS podcast, c.time
FROM chapters_fts
JOIN chapters c ON chapters_fts.rowid = c.rowid
JOIN episodes e ON c.enclosureUrl = e.enclosureUrl
JOIN feeds f ON e.feedId = f.overcastId
WHERE chapters_fts MATCH 'your search term'
ORDER BY rank;
Transcripts are stored in mixed formats (SRT, WebVTT, HTML, JSON).
Use podcast-transcript-convert to normalize them to PodcastIndex JSON:
transcript2json ~/.overcast/archive/transcripts/ ~/.overcast/archive/transcripts-json/
To read a transcript as plain text for LLM analysis, parse the JSON:
python3 -c "
import json, sys
data = json.load(open(sys.argv[1]))
for seg in data.get('segments', []):
print(seg.get('speaker', ''), seg.get('body', ''))
" ~/.overcast/archive/transcripts-json/episode.json
When asked to analyze recent listening, follow this process:
Run the last-24h query above using the terminal tool against ~/.overcast/overcast.db.
Episodes with a non-null userRecommendedDate are starred. Give these deeper treatment.
For each episode with a transcriptDownloadPath:
For episodes without transcripts, use the episode description from episodes_extended.description.
Ask the user what they are currently working on and interested in, or read from context.
For each episode, identify:
Depth is determined by the user when invoking the skill. Default structure:
[Starred] Episode Title — Podcast Name
Summary: 2-3 sentence overview of what was covered
Key insight: The most actionable or interesting idea
Connections: How this relates to what the user is working on
Follow-up: Papers, people, tools, or questions worth pursuing
[Played] Episode Title — Podcast Name
One-line summary + any standout idea worth surfacing
overcast-to-sqlite stats ~/.overcast/overcast.db
Shows: total episodes played, total listening time, starred count, top podcasts by time.
overcast-to-sqlite search "reinforcement learning" ~/.overcast/overcast.db
overcast-to-sqlite search "agentic" ~/.overcast/overcast.db -l 5
Searches across episode titles, feed descriptions, and chapter content (FTS5).
Default: ~/.overcast/overcast.db
Default transcript archive: ~/.overcast/archive/transcripts/
Default auth: ~/.overcast/auth.json
Override any path via CLI flags. See overcast-to-sqlite --help for full options.
via the podcast:transcript RSS tag. Not all episodes have transcripts.
your entire listening history without reading full transcripts
共 1 个版本