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:
bash
uv tool install overcast-to-sqlite
uv tool install podcast-transcript-convert
bash
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:
bash
mkdir -p ~/.overcast
mv auth.json ~/.overcast/auth.json
bash
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:
bash
overcast-to-sqlite all -a ~/.overcast/auth.json ~/.overcast/overcast.db
Or for a faster update (skips feed XML re-download):
bash
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:
bash
overcast-to-sqlite transcripts -s -a ~/.overcast/auth.json ~/.overcast/overcast.db
Suggested cron schedule: run
overcast-to-sqlite allonce 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:
sql
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;
sql
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;
sql
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:
bash
transcript2json ~/.overcast/archive/transcripts/ ~/.overcast/archive/transcripts-json/
To read a transcript as plain text for LLM analysis, parse the JSON:
bash
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
bash
overcast-to-sqlite stats ~/.overcast/overcast.db
Shows: total episodes played, total listening time, starred count, top podcasts by time.
bash
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.