steipete/summarizePublic

Point at any URL/YouTube/Podcast or file. Get the gist. CLI and Chrome Extension.

AI summary: A fast, media-aware summarization tool available as a CLI, Chrome Side Panel, and Firefox Sidebar.

Stars
6.5K
+15 today
Forks
439
Watchers
17
Open issues
1
Open PRs
0
Contributors
~61
Commits
2.1K
Branches
37

TypeScriptMITCreated Dec 17, 2025Last push 1d agoLatest release v0.21.7+29 stars this week+29 this month

Star history

since Dec 14, 2025
02K4K6KDec 2025Mar 2026May 2026Aug 2026
6.5K stars as of Aug 6, 2026, tracked back to Dec 14, 2025. Historical curve reconstructed from public GitHub event archives, calibrated to the current total.

Contribution activity

commits per day, last 52 weeks
AugSepOctNovDecJanFebMarAprMayJunJulMonWedFri2025-08-02: 0 commits2025-08-03: 0 commits2025-08-04: 0 commits2025-08-05: 0 commits2025-08-06: 0 commits2025-08-07: 0 commits2025-08-08: 0 commits2025-08-09: 0 commits2025-08-10: 0 commits2025-08-11: 0 commits2025-08-12: 0 commits2025-08-13: 0 commits2025-08-14: 0 commits2025-08-15: 0 commits2025-08-16: 0 commits2025-08-17: 0 commits2025-08-18: 0 commits2025-08-19: 0 commits2025-08-20: 0 commits2025-08-21: 0 commits2025-08-22: 0 commits2025-08-23: 0 commits2025-08-24: 0 commits2025-08-25: 0 commits2025-08-26: 0 commits2025-08-27: 0 commits2025-08-28: 0 commits2025-08-29: 0 commits2025-08-30: 0 commits2025-08-31: 0 commits2025-09-01: 0 commits2025-09-02: 0 commits2025-09-03: 0 commits2025-09-04: 0 commits2025-09-05: 0 commits2025-09-06: 0 commits2025-09-07: 0 commits2025-09-08: 0 commits2025-09-09: 0 commits2025-09-10: 0 commits2025-09-11: 0 commits2025-09-12: 0 commits2025-09-13: 0 commits2025-09-14: 0 commits2025-09-15: 0 commits2025-09-16: 0 commits2025-09-17: 0 commits2025-09-18: 0 commits2025-09-19: 0 commits2025-09-20: 0 commits2025-09-21: 0 commits2025-09-22: 0 commits2025-09-23: 0 commits2025-09-24: 0 commits2025-09-25: 0 commits2025-09-26: 0 commits2025-09-27: 0 commits2025-09-28: 0 commits2025-09-29: 0 commits2025-09-30: 0 commits2025-10-01: 0 commits2025-10-02: 0 commits2025-10-03: 0 commits2025-10-04: 0 commits2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 21 commits2025-12-18: 43 commits2025-12-19: 76 commits2025-12-20: 37 commits2025-12-21: 21 commits2025-12-22: 8 commits2025-12-23: 58 commits2025-12-24: 81 commits2025-12-25: 67 commits2025-12-26: 44 commits2025-12-27: 100 commits2025-12-28: 162 commits2025-12-29: 62 commits2025-12-30: 93 commits2025-12-31: 60 commits2026-01-01: 10 commits2026-01-02: 3 commits2026-01-03: 14 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 4 commits2026-01-07: 5 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 4 commits2026-01-11: 4 commits2026-01-12: 28 commits2026-01-13: 25 commits2026-01-14: 2 commits2026-01-15: 2 commits2026-01-16: 28 commits2026-01-17: 44 commits2026-01-18: 4 commits2026-01-19: 27 commits2026-01-20: 34 commits2026-01-21: 14 commits2026-01-22: 29 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 2 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 1 commit2026-02-01: 1 commit2026-02-02: 8 commits2026-02-03: 5 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 0 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 14 commits2026-02-14: 29 commits2026-02-15: 2 commits2026-02-16: 0 commits2026-02-17: 2 commits2026-02-18: 0 commits2026-02-19: 0 commits2026-02-20: 0 commits2026-02-21: 1 commit2026-02-22: 0 commits2026-02-23: 0 commits2026-02-24: 0 commits2026-02-25: 0 commits2026-02-26: 0 commits2026-02-27: 0 commits2026-02-28: 1 commit2026-03-01: 0 commits2026-03-02: 0 commits2026-03-03: 0 commits2026-03-04: 0 commits2026-03-05: 0 commits2026-03-06: 0 commits2026-03-07: 44 commits2026-03-08: 119 commits2026-03-09: 28 commits2026-03-10: 1 commit2026-03-11: 9 commits2026-03-12: 10 commits2026-03-13: 14 commits2026-03-14: 0 commits2026-03-15: 1 commit2026-03-16: 4 commits2026-03-17: 2 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 5 commits2026-03-21: 1 commit2026-03-22: 1 commit2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 1 commit2026-03-26: 0 commits2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 0 commits2026-03-30: 0 commits2026-03-31: 0 commits2026-04-01: 1 commit2026-04-02: 1 commit2026-04-03: 0 commits2026-04-04: 0 commits2026-04-05: 0 commits2026-04-06: 1 commit2026-04-07: 41 commits2026-04-08: 3 commits2026-04-09: 2 commits2026-04-10: 0 commits2026-04-11: 6 commits2026-04-12: 0 commits2026-04-13: 2 commits2026-04-14: 0 commits2026-04-15: 4 commits2026-04-16: 4 commits2026-04-17: 0 commits2026-04-18: 0 commits2026-04-19: 0 commits2026-04-20: 0 commits2026-04-21: 0 commits2026-04-22: 13 commits2026-04-23: 2 commits2026-04-24: 0 commits2026-04-25: 3 commits2026-04-26: 9 commits2026-04-27: 3 commits2026-04-28: 0 commits2026-04-29: 0 commits2026-04-30: 0 commits2026-05-01: 0 commits2026-05-02: 0 commits2026-05-03: 0 commits2026-05-04: 1 commit2026-05-05: 0 commits2026-05-06: 2 commits2026-05-07: 2 commits2026-05-08: 6 commits2026-05-09: 1 commit2026-05-10: 1 commit2026-05-11: 2 commits2026-05-12: 0 commits2026-05-13: 2 commits2026-05-14: 8 commits2026-05-15: 26 commits2026-05-16: 7 commits2026-05-17: 21 commits2026-05-18: 0 commits2026-05-19: 0 commits2026-05-20: 12 commits2026-05-21: 8 commits2026-05-22: 7 commits2026-05-23: 0 commits2026-05-24: 0 commits2026-05-25: 0 commits2026-05-26: 0 commits2026-05-27: 0 commits2026-05-28: 1 commit2026-05-29: 0 commits2026-05-30: 0 commits2026-05-31: 0 commits2026-06-01: 1 commit2026-06-02: 0 commits2026-06-03: 0 commits2026-06-04: 0 commits2026-06-05: 1 commit2026-06-06: 0 commits2026-06-07: 1 commit2026-06-08: 1 commit2026-06-09: 1 commit2026-06-10: 11 commits2026-06-11: 62 commits2026-06-12: 138 commits2026-06-13: 6 commits2026-06-14: 0 commits2026-06-15: 10 commits2026-06-16: 0 commits2026-06-17: 5 commits2026-06-18: 11 commits2026-06-19: 7 commits2026-06-20: 1 commit2026-06-21: 1 commit2026-06-22: 0 commits2026-06-23: 4 commits2026-06-24: 4 commits2026-06-25: 0 commits2026-06-26: 2 commits2026-06-27: 0 commits2026-06-28: 4 commits2026-06-29: 0 commits2026-06-30: 2 commits2026-07-01: 8 commits2026-07-02: 3 commits2026-07-03: 13 commits2026-07-04: 3 commits2026-07-05: 0 commits2026-07-06: 5 commits2026-07-07: 1 commit2026-07-08: 0 commits2026-07-09: 0 commits2026-07-10: 0 commits2026-07-11: 1 commit2026-07-12: 7 commits2026-07-13: 0 commits2026-07-14: 0 commits2026-07-15: 1 commit2026-07-16: 6 commits2026-07-17: 2 commits2026-07-18: 5 commits2026-07-19: 0 commits2026-07-20: 0 commits2026-07-21: 0 commits2026-07-22: 0 commits2026-07-23: 0 commits2026-07-24: 0 commits2026-07-25: 0 commits2026-07-26: 0 commits2026-07-27: 8 commits2026-07-28: 1 commit2026-07-29: 0 commits2026-07-30: 0 commits2026-07-31: 0 commits2026-08-01: 0 commits
2,059 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Very active

    2,059 commits in 52 weeks

  • Permissive license

    MIT

  • Continuous integration

    Automated checks passing

  • Repeat trending

    3 trending appearances

What summarize does

Summarize provides rapid gists of URLs, files, and various media types directly in your workflow. It uses multiple LLM backends (like Claude, Gemini, and Codex) to analyze content, automatically detecting the difference between a webpage, an audio file, or a video. Notably, it generates 'video slides' by extracting screenshots, OCR data, and transcript cards from YouTube or local videos, offering a rich, multi-modal summary rather than just a wall of text.

Researchers, developers, and power users who need to quickly process large amounts of information from various sources. Requires minimal setup, primarily API keys for the chosen LLM backend.

  • Multi-modal extraction: Generates 'video slides' combining screenshots, OCR, and transcripts for comprehensive video summaries.
  • Media awareness: Automatically detects and adapts its summarization strategy based on whether the input is text, audio, or video.
  • Browser integration: Operates directly within a Chrome Side Panel or Firefox Sidebar, maintaining chat history and streaming responses.
  • CLI capability: Can be run from the terminal to summarize local files or process URLs in scripted workflows.
  • Multiple AI backends: Supports various LLM providers including Claude, Gemini, and OpenAI to power the summaries.

Where teams use it

Rapid content consumption

Allows users to quickly grasp the key points of long articles or YouTube videos without watching them entirely.

Research and note-taking

Useful for extracting specific information and visual slides from educational videos or documentation.

CLI automation

Enables developers to integrate automatic summarization into their terminal workflows or scripts.

Accessible media review

Provides a quick textual and visual breakdown of audio/video content for accessibility or quick reference.

Getting started: npm install -g @steipete/summarize

README

main branch

Summarize 📝 — Chrome Side Panel + CLI

Fast summaries from URLs, files, and media. Works in the terminal, a Chrome Side Panel and Firefox Sidebar.

Highlights

  • Chrome Side Panel chat (streaming agent + history) inside the sidebar.
  • Video slides: screenshots + OCR + transcript cards for YouTube, direct video URLs, and local video files.
  • Media-aware summaries: auto‑detect video/audio vs page content.
  • Coding CLI backends: Codex, Claude, Gemini, Cursor Agent, OpenClaw, OpenCode, GitHub Copilot, Antigravity, pi.
  • Streaming Markdown + metrics + cache‑aware status.
  • CLI supports URLs, files, podcasts, YouTube, audio/video, PDFs.

Feature overview

  • URLs, files, and media: web pages, PDFs, images, audio/video, YouTube, podcasts, RSS.
  • Slide extraction for video sources (YouTube, direct video URLs, local video files) with OCR + timestamped cards.
  • Transcript-first media flow: published transcripts when available, then Groq/ONNX/whisper.cpp/AssemblyAI/Gemini/OpenAI/FAL/Deepgram transcription fallback when not.
  • Coding CLI providers: Claude, Codex, Gemini, Cursor Agent, OpenClaw, OpenCode, GitHub Copilot, Antigravity, pi.
  • Streaming output with Markdown rendering, metrics, and cache-aware status.
  • Local, paid, and free models: OpenAI‑compatible local endpoints, paid providers, plus an OpenRouter free preset.
  • Output modes: Markdown/text, JSON diagnostics, extract-only, metrics, timing, and cost estimates.
  • Smart default: if content is shorter than the requested length, we return it as-is (use --force-summary to override).

Get the extension (recommended)

Summarize extension screenshot

One‑click summarizer for the current tab. Chrome Side Panel + Firefox Sidebar + local daemon for streaming Markdown.

Chrome Web Store: Summarize Side Panel

YouTube slide screenshots (from the browser):

Summarize YouTube slide screenshots

Beginner quickstart (extension)

  1. Install the extension (Chrome Web Store link above) and open the Side Panel.
  2. Choose Direct or Daemon. Direct uses Gemini Nano by default when no provider key is configured, or calls your selected provider from Chrome.
  3. Choose Browser media for daemonless transcription/slides. Optional: install the CLI and pair the daemon for native tools, CLI model fallbacks, OCR, and broader media support:
    • npm (cross-platform): npm i -g @steipete/summarize
    • Homebrew (Homebrew/core): brew install summarize
    • summarize daemon install --token <TOKEN> --port 8787

Why a daemon/service?

  • Direct mode works without the daemon. Auto uses a configured OpenAI, OpenRouter, Anthropic, Gemini, xAI, Z.AI, NVIDIA, MiniMax, GitHub Models, or Ollama provider, otherwise Gemini Nano on-device; keys remain in extension-local storage.
  • The optional daemon adds CLI model fallbacks, shared caches/diagnostics, native ffmpeg, configurable transcription providers, OCR, and broader media support. Chrome reaches it through an explicitly enabled Native Messaging host; retained loopback network access is used only by configured Direct local providers.
  • The service autostarts (launchd/systemd/Scheduled Task) so the Side Panel is always ready.

If you only want the CLI, you can skip the daemon install entirely.

Notes:

  • Summarization only runs when the Side Panel is open.
  • Auto mode summarizes on navigation (incl. SPAs); otherwise use the button.
  • Daemon is localhost-only and requires a shared token; rerunning summarize daemon install --token <TOKEN> adds another paired browser token instead of invalidating the old one.
  • Chrome local-companion access is optional and browser-policy enforceable; Direct and Browser modes do not require it.
  • Non-default port: install with summarize daemon install --token <TOKEN> --port <PORT>, then set the same value in Options → Runtime → Daemon → Port.
  • Autostart: macOS (launchd), Linux (systemd user), Windows (Scheduled Task).
  • Windows containers: summarize daemon install starts the daemon for the current container session but does not register a Scheduled Task. Chrome Daemon mode also needs the pending packaged Windows native-host executable; Direct and Browser modes remain available.
  • Tip: configure free via summarize refresh-free (needs OPENROUTER_API_KEY). Add --set-default to set model=free.

More:

Slides (extension)

  • Select Video + Slides in the Summarize picker.
  • Slides render at the top; expand to full‑width cards with timestamps.
  • Click a slide to seek the video; toggle Transcript/OCR when OCR is significant.
  • Browser mode uses MediaBunny with native WebCodecs and ranged network reads for fetchable videos, then falls back to visible-tab capture when the source or codec is unavailable.
  • Daemon mode adds yt-dlp, native ffmpeg, and optional tesseract OCR.

Advanced (unpacked / dev)

  1. Build + load the extension (unpacked):
    • Chrome: pnpm -C apps/chrome-extension build
      • chrome://extensions → Developer mode → Load unpacked
      • Pick: apps/chrome-extension/.output/chrome-mv3
    • Firefox: pnpm -C apps/chrome-extension build:firefox
      • about:debugging#/runtime/this-firefox → Load Temporary Add-on
      • Pick: apps/chrome-extension/.output/firefox-mv3/manifest.json
  2. Open Side Panel/Sidebar → copy token.
  3. Install daemon in dev mode:
    • pnpm summarize daemon install --token <TOKEN> --dev --extension-id <UNPACKED_ID>

CLI

Summarize CLI screenshot

Install

Requires Node 24+.

  • npx (no install):
npx -y @steipete/summarize "https://example.com"
  • npm (global):
npm i -g @steipete/summarize
  • npm (library / minimal deps):
npm i @steipete/summarize-core
import { createLinkPreviewClient } from "@steipete/summarize-core/content";
  • Homebrew:
brew install summarize

Homebrew ships from homebrew/core via brew install summarize. If Homebrew is unavailable in your environment, use the npm global install above.

Optional local dependencies

Install these if you want media-heavy features:

  • ffmpeg: optional native accelerator with broader codec support; bundled WebAssembly is the fallback
  • yt-dlp: required for YouTube slide extraction and some remote media flows
  • tesseract: optional OCR for --slides-ocr
  • Optional cloud transcription providers:
    • GROQ_API_KEY
    • ASSEMBLYAI_API_KEY
    • ELEVENLABS_API_KEY (speaker diarization)
    • GEMINI_API_KEY / GOOGLE_GENERATIVE_AI_API_KEY / GOOGLE_API_KEY
    • OPENAI_API_KEY
    • FAL_KEY
    • DEEPGRAM_API_KEY

macOS (Homebrew):

brew install ffmpeg yt-dlp
brew install tesseract # optional, for --slides-ocr

If native ffmpeg/ffprobe are unavailable, Summarize uses the bundled WebAssembly build. Native ffmpeg remains recommended for speed and broader codec/filter support.

CLI vs extension

  • CLI only: just install via npm/Homebrew and run summarize ... (no daemon needed).
  • Chrome extension: Direct mode defaults to Gemini Nano without a key and supports provider-backed summaries/chat/automation/hover when configured; Browser media provides daemonless transcription and slides. Install the daemon for CLI fallbacks and native media tools.
  • Firefox extension: install the CLI and daemon for media extraction.

Quickstart

summarize "https://example.com"

Inspect the effective model setup. Status only lists configured or usable providers; it never prints keys or missing-provider noise.

summarize status
summarize status --verbose
summarize status --probe
summarize status --json

--probe checks supported model-list endpoints without running paid inference. CLI providers are reported as available when their enabled executable is present; API providers are reported as configured when an effective key is present.

Inputs

URLs or local paths:

summarize "/path/to/file.pdf" --model google/gemini-3-flash
summarize "https://example.com/report.pdf" --model google/gemini-3-flash
summarize "/path/to/audio.mp3"
summarize "/path/to/video.mp4"

Stdin (pipe content using -):

echo "content" | summarize -
pbpaste | summarize -
# binary stdin also works (PDF/image/audio/video bytes)
cat /path/to/file.pdf | summarize -

Notes:

  • Stdin has a 50MB size limit
  • The - argument tells summarize to read from standard input
  • Text stdin is treated as UTF-8 text (whitespace-only input is rejected as empty)
  • Binary stdin is preserved as raw bytes and file type is auto-detected when possible
  • Useful for piping clipboard content or command output

YouTube (supports youtube.com and youtu.be):

summarize "https://youtu.be/dQw4w9WgXcQ" --youtube auto

Podcast RSS (transcribes latest enclosure):

summarize "https://feeds.npr.org/500005/podcast.xml"

Apple Podcasts episode page:

summarize "https://podcasts.apple.com/us/podcast/2424-jelly-roll/id360084272?i=1000740717432"

Spotify episode page (best-effort; may fail for exclusives):

summarize "https://open.spotify.com/episode/5auotqWAXhhKyb9ymCuBJY"

HLS playlist:

summarize "https://example.com/master.m3u8"

Output length

--length controls how much output we ask for (guideline), not a hard cap. The built-in default is long.

Set a default in ~/.summarize/config.json with output.length.

summarize "https://example.com" --length long
summarize "https://example.com" --length 20k
  • Presets: short|medium|long|xl|xxl
  • Character targets: 1500, 20k, 20000
  • Optional hard cap: --max-output-tokens <count> (e.g. 2000, 2k)
    • Provider/model APIs still enforce their own maximum output limits.
    • If omitted, no max token parameter is sent (provider default).
    • Prefer --length unless you need a hard cap.
  • Short content: when extracted content is shorter than the requested length, the CLI returns the content as-is.
    • Override with --force-summary to always run the LLM.
  • Minimums: --length numeric values must be >= 10 chars; --max-output-tokens must be >= 16.
  • Preset targets (source of truth: packages/core/src/prompts/summary-lengths.ts):
    • short: target ~900 chars (range 600-1,200)
    • medium: target ~1,800 chars (range 1,200-2,500)
    • long: target ~4,200 chars (range 2,500-6,000)
    • xl: target ~9,000 chars (range 6,000-14,000)
    • xxl: target ~17,000 chars (range 14,000-22,000)

What file types work?

Best effort and provider-dependent. These usually work well:

  • text/* and common structured text (.txt, .md, .json, .yaml, .xml, ...)
    • Text-like files are inlined into the prompt for better provider compatibility.
  • PDFs: application/pdf (provider support varies; Google is the most reliable here)
  • Images: image/jpeg, image/png, image/webp, image/gif
  • Audio/Video: audio/*, video/* (local audio/video files MP3/WAV/M4A/OGG/FLAC/MP4/MOV/WEBM automatically transcribed, when supported by the model)

Notes:

  • If a provider rejects a media type, the CLI fails fast with a friendly message.
  • xAI models do not support attaching generic files (like PDFs) via the AI SDK; use Google/OpenAI/Anthropic for those.

Model ids

Use gateway-style ids: <provider>/<model>.

Examples:

  • openai/gpt-5.4
  • openai/gpt-5.4-mini
  • openai/gpt-5.4-nano
  • openai/gpt-5-mini
  • openai/gpt-5-nano
  • github-copilot/gpt-5.4
  • anthropic/claude-sonnet-4-5
  • xai/grok-4-fast-non-reasoning
  • google/gemini-3-flash
  • zai/glm-4.7
  • minimax/MiniMax-M3
  • openrouter/openai/gpt-5-mini (force OpenRouter)

Note: some models/providers do not support streaming or certain file media types. When that happens, the CLI prints a friendly error (or auto-disables streaming for that model when supported by the provider). gpt-5.4-mini and gpt-5.4-nano are treated as real model ids; the same shorthand also works under github-copilot/....

OpenAI fast mode and thinking

Fast mode is a request option, not a model id:

summarize "https://example.com" --model openai/gpt-5.5 --fast --thinking medium
summarize "https://example.com" --model openai/gpt-5.4 --service-tier fast --thinking low
  • --fast is shorthand for --service-tier fast.
  • --service-tier default|fast|priority|flex controls OpenAI service tier. fast is the summarize/Codex-facing spelling and is sent to OpenAI as service_tier="priority".
  • --thinking none|low|medium|high|xhigh controls OpenAI reasoning effort. Aliases: offnone, minlow, mid / medmedium, x-high / extra-highxhigh.
  • --service-tier default clears a configured tier for one run.

Config equivalent:

{
  "model": "openai/gpt-5.5",
  "openai": {
    "serviceTier": "fast",
    "thinking": "medium"
  }
}

Compatibility aliases still work, but prefer the explicit flags above:

  • --model gpt-fast / --model fastopenai/gpt-5.5 + fast tier + medium thinking
  • --model openai/gpt-5.5-fastopenai/gpt-5.5 + fast tier

Limits

  • Text inputs over 10 MB are rejected before tokenization.
  • Text prompts are preflighted against the model input limit (LiteLLM catalog), using a GPT tokenizer.

Common flags

summarize <input> [flags]

Use summarize --help or summarize help for the full help text.

  • --model <provider/model>: which model to use (defaults to auto)
  • --model auto: automatic model selection + fallback (default)
  • --model <name>: use a built-in or config-defined preset (see Configuration)
  • --timeout <duration>: 30s, 2m, 5000ms (default 2m)
  • --retries <count>: LLM retry attempts after timeouts or transient API failures (default 1)
  • --length short|medium|long|xl|xxl|s|m|l|<chars>
  • --language, --lang <language>: output language (auto = match source)
  • --max-output-tokens <count>: hard cap for LLM output tokens
  • --cli [provider]: use a CLI provider (--model cli/<provider>). Supports claude, gemini, codex, agent, openclaw, opencode, copilot, agy, pi. If omitted, uses auto selection with CLI enabled.
  • --stream auto|on|off: stream LLM output (auto = TTY only; disabled in --json mode)
  • --plain: keep raw output (no ANSI/OSC Markdown rendering)
  • --no-color: disable ANSI colors
  • --theme <name>: CLI theme (aurora, ember, moss, mono)
  • --format md|text: website/file content format (default text)
  • --markdown-mode off|auto|llm|readability: HTML -> Markdown mode (default readability)
  • --preprocess off|auto|always: controls uvx markitdown usage (default auto)
    • Install uvx: brew install uv (or https://astral.sh/uv/)
    • Image-only PDFs can fall back to OpenAI vision OCR when OPENAI_API_KEY is set; override the OCR model with MARKITDOWN_OCR_MODEL or page render DPI with MARKITDOWN_OCR_DPI.
  • --extract: print extracted content and exit (URLs, YouTube/direct media, local audio/video, and local PDFs; stdin - is not supported)
    • Deprecated alias: --extract-only
  • --slides: extract slides for YouTube, direct video URLs, or local video files and render them inline in the summary narrative (auto-renders inline in supported terminals)
  • --no-slides: disable slide extraction enabled in ~/.summarize/config.json for one run
  • --slides-ocr: run OCR on extracted slides (requires tesseract)
  • --no-slides-ocr: disable slide OCR enabled in ~/.summarize/config.json for one run
  • --slides-dir <dir>: base output dir for slide images (default ./slides)
  • --slides-scene-threshold <value>: scene detection threshold (0.1-1.0)
  • --slides-max <count>: maximum slides to extract (default 6)
  • --slides-min-duration <seconds>: minimum seconds between slides
  • --json: machine-readable output with diagnostics, prompt, metrics, and optional summary
  • --verbose: debug/diagnostics on stderr
  • --metrics off|on|detailed: metrics output (default on)

Coding CLIs (Codex, Claude, Gemini, Agent, OpenClaw, OpenCode, Copilot, Antigravity, pi)

Summarize can use common coding CLIs as local model backends:

  • codex -> --cli codex / --model cli/codex/<model>
  • claude -> --cli claude / --model cli/claude/<model>
  • gemini -> --cli gemini / --model cli/gemini/<model>
  • agent (Cursor Agent CLI) -> --cli agent / --model cli/agent/<model>
  • openclaw -> --cli openclaw / --model cli/openclaw/<model> or --model openclaw/<model>
  • opencode -> --cli opencode / --model cli/opencode/<model> (--model cli/opencode uses the OpenCode runtime default)
  • copilot (GitHub Copilot CLI) -> --cli copilot / --model cli/copilot/<model> (--model cli/copilot uses the Copilot runtime default)
  • agy (Antigravity CLI) -> --cli agy / --model cli/agy (uses agy's active session model; per-call model selection is not supported by agy print mode)
  • pi (Pi Coding Agent) -> --cli pi / --model cli/pi or --model cli/pi/<model>

Built-in preset:

  • --model codex-fast runs Codex with GPT-5.5 Fast mode and requires codex login.

Requirements:

  • Binary installed and on PATH (or set CODEX_PATH, CLAUDE_PATH, GEMINI_PATH, AGENT_PATH, OPENCLAW_PATH, OPENCODE_PATH, COPILOT_PATH, AGY_PATH, PI_PATH)
  • Provider authenticated (codex login, claude auth, gemini login flow, agent login or CURSOR_API_KEY, opencode auth login, GitHub Copilot CLI authenticated, agy login flow or ANTIGRAVITY_API_KEY, pi uses configured provider API keys)

Quick smoke test:

printf "Summarize CLI smoke input.\nOne short paragraph. Reply can be brief.\n" >/tmp/summarize-cli-smoke.txt

summarize --cli codex --plain --timeout 2m /tmp/summarize-cli-smoke.txt
summarize --cli claude --plain --timeout 2m /tmp/summarize-cli-smoke.txt
summarize --cli gemini --plain --timeout 2m /tmp/summarize-cli-smoke.txt
summarize --cli agent --plain --timeout 2m /tmp/summarize-cli-smoke.txt
summarize --cli openclaw --plain --timeout 2m /tmp/summarize-cli-smoke.txt
summarize --cli opencode --plain --timeout 2m /tmp/summarize-cli-smoke.txt
summarize --cli copilot --plain --timeout 2m /tmp/summarize-cli-smoke.txt
summarize --cli agy --plain --timeout 2m /tmp/summarize-cli-smoke.txt
summarize --cli pi --plain --timeout 2m /tmp/summarize-cli-smoke.txt

Set explicit CLI allowlist/order:

{
  "cli": {
    "enabled": [
      "codex",
      "claude",
      "gemini",
      "agent",
      "openclaw",
      "opencode",
      "copilot",
      "agy",
      "pi"
    ]
  }
}

Configure implicit auto CLI fallback:

{
  "cli": {
    "autoFallback": {
      "enabled": true,
      "onlyWhenNoApiKeys": true,
      "order": ["claude", "gemini", "codex", "agent", "openclaw", "opencode", "copilot"]
    }
  }
}

More details: docs/cli.md

Auto model ordering

--model auto builds candidate attempts from built-in rules (or your model.rules overrides). CLI attempts are prepended when:

  • cli.enabled is set (explicit allowlist/order), or
  • implicit auto selection is active and cli.autoFallback is enabled.

Default fallback behavior: only when no API keys are configured, order claude, gemini, codex, agent, openclaw, opencode, copilot, and remember/prioritize last successful provider (~/.summarize/cli-state.json). Antigravity and pi are opt-in unless you add them to cli.autoFallback.order.

Set explicit CLI attempts:

{
  "cli": { "enabled": ["gemini"] }
}

Disable implicit auto CLI fallback:

{
  "cli": { "autoFallback": { "enabled": false } }
}

Note: explicit --model auto does not trigger implicit auto CLI fallback unless cli.enabled is set.

Website extraction (Firecrawl + Markdown)

Non-YouTube URLs go through a fetch -> extract pipeline. When direct fetch/extraction is blocked or too thin, --firecrawl auto can fall back to Firecrawl (if configured).

  • --firecrawl off|auto|always (default auto)
  • --extract --format md|text (default text; if --format is omitted, --extract defaults to md for non-YouTube URLs)
  • --markdown-mode off|auto|llm|readability (default readability)
    • auto: use an LLM converter when configured; may fall back to uvx markitdown
    • llm: force LLM conversion (requires a configured model key)
    • off: disable LLM conversion (still may return Firecrawl Markdown when configured)
  • Plain-text mode: use --format text.

YouTube transcripts

--youtube auto tries best-effort web transcript endpoints first. When captions are not available, it falls back to:

  1. yt-dlp + Whisper (if yt-dlp is available): downloads audio, then tries Groq (GROQ_API_KEY) first when configured. If Groq is unavailable or fails, it uses configured local ONNX/whisper.cpp, then AssemblyAI (ASSEMBLYAI_API_KEY), Gemini (GEMINI_API_KEY / Google aliases), OpenAI (OPENAI_API_KEY), FAL (FAL_KEY), then Deepgram (DEEPGRAM_API_KEY).
  2. Android VR direct audio + the same configured transcription chain when yt-dlp is unavailable or fails
  3. Apify (if APIFY_API_TOKEN is set): uses a scraping actor (faVsWy9VTSNVIhWpR)

Environment variables for yt-dlp mode:

  • YT_DLP_PATH - optional path to yt-dlp binary (otherwise yt-dlp is resolved via PATH)
  • SUMMARIZE_WHISPER_CPP_MODEL_PATH - optional override for the local whisper.cpp model file
  • SUMMARIZE_WHISPER_CPP_BINARY - optional override for the local binary (default: whisper-cli)
  • SUMMARIZE_DISABLE_LOCAL_WHISPER_CPP=1 - disable local whisper.cpp (force remote)
  • GROQ_API_KEY - Groq Whisper transcription
  • ASSEMBLYAI_API_KEY - AssemblyAI transcription
  • GEMINI_API_KEY - Gemini transcription (GOOGLE_GENERATIVE_AI_API_KEY / GOOGLE_API_KEY also work)
  • SUMMARIZE_GEMINI_TRANSCRIPTION_MODEL - optional Gemini model override (default: gemini-2.5-flash)
  • OPENAI_API_KEY - OpenAI Whisper transcription
  • OPENAI_WHISPER_BASE_URL - optional OpenAI-compatible Whisper endpoint override
  • FAL_KEY - FAL AI Whisper fallback
  • DEEPGRAM_API_KEY - Deepgram Nova transcription fallback
  • SUMMARIZE_DEEPGRAM_TRANSCRIPTION_MODEL - optional Deepgram model override (default: nova-3)

Apify costs money but tends to be more reliable when captions exist.

Speaker-labelled transcripts for YouTube, local audio/video, and direct media URLs:

summarize "https://www.youtube.com/watch?v=..." --extract --diarize
summarize "./interview.mp3" --extract --diarize
summarize "https://cdn.example.com/interview.mp4" --extract --diarize openai
summarize "./interview.mp4" --extract --diarize openai \
  --identify-speakers --speaker-at "0:00=Host" --speaker-at "0:12=Guest"
summarize "https://www.youtube.com/watch?v=..." --extract --diarize elevenlabs
summarize "https://www.youtube.com/watch?v=..." --extract --diarize openai --timestamps
summarize "https://www.youtube.com/watch?v=..." --extract --diarize elevenlabs \
  --identify-speakers --speaker-profile my-podcast \
  --speaker-at "0:12=Host Name" --remember-speakers

Bare --diarize prefers ElevenLabs Scribe v2 (ELEVENLABS_API_KEY) and falls back to OpenAI gpt-4o-transcribe-diarize (OPENAI_API_KEY). Speaker changes are emitted as Speaker <label>: ...; combine with --timestamps for [mm:ss] Speaker <label>: .... Before upload, local video is reduced to mono 16 kHz MP3 with native or bundled FFmpeg and the same audio file is reused across provider fallbacks. Local audio is passed through unless OpenAI's upload limit requires compression. YouTube diarization downloads audio only. When combined with --slides, one yt-dlp invocation downloads separate audio and slide-quality video streams; diarization uploads the audio while slides reuse the video. Remote direct media uses its normal audio download path. YouTube transcript extraction also prints the current public view count and exposes the resolved video ID and observation timestamp in extracted.sourceMetrics in JSON output. Long OpenAI recordings are split into bounded chunks; timestamps are reassembled and chunk-local provider labels stay distinct so label resets cannot silently merge different voices.

--identify-speakers replaces generic labels with names for YouTube and direct media. Repeat --speaker-at <timestamp=name> for authoritative examples; unresolved labels are inferred with OpenAI GPT-5.5 and only accepted above the configured confidence threshold. --remember-speakers stores the profile, anchors, and a transcript-hash-guarded mapping in ~/.summarize/config.json for later runs. See YouTube speaker identification.

Slide extraction (YouTube + direct video URLs + local video files)

Extract slide screenshots (scene detection via ffmpeg) and optional OCR:

Requirements:

  • bundled FFmpeg WebAssembly, or native ffmpeg for faster extraction and broader codec support
  • yt-dlp for YouTube video download/stream resolution
  • tesseract only when using --slides-ocr
summarize "https://www.youtube.com/watch?v=..." --slides
summarize "https://www.youtube.com/watch?v=..." --slides --slides-ocr
summarize "/path/to/video.webm" --slides

Outputs are written under ./slides/<sourceId>/ (or --slides-dir). OCR results are included in JSON output (--json) and stored in slides.json inside the slide directory. When scene detection is too sparse, the extractor also samples at a fixed interval to improve coverage. When using --slides, supported terminals (kitty/iTerm/Konsole) render inline thumbnails automatically inside the summary narrative (the model inserts [slide:N] markers). Timestamp links are clickable when the terminal supports OSC-8 (YouTube/Vimeo/Loom/Dropbox). If inline images are unsupported, Summarize prints a note with the on-disk slide directory. Local video files stay on the slide-aware path, transcribe in place, and avoid fake download labels.

Use --slides --extract to print the full timed transcript and insert slide images inline at matching timestamps.

Format the extracted transcript as Markdown (headings + paragraphs) via an LLM:

summarize "https://www.youtube.com/watch?v=..." --extract --format md --markdown-mode llm

Media transcription (Whisper)

Local audio/video files are transcribed first, then summarized. --video-mode transcript forces direct media URLs (and embedded media) through Whisper first. Auto mode tries Groq first when configured, then local ONNX/whisper.cpp, then cloud fallbacks. Configure local ONNX/whisper.cpp for local-only transcription; otherwise set one of GROQ_API_KEY, ASSEMBLYAI_API_KEY, GEMINI_API_KEY (or Google aliases), OPENAI_API_KEY, FAL_KEY, or DEEPGRAM_API_KEY. Use --diarize [auto|elevenlabs|openai] for speaker-labelled MP3/MP4 and other supported media; diarization requires ELEVENLABS_API_KEY or OPENAI_API_KEY.

Local ONNX transcription (Parakeet/Canary)

Summarize can use NVIDIA Parakeet/Canary ONNX models via a local CLI you provide. Auto selection tries Groq first when configured, then ONNX before whisper.cpp and the remaining cloud fallbacks.

  • Setup helper: summarize transcriber setup
  • Install sherpa-onnx from upstream binaries/build (Homebrew may not have a formula)
  • Auto selection: set SUMMARIZE_ONNX_PARAKEET_CMD or SUMMARIZE_ONNX_CANARY_CMD (no flag needed)
  • Select the local transcription stage: --transcriber parakeet|canary|whisper|auto
  • Docs: docs/nvidia-onnx-transcription.md

Verified podcast services (2026-07-17)

Run: summarize <url>

  • Apple Podcasts
  • Spotify
  • Xiaoyuzhou
  • Amazon Music / Audible podcast pages
  • Podbean
  • Podchaser
  • RSS feeds (Podcasting 2.0 transcripts when available)
  • Embedded YouTube podcast pages (e.g. JREPodcast)

Transcription: tries Groq first when configured, then local ONNX/whisper.cpp, then AssemblyAI, Gemini, OpenAI, FAL, or Deepgram when keys are set.

Translation paths

--language/--lang controls the output language of the summary (and other LLM-generated text). Default is auto.

When the input is audio/video, the CLI needs a transcript first. The transcript comes from one of these paths:

  1. Existing transcript (preferred)
    • YouTube: uses youtubei / captionTracks when available.
    • Podcasts: uses Podcasting 2.0 RSS <podcast:transcript> (JSON/VTT) when the feed publishes it.
  2. Whisper transcription (fallback)
    • YouTube: prefers yt-dlp audio download, then Android VR direct audio, plus Whisper transcription when configured; Apify is a last resort.
    • Tries Groq (GROQ_API_KEY) first when configured.
    • Then uses configured local ONNX/whisper.cpp.
    • Then uses cloud transcription in this order: AssemblyAI (ASSEMBLYAI_API_KEY) → Gemini (GEMINI_API_KEY / Google aliases) → OpenAI (OPENAI_API_KEY) → FAL (FAL_KEY) → Deepgram (DEEPGRAM_API_KEY).

For direct media URLs, use --video-mode transcript to force transcribe -> summarize:

summarize https://example.com/file.mp4 --video-mode transcript --lang en

Configuration

Single config location:

  • ~/.summarize/config.json

Run summarize status to inspect the effective default model, configured presets, and model providers available from config, environment variables, local endpoints, or installed CLIs.

Supported keys today:

{
  "model": { "id": "openai/gpt-5-mini" },
  "env": { "OPENAI_API_KEY": "sk-..." },
  "output": { "length": "long" },
  "ui": { "theme": "ember" }
}

Shorthand (equivalent):

{
  "model": "openai/gpt-5-mini"
}

Also supported:

  • model: { "mode": "auto" } (automatic model selection + fallback; see docs/model-auto.md)
  • model.rules (customize candidates / ordering)
  • models (define presets selectable via --model <preset>; overrides built-ins like free)
  • env (generic env var defaults; process env still wins)
  • apiKeys (legacy shortcut, mapped to env names; prefer env for new configs)
  • output.length (default: long; accepts short|medium|long|xl|xxl|20k)
  • cache.media (media download cache: TTL 7 days, 2048 MB cap by default; --no-media-cache disables)
  • media.videoMode: "auto"|"transcript"|"understand"
  • media.embeddedVideo: "auto"|"off"|"prefer"|"both" (default auto: combine substantial articles with primary embedded YouTube captions)
  • slides.enabled / slides.max / slides.ocr / slides.dir (defaults for --slides)
  • ui.theme: "aurora"|"ember"|"moss"|"mono"
  • openai.useChatCompletions: true (force OpenAI-compatible chat completions)
  • openai.serviceTier: "fast"|"priority"|"flex" (use "fast" for the friendly alias)
  • openai.thinking / openai.reasoningEffort: "none"|"low"|"medium"|"high"|"xhigh"
  • openai.textVerbosity: "low"|"medium"|"high"

Note: the config is parsed leniently (JSON5), but comments are not allowed. Unknown keys are ignored.

Media cache defaults:

{
  "cache": {
    "media": { "enabled": true, "ttlDays": 7, "maxMb": 2048, "verify": "size" }
  }
}

Note: --no-cache bypasses summary caching only (LLM output). Extract/transcript caches still apply. Use --no-media-cache to skip media files.

Precedence:

  1. --model
  2. SUMMARIZE_MODEL
  3. ~/.summarize/config.json
  4. default (auto)

Theme precedence:

  1. --theme
  2. SUMMARIZE_THEME
  3. ~/.summarize/config.json (ui.theme)
  4. default (aurora)

Environment variable precedence:

  1. process env
  2. ~/.summarize/config.json (env)
  3. ~/.summarize/config.json (apiKeys, legacy)

Environment variables

Set the key matching your chosen --model:

  • Optional fallback defaults can be stored in config:

    • ~/.summarize/config.json -> "env": { "OPENAI_API_KEY": "sk-..." }
    • process env always takes precedence
    • legacy "apiKeys" still works (mapped to env names)
  • OPENAI_API_KEY (for openai/...)

  • NVIDIA_API_KEY (for nvidia/...)

  • MINIMAX_API_KEY (for minimax/...)

  • ANTHROPIC_API_KEY (for anthropic/...)

  • XAI_API_KEY (for xai/...)

  • Z_AI_API_KEY (for zai/...; supports ZAI_API_KEY alias)

  • GEMINI_API_KEY (for google/...)

    • also accepts GOOGLE_GENERATIVE_AI_API_KEY and GOOGLE_API_KEY as aliases

OpenAI-compatible chat completions toggle:

  • OPENAI_USE_CHAT_COMPLETIONS=1 (or set openai.useChatCompletions in config)

UI theme:

  • SUMMARIZE_THEME=aurora|ember|moss|mono
  • SUMMARIZE_TRUECOLOR=1 (force 24-bit ANSI)
  • SUMMARIZE_NO_TRUECOLOR=1 (disable 24-bit ANSI)

OpenRouter (OpenAI-compatible):

  • Set OPENROUTER_API_KEY=...
  • Prefer forcing OpenRouter per model id: --model openrouter/<author>/<slug>
  • Built-in preset: --model free (uses a default set of OpenRouter :free models)

summarize refresh-free

Quick start: make free the default (keep auto available)

summarize refresh-free --set-default
summarize "https://example.com"
summarize "https://example.com" --model auto

Regenerates the free preset (models.free in ~/.summarize/config.json) by:

  • Fetching OpenRouter /models, filtering :free
  • Skipping models that look very small (<27B by default) based on the model id/name
  • Testing which ones return non-empty text (concurrency 4, timeout 10s)
  • Picking a mix of smart-ish (bigger context_length / output cap) and fast models
  • Refining timings and writing the sorted list back

If --model free stops working, run:

summarize refresh-free

Flags:

  • --runs 2 (default): extra timing runs per selected model (total runs = 1 + runs)
  • --smart 3 (default): how many smart-first picks (rest filled by fastest)
  • --min-params 27b (default): ignore models with inferred size smaller than N billion parameters
  • --max-age-days 180 (default): ignore models older than N days (set 0 to disable)
  • --set-default: also sets "model": "free" in ~/.summarize/config.json

Example:

OPENROUTER_API_KEY=sk-or-... summarize "https://example.com" --model openrouter/meta-llama/llama-3.1-8b-instruct:free
OPENROUTER_API_KEY=sk-or-... summarize "https://example.com" --model openrouter/minimax/minimax-m2.5

If your OpenRouter account enforces an allowed-provider list, make sure at least one provider is allowed for the selected model. When routing fails, summarize prints the exact providers to allow.

Legacy: OPENAI_BASE_URL=https://openrouter.ai/api/v1 (and either OPENAI_API_KEY or OPENROUTER_API_KEY) also works.

NVIDIA API Catalog (OpenAI-compatible; free credits):

  • Set NVIDIA_API_KEY=...
  • Optional: NVIDIA_BASE_URL=https://integrate.api.nvidia.com/v1
  • Credits: API Catalog trial starts with 1000 free API credits on signup (up to 5000 total via “Request More” in the API Catalog profile)
  • Pick a model id from /v1/models (examples: fast stepfun-ai/step-3.5-flash, strong but slower z-ai/glm5)
export NVIDIA_API_KEY="nvapi-..."
summarize "https://example.com" --model nvidia/stepfun-ai/step-3.5-flash

Z.AI (OpenAI-compatible):

  • Z_AI_API_KEY=... (or ZAI_API_KEY=...)
  • Optional base URL override: Z_AI_BASE_URL=...

MiniMax (OpenAI-compatible):

  • Set MINIMAX_API_KEY=...
  • Optional base URL override: MINIMAX_BASE_URL=... (default https://api.minimax.io/v1; use the China endpoint or a proxy if needed)
  • Pick a MiniMax model id (e.g. MiniMax-M3, MiniMax-M2.5) using MiniMax's exact casing
  • Reasoning is requested through MiniMax's separated response fields and omitted from summary text
export MINIMAX_API_KEY="..."
summarize "https://example.com" --model minimax/MiniMax-M3

Optional services:

  • FIRECRAWL_API_KEY (website extraction fallback)
  • YT_DLP_PATH (path to yt-dlp binary for audio extraction)
  • GROQ_API_KEY (Groq Whisper transcription)
  • ASSEMBLYAI_API_KEY (AssemblyAI transcription)
  • ELEVENLABS_API_KEY (ElevenLabs Scribe v2 speaker diarization)
  • GEMINI_API_KEY / GOOGLE_GENERATIVE_AI_API_KEY / GOOGLE_API_KEY (Gemini transcription)
  • SUMMARIZE_GEMINI_TRANSCRIPTION_MODEL (optional Gemini model override; default gemini-2.5-flash)
  • OPENAI_API_KEY / OPENAI_WHISPER_BASE_URL (OpenAI Whisper transcription)
  • FAL_KEY (FAL AI API key for audio transcription via Whisper)
  • DEEPGRAM_API_KEY (Deepgram API key for Nova transcription)
  • SUMMARIZE_DEEPGRAM_TRANSCRIPTION_MODEL (optional Deepgram model override; default nova-3)
  • APIFY_API_TOKEN (YouTube transcript fallback)

Model limits

The CLI uses the LiteLLM model catalog for model limits (like max output tokens):

  • Downloaded from: https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json
  • Cached at: ~/.summarize/cache/

Library usage (optional)

Recommended (minimal deps):

  • @steipete/summarize-core/content
  • @steipete/summarize-core/prompts

Compatibility (pulls in CLI deps):

  • @steipete/summarize/content
  • @steipete/summarize/prompts

Development

pnpm install
pnpm check

More

Troubleshooting

  • "Receiving end does not exist": Chrome did not inject the content script yet.
    • Extension details -> Site access -> On all sites (or allow this domain)
    • Reload the tab once.
  • "Failed to fetch" / daemon unreachable:
    • summarize daemon status
    • For a non-default port, confirm Options → Runtime → Daemon → Port matches the daemon configuration.
    • Logs: ~/.summarize/logs/daemon.err.log

License: MIT

View on GitHub

Recent activity

commits and pull requests

Recent open issues

view all

Releases and announcements

41 total
  1. v0.21.7v0.21.7Jul 28, 202680 downloads

    ### Highlights - Chrome extension: restore persisted Logs and Processes tabs without aborting options-page startup (#370, #371; thanks @ostehost). - Refresh policy-eligible dependencies and remove the vulnerable cleanup chain, including patched protobufjs and sharp transitive releases. ### Dependencies and maintenance - Refresh the CLI, browser-media, test, formatting, lint, and GitHub Actions toolchain. - Sign and notarize the Bun macOS executables, verify both architectures without signing credentials, and publish only the verified artifacts. - Embed the tokenizer vocabulary in standalone Bun executables so release binaries do not depend on checkout files.

  2. v0.21.6v0.21.6Jul 18, 2026440 downloads

    ### Highlights - Xiaoyuzhou podcast pages now resolve their validated episode audio automatically for extraction and summaries. ### Features - Podcasts: resolve Xiaoyuzhou episode pages through validated audio metadata (#364, thanks @Owengogogo). ### Dependencies and maintenance - Refresh policy-eligible runtime, test, type, formatting, and lint dependencies. - Pin patched `adm-zip` metadata handling for the extension's ONNX runtime toolchain. ### Verification - Signed tag commit: `3e19f4d70fb626db45470834f45b4e615b66dcdd`. - [CLI npm package](https://www.npmjs.com/package/@steipete/summarize/v/0.21.6) and [registry tarball](https://registry.npmjs.org/@steipete/summarize/-/summarize-0.21.6.tgz), published at `2026-07-18T21:13:12.353Z` with integrity `sha512-DNrqSBHuNrT8bJvTQpvKZdLDsrA1ieEeLOYiwVR6DqLbEz6fPcnmC5vL9jd/L8Be9hzDx4GhyhF0KGT8nq0WSA==`. - [Core npm package](https://www.npmjs.com/package/@steipete/summarize-core/v/0.21.6) and [registry tarball](https://registry.npmjs.org/@steipete/summarize-core/-/summarize-core-0.21.6.tgz), published at `2026-07-18T21:12:54.050Z` with integrity `sha512-mS2O/8nOoyV9U35fSouMactvNs0BKscbvB6fxfub25+fY6rBIxCY9jgJt9GJt46jBWAssUN7MF/++8BF

  3. v0.21.5v0.21.5Jul 17, 2026148 downloads

    ### Fixes - whisper.cpp: disable cross-window text context to prevent cascading repetition and truncated long-form transcripts (#363, thanks @Owengogogo).

  4. v0.21.4v0.21.4Jul 16, 202657 downloads

    ### Fixes - URL routing: classify YouTube inputs by hostname so lookalike domains use normal website extraction and labels. - CLI arguments: preserve `--` so dash-prefixed local paths remain valid positional inputs. - CLI providers: synchronize Copilot, Antigravity, and pi setup, overrides, fallback order, and smoke-test documentation (#359, thanks @vincent-peng). - Dependencies: update the policy-eligible type-aware Oxlint release. - Chrome extension: keep MiniMax Direct reasoning separate from visible streamed summaries (#354, thanks @vincent-peng). - Chrome extension: route daemon Connect to actionable Runtime diagnostics for permissions, native-host failures, ports, and stale extension state (#352, #356; thanks @buhusa and @vincent-peng). - Antigravity CLI: pass prompts through the required print argument with platform-safe size limits and prompt-safe errors (#357, thanks @mvance). - Security: block private browser-media URLs in the extension and stop remote binary attachments from auto-enabling broad CLI tool permissions. - Chrome extension: make User Scripts optional, omit debugger access from summary builds, and provide a separate debugger-enabled automation build. - Loom:

  5. v0.21.3v0.21.3Jul 6, 2026435 downloads

    ### Fixes - Transcription: align CLI/docs with the runtime fallback order and preserve Gemini model overrides in installed daemons (#344, thanks @vincent-peng). - Reddit extraction: retry verification-blocked threads through old Reddit and preserve the post plus comments in Markdown (#343, thanks @manfredlift). - CLI slides: accept `--no-slides` and `--no-slides-ocr` so configured slide defaults can be disabled per run (#345, thanks @vincent-peng). - Slides: bound optional calibration probes so the bundled FFmpeg fallback cannot stall for minutes when Node shutdown lingers. - Daemon setup: report native messaging hosts installed for valid unpacked Chrome extension IDs instead of falsely marking them missing. ### Distribution proof - npm: [@steipete/summarize 0.21.3](https://www.npmjs.com/package/@steipete/summarize/v/0.21.3) · [registry tarball](https://registry.npmjs.org/@steipete/summarize/-/summarize-0.21.3.tgz) · integrity `sha512-V6gA3V9RvYSaL8RiBC6vbViGxd4JwJ0nhgvPupnrE96QT7rKZjQBOZh/LRJK8e4MyOn+Zl+77VqtAA823qjovA==` · published 2026-07-06T15:15:41.777Z. - npm: [@steipete/summarize-core 0.21.3](https://www.npmjs.com/package/@steipete/summarize-core/v/0.21.3) · [registry t

Commits per week

last 52 weeks
4040Week of 2025-08-02: 0 commitsWeek of 2025-08-09: 0 commitsWeek of 2025-08-16: 0 commitsWeek of 2025-08-23: 0 commitsWeek of 2025-08-30: 0 commitsWeek of 2025-09-06: 0 commitsWeek of 2025-09-13: 0 commitsWeek of 2025-09-20: 0 commitsWeek of 2025-09-27: 0 commitsWeek of 2025-10-04: 0 commitsWeek of 2025-10-11: 0 commitsWeek of 2025-10-18: 0 commitsWeek of 2025-10-25: 0 commitsWeek of 2025-11-01: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 177 commitsWeek of 2025-12-21: 379 commitsWeek of 2025-12-28: 404 commitsWeek of 2026-01-04: 13 commitsWeek of 2026-01-11: 133 commitsWeek of 2026-01-18: 108 commitsWeek of 2026-01-25: 3 commitsWeek of 2026-02-01: 14 commitsWeek of 2026-02-08: 43 commitsWeek of 2026-02-15: 5 commitsWeek of 2026-02-22: 1 commitsWeek of 2026-03-01: 44 commitsWeek of 2026-03-08: 181 commitsWeek of 2026-03-15: 13 commitsWeek of 2026-03-22: 2 commitsWeek of 2026-03-29: 2 commitsWeek of 2026-04-05: 53 commitsWeek of 2026-04-12: 10 commitsWeek of 2026-04-19: 18 commitsWeek of 2026-04-26: 12 commitsWeek of 2026-05-03: 12 commitsWeek of 2026-05-10: 46 commitsWeek of 2026-05-17: 48 commitsWeek of 2026-05-24: 1 commitsWeek of 2026-05-31: 2 commitsWeek of 2026-06-07: 220 commitsWeek of 2026-06-14: 34 commitsWeek of 2026-06-21: 11 commitsWeek of 2026-06-28: 33 commitsWeek of 2026-07-05: 7 commitsWeek of 2026-07-12: 21 commitsWeek of 2026-07-19: 0 commitsWeek of 2026-07-26: 9 commitsAug 2, 2025Jul 26, 2026
2.1K commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 21 commitsSun 1:00 — 37 commitsSun 2:00 — 24 commitsSun 3:00 — 21 commitsSun 4:00 — 13 commitsSun 5:00 — 12 commitsSun 6:00 — 5 commitsSun 7:00 — 5 commitsSun 8:00 — 4 commitsSun 9:00 — 2 commitsSun 10:00 — 23 commitsSun 11:00 — 29 commitsSun 12:00 — 12 commitsSun 13:00 — 10 commitsSun 14:00 — 13 commitsSun 15:00 — 32 commitsSun 16:00 — 30 commitsSun 17:00 — 15 commitsSun 18:00 — 1 commitsSun 19:00 — 6 commitsSun 20:00 — 23 commitsSun 21:00 — 4 commitsSun 22:00 — 2 commitsSun 23:00 — 15 commitsMon 0:00 — 19 commitsMon 1:00 — 7 commitsMon 2:00 — 8 commitsMon 3:00 — 10 commitsMon 4:00 — 3 commitsMon 5:00 — 8 commitsMon 6:00 — 6 commitsMon 7:00 — 6 commitsMon 8:00 — 5 commitsMon 9:00 — 22 commitsMon 10:00 — 11 commitsMon 11:00 — 6 commitsMon 12:00 — 3 commitsMon 13:00 — 3 commitsMon 14:00 — 9 commitsMon 15:00 — 6 commitsMon 16:00 — 18 commitsMon 17:00 — 12 commitsMon 18:00 — 7 commitsMon 19:00 — 2 commitsMon 20:00 — 9 commitsMon 21:00 — 7 commitsMon 22:00 — 4 commitsMon 23:00 — 11 commitsTue 0:00 — 2 commitsTue 1:00 — 15 commitsTue 2:00 — 13 commitsTue 3:00 — 3 commitsTue 4:00 — 10 commitsTue 5:00 — 12 commitsTue 6:00 — 9 commitsTue 7:00 — 3 commitsTue 8:00 — 8 commitsTue 9:00 — 6 commitsTue 10:00 — 6 commitsTue 11:00 — 25 commitsTue 12:00 — 28 commitsTue 13:00 — 5 commitsTue 14:00 — 9 commitsTue 15:00 — 18 commitsTue 16:00 — 21 commitsTue 17:00 — 4 commitsTue 18:00 — 8 commitsTue 19:00 — 19 commitsTue 20:00 — 13 commitsTue 21:00 — 9 commitsTue 22:00 — 13 commitsTue 23:00 — 15 commitsWed 0:00 — 33 commitsWed 1:00 — 17 commitsWed 2:00 — 12 commitsWed 3:00 — 6 commitsWed 4:00 — 12 commitsWed 5:00 — 6 commitsWed 6:00 — 1 commitsWed 7:00 — 1 commitsWed 8:00 — 7 commitsWed 9:00 — 5 commitsWed 10:00 — 1 commitsWed 11:00 — 1 commitsWed 12:00 — 3 commitsWed 13:00 — 5 commitsWed 14:00 — 12 commitsWed 15:00 — 18 commitsWed 16:00 — 14 commitsWed 17:00 — 9 commitsWed 18:00 — 8 commitsWed 19:00 — 21 commitsWed 20:00 — 14 commitsWed 21:00 — 17 commitsWed 22:00 — 18 commitsWed 23:00 — 18 commitsThu 0:00 — 28 commitsThu 1:00 — 25 commitsThu 2:00 — 24 commitsThu 3:00 — 17 commitsThu 4:00 — 5 commitsThu 5:00 — 3 commitsThu 6:00 — 7 commitsThu 7:00 — 2 commitsThu 8:00 — 5 commitsThu 9:00 — 12 commitsThu 10:00 — 9 commitsThu 11:00 — 16 commitsThu 12:00 — 10 commitsThu 13:00 — 8 commitsThu 14:00 — 13 commitsThu 15:00 — 6 commitsThu 16:00 — 2 commitsThu 17:00 — 9 commitsThu 18:00 — 13 commitsThu 19:00 — 7 commitsThu 20:00 — 6 commitsThu 21:00 — 11 commitsThu 22:00 — 9 commitsThu 23:00 — 24 commitsFri 0:00 — 35 commitsFri 1:00 — 11 commitsFri 2:00 — 6 commitsFri 3:00 — 14 commitsFri 4:00 — 27 commitsFri 5:00 — 18 commitsFri 6:00 — 24 commitsFri 7:00 — 20 commitsFri 8:00 — 26 commitsFri 9:00 — 9 commitsFri 10:00 — 21 commitsFri 11:00 — 10 commitsFri 12:00 — 29 commitsFri 13:00 — 18 commitsFri 14:00 — 24 commitsFri 15:00 — 4 commitsFri 16:00 — 3 commitsFri 17:00 — 9 commitsFri 18:00 — 15 commitsFri 19:00 — 10 commitsFri 20:00 — 9 commitsFri 21:00 — 12 commitsFri 22:00 — 14 commitsFri 23:00 — 18 commitsSat 0:00 — 18 commitsSat 1:00 — 9 commitsSat 2:00 — 18 commitsSat 3:00 — 27 commitsSat 4:00 — 25 commitsSat 5:00 — 1 commitsSat 6:00 — 1 commitsSat 7:00 — 4 commitsSat 8:00 — 7 commitsSat 9:00 — 5 commitsSat 10:00 — 15 commitsSat 11:00 — 14 commitsSat 12:00 — 26 commitsSat 13:00 — 14 commitsSat 14:00 — 19 commitsSat 15:00 — 12 commitsSat 16:00 — 6 commitsSat 17:00 — 4 commitsSat 18:00 — 18 commitsSat 19:00 — 18 commitsSat 20:00 — 20 commitsSat 21:00 — 6 commitsSat 22:00 — 13 commitsSat 23:00 — 9 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.

Who is committing

last 52 weeks
Maintainer commits1,904 (91%)
Community commits196 (9%)

2,100 commits in total over the last year.

DateListRankStars gained
Feb 16, 2026daily#14+175
Feb 15, 2026daily#9+262
Feb 14, 2026daily#22+148
  • freeCodeCamp/freeCodeCamp

    freeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.

    453.6K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    385.5K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • obra/superpowers

    An agentic skills framework & software development methodology that works.

    268.6K stars · Shell