Video Summarizer
Local-first, multi-source video summarization for YouTube, social platforms, cloud drives, and local files. Works with any OpenAI-compatible LLM, supports an optional vision path, and includes NotebookLM-style workflows.
Not steipete/summarize. This project is a self-hosted video pipeline with transcript caching, Cobalt fallback, a Streamlit workspace, and an agent skill. steipete/summarize is a generic URL clipper.
Bring your own API keys. Configuration lives in summarizer.yaml and .env. Full documentation: summarize.martino.im.
Features
- 11+ sources — YouTube, Instagram, TikTok, X/Twitter, Reddit, Facebook, Google Drive, Dropbox, and local files
- Any LLM — OpenAI, Groq, Gemini, Ollama, OpenRouter, NVIDIA, Perplexity, LiteLLM, and other OpenAI-compatible endpoints
- Two modes — Transcript-based summarization (default) or visual mode with vision-capable models
- Summary styles — Q&A, distillation, fact-checking, tutorials, Mermaid diagrams, essays, and custom prompts via
summarizer/prompts.json - Multiple interfaces — CLI, Streamlit UI, HTTP API, Docker, Raycast extension, and agent skill
- Transcript cache — Reuse cached transcripts across runs; optional Cobalt sidecar for yt-dlp fallbacks
Requirements
- Python 3.7+
- ffmpeg on
PATH - At least one LLM API key in
.env - Cobalt (optional, included in Docker Compose) for URLs that yt-dlp cannot handle
Quick Start
Set an OpenAI-compatible API key in .env. Groq (GROQ_API_KEY) offers a free tier; OPENAI_API_KEY works with --provider openai.
pip install martino-summarize
summarizer --init-config
echo "GROQ_API_KEY=your_key_here" > .env
summarizer --source "https://www.youtube.com/watch?v=arj7oStGLkU"
Summaries are saved to summaries/watch_YYYYMMDD_HHMMSS.md.
Optional extras:
pipx install "martino-summarize[server]" # HTTP API
pipx install "martino-summarize[all]" # server + whisper + litellm
Docker
git clone https://github.com/martinopiaggi/summarize.git
cd summarize
cp summarizer.example.yaml summarizer.yaml # first time only
echo "GROQ_API_KEY=your_key_here" > .env # or OPENAI_API_KEY, etc.
docker compose up -d
Open http://localhost:8501, paste a URL, and summarize.
Pre-built image:
docker pull ghcr.io/martinopiaggi/summarize:latest
docker-compose.yml mounts .env, summarizer.yaml, and ./summaries/ for persistence. Cobalt runs as a sidecar for TikTok, Instagram, and other yt-dlp fallbacks.
Interfaces
| Interface | Command |
|---|---|
| Streamlit GUI | docker compose up -d → http://localhost:8501 |
| CLI | summarizer --source <source> |
| HTTP API | summarizer serve → http://localhost:8000/docs |
| Docker | docker compose up -d |
| Agent Skill | .agent/skills/summarize/SKILL.md |
| Raycast | extensions/raycast-summarize/ |
How It Works
- Transcript path (default): downloads audio or video, transcribes with Whisper or captions, caches the transcript, then summarizes with an LLM.
- Visual path (
--visual): sends the video directly to a vision-capable model, skipping transcription. Uses the same prompts, provider config, and.envkeys as the transcript path. Supportsbase64chunks (default) andurlpassthrough for YouTube.
Full pipeline diagram: summarize.martino.im/how-it-works
Troubleshooting
| Issue | Resolution |
|---|---|
| yt-dlp or platform errors | Ensure Cobalt is running (docker compose includes it) or set COBALT_BASE_URL |
| Missing API key | Add the provider key to .env (see summarizer.example.yaml for provider names) |
| No config file | Run summarizer --init-config or pass --base-url and --model with --no-config |
Full guide: summarize.martino.im
Contributing
git clone https://github.com/martinopiaggi/summarize.git
cd summarize
pip install -e ".[all]"
pip install pytest
pytest tests/
See CONTRIBUTING.md.
License
Release files for martino-summarize 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| martino_summarize-0.2.1.tar.gz | 64.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| martino_summarize-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 125.6 kB
Release files / martino_summarize-0.2.1.tar.gz
| Download URL | martino_summarize-0.2.1.tar.gz |
|---|---|
| Size | 64.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
00f93f67697e67bf01c7d7311df9ad628c3c763459973dd35186f38d302489f8
|
|
BLAKE2b-256 checksum How to use checksums |
6d5d422256dc07f0deb4239988456e2dc8924f00d6e6089896722108c07365e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 4, 2026.
Transparency logRelease files / martino_summarize-0.2.1-py3-none-any.whl
| Download URL | martino_summarize-0.2.1-py3-none-any.whl |
|---|---|
| Size | 61.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d26151f84ce3573d8cb1d580763f36476227edf58dc9e23a496a970643c9f4a3
|
|
BLAKE2b-256 checksum How to use checksums |
e5e37a725ca62bfbc2b7b8dcee16df9650a478ad2f689911689e16f1cd10da18
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 4, 2026.
Transparency log