Try the docs ·
Run locally in 60s ·
Local-first multi-source video summarization (YouTube, social, drives, files) with any OpenAI-compatible LLM, optional vision path, and NotebookLM-style workflows.
Not steipete/summarize — This is a self-hosted video pipeline with transcript cache, Cobalt fallback, Streamlit workspace, and an agent skill. Steipete's project is a generic URL clipper.
Bring your own API keys. Full docs live at summarize.martino.im.
You need any openai compatible API key in .env (for example Groq GROQ_API_KEY is free-tier friendly; 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"The summary is saved to summaries/watch_YYYYMMDD_HHMMSS.md.
Install extras as needed:
pipx install "martino-summarize[server]" # HTTP API
pipx install "martino-summarize[all]" # server + whisper + litellmgit 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 -dOpen http://localhost:8501, paste a URL, and summarize.
Or pull the pre-built image:
docker pull ghcr.io/martinopiaggi/summarize:latestdocker-compose.yml mounts .env, summarizer.yaml, and ./summaries/ for persistence. Cobalt runs as a sidecar for TikTok, Instagram, and other yt-dlp fallbacks.
| 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/ |
Full docs live at summarize.martino.im.
+--------------------+
| Video URL/Path |
+---------+----------+
|
v
+---------+----------+
| Source Type? |
+---------+----------+
|
+----------------+--------------------+
| visual flag |
v v
+-------+--------+ +---------+----------+
| Visual Mode | | Transcript Cache |-------------> HIT ---+
| base64 / url | +---------+----------+ |
+-------+--------+ | MISS |
| | |
| v |
| +-------+ +-------+ +-------+ +-------+ |
| |YouTube| |yt-dlp | | Local | |Dropbox| |
| | | |X.com | | File | |G.Drive| |
| | | |TikTok | | | | | |
| | | |etc. | | | | | |
| +---+---+ +---+---+ +---+---+ +---+---+ |
| | | | | |
| v v | | |
| +----+---+ +--+---+ | | |
| |Captions| |Cobalt| | | |
| | Exist? | +--+---+ | | |
| +---+----+ | | | |
| Yes No | | | |
| +----+ | +--------+--------------+ |
| | | | |
| +-------------->| v |
| | +--------+--------+ |
| | | Whisper | |
| | | endpoint? | |
| | +--------+--------+ |
| | | |
| | +-----------+-----------+ |
| | | | |
| | | Cloud Whisper Local | |
| | | | |
| | +----------+------------+ |
| | | |
| +------------------------|--+ |
| v |
| store in cache |
| | |
| +-----------------+
| |
| | Transcript
| |
| v
| summarizer.yaml -> +------------+----------+
| prompts.json -> | Prompt + LLM |
| | Merge |
| +------------+----------+
| |
| v
v +------------+----------+
+-------+--------+ | |
| Vision-capable | | Output |
| model |----------------------------------------->+ |
+-------+--------+ +-----------------------+
^
|
+----- prompts.json
- Transcript path (default): downloads audio/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.
- yt-dlp / platform errors: ensure Cobalt is running (
docker composeincludes it) or setCOBALT_BASE_URL - Missing API key: add the provider key to
.env(seesummarizer.example.yamlfor provider names) - No config file: run
summarizer --init-configor pass--base-urland--modelwith--no-config
Full guide: summarize.martino.im
git clone https://github.com/martinopiaggi/summarize.git
cd summarize
pip install -e ".[all]"
pip install pytest
pytest tests/See CONTRIBUTING.md.
