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
Installation
Summarizer is a CLI application. Install it in an isolated environment so upgrades to other Python tools (groq, litellm, openai, MCP servers, etc.) cannot break it. The most common failure mode is a pydantic / pydantic-core version mismatch when many packages share one ~/.local site-packages directory.
| Method | Best for |
|---|---|
| pipx (recommended) | CLI, HTTP API, and day-to-day use |
| venv | Development or a manually managed environment |
| pip install --user | Quick try only — can conflict with other tools in ~/.local |
| Docker | Streamlit GUI with no local Python dependencies |
# Recommended — isolated app environment
pipx install martino-summarize
# HTTP API (includes FastAPI + uvicorn)
pipx install "martino-summarize[server]"
# Everything: server + local Whisper + LiteLLM
pipx install "martino-summarize[all]"
Alternative with a virtual environment:
python3 -m venv ~/summarizer-venv
source ~/summarizer-venv/bin/activate # Windows: ~/summarizer-venv\Scripts\activate
pip install "martino-summarize[server]"
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.
pipx 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.
Docker
git clone https://github.com/martinopiaggi/summarize.git
cd summarize
cp summarizer.docker.yaml summarizer.yaml # Docker-optimized defaults
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. GUI summaries and transcript cache persist under ./summaries/ (including .cache/transcripts/).
Pre-built image:
docker pull ghcr.io/martinopiaggi/summarize:latest
Compose variants:
docker compose up -d # + Cobalt sidecar
docker compose -f docker-compose.gui-only.yml up -d # YouTube-only
docker compose -f docker-compose.yml -f docker-compose.named-volume.yml up -d # named volume
docker-compose.yml mounts .env, summarizer.yaml, and ./summaries/. 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 | pipx install "martino-summarize[server]" then 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 |
|---|---|
pydantic-core version mismatch on summarizer serve |
Not a summarizer bug — your Python environment has mismatched packages. Fix: pip install --upgrade pydantic pydantic-core, or reinstall in isolation: pipx install "martino-summarize[server]" |
Server dependencies not installed on serve |
Install the server extra: pipx install "martino-summarize[server]" or pip install "martino-summarize[server]" inside a venv |
| Strange import errors after upgrading other tools | Reinstall in an isolated environment (pipx or a dedicated venv) instead of shared ~/.local site-packages |
| 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 |
| ffmpeg not found | Install ffmpeg and ensure it is on your PATH |
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.2
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.2.tar.gz | 67.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| martino_summarize-0.2.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 130.6 kB
Release files / martino_summarize-0.2.2.tar.gz
| Download URL | martino_summarize-0.2.2.tar.gz |
|---|---|
| Size | 67.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f82144579dedd177e9510ee2296455c1a0db06575a6e824ab9eaf96098ea34cd
|
|
BLAKE2b-256 checksum How to use checksums |
dabcfa2820ee2fd0c97b342ffdd826e79a95dfd00712638f25733c277d0649fc
|
| 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.2-py3-none-any.whl
| Download URL | martino_summarize-0.2.2-py3-none-any.whl |
|---|---|
| Size | 63.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
75bc8b03f19e92de4f661f42a58b802b7d58c481b886f0e3cbf45429d47fbe4d
|
|
BLAKE2b-256 checksum How to use checksums |
01dfca5e87bd15aa135ad6c71d3c4cf0b0a01a1b11c0f5f3ae7c069b1644ef37
|
| 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