Personal browser companion and summarization tool for qutebrowser. Summarize web pages, YouTube videos, and entire documentation sites. Chat with an AI companion that can read, navigate, and interact with any page in your browser.
A side panel inside qutebrowser powered by Claude (Opus). Opens via :companion or Ctrl+/.
- Chat about any page — ask questions, get explanations, extract data
- Navigate sites — Claude reads pages, follows links, scrolls, and explores
- Interact with elements — fill forms, click buttons, search via snapshot refs
- Summarize on demand — quick summaries in chat, or save persistent summaries to file
- Per-tab conversations — each tab has its own independent chat with session persistence
- YouTube transcripts — fetches captions server-side for video summarization
- Keyboard-driven —
gcto focus,Tabto scroll mode,j/kto scroll,ito type,Escapeto exit
- Web pages — extracts text via CDP from qutebrowser tabs
- YouTube videos — fetches captions via ANDROID innertube API (no browser needed)
- Documentation sites — crawls sitemaps and links, summarizes with map-reduce for large sites
- Output — saves article, summary, and styled HTML page to
~/.elsummariz00r/ - Dedup — won't re-summarize a URL you've already processed (use
--redoto force)
Opens Claude Code in a tmux window with the full article and summary for in-depth follow-up questions. Sessions can be resumed.
:companion # Toggle companion panel (or Ctrl+/)
gc # Focus the panel input
Tab # Switch to scroll mode (j/k to scroll, i to type)
Escape # Return focus to the page
In the companion chat:
- "summarize this page" → quick summary in chat
- "save summary" → saves article + summary + HTML, opens in new tab
- "what is this page about?" → reads and explains
- "navigate to the docs section" → clicks links, follows navigation
- "fill in this form" → interacts with form elements
els <url> # Summarize a URL
els # Summarize active qutebrowser tab
els -s <url> # Summarize entire site/docs
els -r <url> # Force re-summarize (ignore cache)
els -d <url> # Summarize + open discussion in tmux
els -d -n <url> # Force new discussion session:summarize # Summarize current page, open HTML in new tab
:summarize-site # Summarize entire site/docs
:resummarize # Force re-summarize
:resummarize-site # Force re-summarize site
:discuss # Open Claude Code discussion for current page
:discuss-new # Force new discussion session
:companion # Toggle companion panel
elsummariz00r/
├── src/
│ ├── index.ts # CLI entry point
│ ├── run.ts # Core orchestration (summarize, summarize-site, discuss)
│ ├── cdp.ts # CDP client (qutebrowser on port 2262)
│ ├── youtube.ts # YouTube caption extraction via innertube
│ ├── summarize.ts # Claude Agent SDK wrapper (one-shot, Opus)
│ ├── storage.ts # File I/O for ~/.elsummariz00r/
│ ├── site.ts # Site crawling (sitemap + link fallback)
│ ├── html.ts # HTML template (Tokyo Night theme)
│ ├── tmux.ts # Discussion session management
│ ├── env.ts # Shared env loading + model config
│ └── companion/
│ ├── index.ts # Companion server entry point
│ ├── server.ts # Bun HTTP/WebSocket server (port 7700)
│ ├── conversation.ts # Per-tab conversation manager (session persistence)
│ ├── tools.ts # System prompt + summarization skill
│ └── chat.html # Chat UI (Tokyo Night, vim navigation)
├── bin/
│ ├── els # CLI wrapper
│ ├── qb-summarize # qutebrowser userscript
│ ├── qb-summarize-site # qutebrowser userscript
│ ├── qb-resummarize # qutebrowser userscript
│ ├── qb-discuss # qutebrowser userscript
│ ├── qb-discuss-new # qutebrowser userscript
│ ├── qb-companion # Companion panel toggle
│ └── qb-companion-focus # Companion panel focus
└── scripts/
└── setup.sh # First-time setup
The companion requires:
- qutebrowser with CDP enabled (
remote-debugging-port=2262) - CDP Proxy — bridges agent-browser to qutebrowser's CDP (spoofs Chrome identity, handles tab targeting)
- agent-browser v0.22.3 — Rust CLI for structured page snapshots with element refs, click/fill/scroll interaction
- config.py additions — panel injection via InspectorSplitter, auto-start for proxy + companion server
The companion panel is injected as a QWebEngineView into each tab's InspectorSplitter (same mechanism as qb devtools). It persists across page navigation and each tab has its own independent conversation.
- Bun
- Claude Code with a valid OAuth token
- qutebrowser (pip-installed:
pip3 install --user PyQt6 PyQt6-WebEngine qutebrowser aiohttp) - agent-browser v0.22.3+ (
npm install -g agent-browser) - tmux (for discussion sessions)
git clone https://github.com/alkautsarf/elsummariz00r.git
cd elsummariz00r
bun install
bun run setupAdd to your ~/.qutebrowser/config.py:
# CDP for agent-browser
c.qt.args = ['remote-debugging-port=2262']
# elsummariz00r commands
c.aliases['summarize'] = 'spawn --userscript summarize'
c.aliases['resummarize'] = 'spawn --userscript resummarize'
c.aliases['summarize-site'] = 'spawn --userscript summarize-site'
c.aliases['resummarize-site'] = 'spawn --userscript resummarize-site'
c.aliases['discuss'] = 'spawn --userscript discuss'
c.aliases['discuss-new'] = 'spawn --userscript discuss-new'
c.aliases['companion'] = 'spawn --userscript companion'
# Keybinds
config.bind('<Ctrl-/>', 'companion')
config.bind('gc', 'devtools-focus')The companion panel injection and auto-start code goes at the end of config.py — see the full config in the project's setup documentation.
All config lives in ~/.elsummariz00r/.env:
# Required
CLAUDE_CODE_OAUTH_TOKEN=your-token-here
# Optional: change the model
ELS_MODEL=claude-opus-5-5[1m]Model resolution order is ELS_MODEL, then S0NDER_MODEL (shared across the s0nderlabs tools), then a hardcoded default of claude-opus-4-8. Values may be quoted or unquoted; surrounding quotes are stripped. The companion reports whichever id it was configured with when asked, rather than guessing from training data, which for a model's own generation is always stale.
~/.elsummariz00r/
├── .env # OAuth token + config
├── CLAUDE.md # Context for discussion sessions
├── articles/ # Full extracted text (markdown + YAML frontmatter)
├── summaries/ # AI-generated summaries
└── html/ # Self-contained HTML summary pages (Tokyo Night theme)
Just one: @anthropic-ai/claude-agent-sdk. Bun handles everything else natively (WebSocket, file I/O, HTTP fetch).