 Command

Pranesh Nikhar's personal site. Vim-style keybinds for navigation; theme + font pickers below.

Theme
 Font Body Code
Reader
Keybinds
Navigation
j / ↓ Next item k / ↑ Previous item g First item in region G Last item in region zz Center focused item h / l Move left/right region ] / [ Next/previous heading } / { Next/previous block d / u Half-page down/up
Layout
<zh> / <zl> Toggle left/right sidebar <zr> Toggle reader view <zj> / <zk> Focus main/navbar <S-h/j/k/l> Focus left/main/navbar/right ⌃H / ⌃L Focus left/right sidebar ⌃J / ⌃K Focus main/navbar ⇧C / ⇧E Collapse / expand all sections
Dialogs
⌃P / : Command palette ⌃X Theme picker / Search ? Show keybinds Esc / ⌃C Close dialog
History
n Next document b Previous document ⌃O History back ⌃I History forward
 Search
about: Pranesh Nikhar about/more: 🪪 More docs/test: Docs Test ideas: 💡 Ideas more: ➕ More now: Now posts: 📬 Posts projects: 📚 Projects webtui: Style posts/agentic-eda: AgenticEDA — Automated Exploratory Data Analysis with LangGraph posts/cap-theorem-outage-story: CAP Theorem with a Real Outage Story posts/codepilot: CodePilot — From Requirements to Deployable FastAPI Backend posts/common-auth-mistakes: Common Auth Mistakes Developers Make posts/compiled-vs-jit-vs-interpreted: Why Is X Language Fast or Slow? — Compiled vs JIT vs Interpreted posts/cs-degree-gaps: Things CS Degrees Don't Teach You posts/cve-2025-breach-analysis: CVE-2025 Breach Analysis — Midnight Blizzard and the 16 Billion Credential Leak posts/fixloop: FixLoop — AI Agent Loop for Self-Correcting Code posts/functional-vs-oop: Functional vs OOP — Same Problem, Both Ways posts/getman: Getman — Declarative API Tester for CLI & TUI posts/how-compilers-optimize: How Compilers Actually Optimize Your Code posts/http3-quic: HTTP/3 and QUIC — Why They Matter posts/leetcode-vs-engineering: LeetCode vs Real Engineering Skills posts/llm-from-scratch: LLM from Scratch — GPT-Style Transformer in PyTorch posts/lsm-trees-bloom-filters: LSM Trees & Bloom Filters — Production Deep Dive posts/mcp-workflow-builder: MCP Workflow Builder — Visual DAG for MCP Tools posts/persistent-memory: Persistent Memory — Long-Term Memory for AI Agents via MCP posts/playcli: PlayCLI — Terminal Video Player posts/postgres-mvcc: How PostgreSQL MVCC Works — Multi-Version Concurrency Control Deep Dive posts/raft-consensus: Raft Consensus Algorithm Explained posts/rust-borrow-checker: Rust Borrow Checker — Catches Real Bugs posts/titan: Titan — Terminal AI Coding Agent posts/what-happens-url: What Happens Between Typing a URL and Seeing the Page posts/what-happens-when-you-run-a-program: What Actually Happens When You Run a Program posts/zero-knowledge-proofs: Zero-Knowledge Proofs Explained Simply webtui/components/accordion: Accordion webtui/components/badge: Badge webtui/components/button: Button webtui/components/checkbox: Checkbox webtui/components/dialog: Dialog webtui/components/input: Input webtui/components/popover: Popover webtui/components/pre: Pre webtui/components/progress: Progress webtui/components/radio: Radio webtui/components/range: Range webtui/components/separator: Separator webtui/components/spinner: Spinner webtui/components/switch: Switch webtui/components/table: Table webtui/components/textarea: Textarea webtui/components/tooltip: Popover webtui/components/typography: Typography webtui/components/view: View webtui/contributing/contributing: Contributing webtui/contributing/contributing: ## Local Development webtui/contributing/contributing: ## Issues webtui/contributing/contributing: ## Pull Requests webtui/contributing/style-guide: Style Guide webtui/contributing/style-guide: ## CSS Units webtui/contributing/style-guide: ## Selectors webtui/contributing/style-guide: ## Documentation webtui/installation/astro: Astro webtui/installation/astro: ## Scoping webtui/installation/astro: ### Frontmatter Imports webtui/installation/astro: ### ‹style› tag webtui/installation/astro: ### Full Library Import webtui/installation/nextjs: Next.js webtui/installation/vite: Vite webtui/plugins/plugin-dev: Developing Plugins webtui/plugins/plugin-dev: ### Style Layers webtui/plugins/plugin-nf: Nerd Font Plugin webtui/plugins/theme-catppuccin: Catppuccin Theme webtui/plugins/theme-custom: Custom Theme webtui/plugins/theme-everforest: Everforest Theme webtui/plugins/theme-gruvbox: Gruvbox Theme webtui/plugins/theme-nord: Nord Theme webtui/plugins/theme-vitesse: Vitesse Theme webtui/start/ascii-boxes: ASCII Boxes webtui/start/changelog: Changelog webtui/start/installation: Installation webtui/start/installation: ## Installation webtui/start/installation: ## Using CSS webtui/start/installation: ## Using ESM webtui/start/installation: ## Using a CDN webtui/start/installation: ## Full Library Import webtui/start/installation: ### CSS webtui/start/installation: ### ESM webtui/start/installation: ### CDN webtui/start/intro: Introduction webtui/start/intro: ## Features webtui/start/plugins: Plugins webtui/start/plugins: ## Official Plugins webtui/start/plugins: ### Themes webtui/start/plugins: ## Community Plugins webtui/start/theming: Theming webtui/start/theming: ## CSS Variables webtui/start/theming: ### Font Styles webtui/start/theming: ### Colors webtui/start/theming: ### Light & Dark webtui/start/theming: ## Theme Plugins webtui/start/theming: ### Using Multiple Theme Accents webtui/start/tuis-vs-guis: TUIs vs GUIs webtui/start/tuis-vs-guis: ## Monospace Fonts webtui/start/tuis-vs-guis: ## Character Cells posts/termium: Termium — Chromium-Based Terminal Browser posts/new-projects-july-2026: New Projects — GRIT, Sage, Terrain Analyser, Self-Healing RAG, and More watchlist: 🎬 Watchlist posts/graph-engineering-rag: Graph Engineering replaced RAG at Microsoft, Stanford and Anthropic posts/graph-engineering-claude: Graph Engineering with Claude: 14-Step Roadmap from 0 to Graph Architect posts/agent-harness-loop-graph-engineering: Agent Harness Engineering vs Loop Engineering vs Graph Engineering
 Theme Current: Light j/k or ↑/↓ + Enter

Termium — Chromium-Based Terminal Browser

A Rust-powered terminal browser that renders real web pages with pixel-perfect fidelity in kitty, WezTerm, and Ghostty using Chromium headless + CDP.

🎯 What It Does

Termium is a Chromium-based terminal browser written in Rust. It renders real web pages — HTML, CSS, JS, the whole deal — directly in your terminal with pixel-perfect fidelity.

termium start https://news.ycombinator.com

It drives a headless Chromium instance (patched Carbonyl fork) via the Chrome DevTools Protocol, captures JPEG frames, decodes them, and renders each frame to the terminal using kitty/sixel/ANSI protocols at ~10 FPS — all without leaving your terminal.


🧱 Tech Stack

ComponentTechnology
LanguageRust 2021 edition
Browser EngineChromium (Carbonyl fork, patched for terminal output)
ProtocolCDP (Chrome DevTools Protocol) over WebSocket
Render backendsKitty, Sixel, ANSI (block chars)
Image pipelineJPEG capture → decode → terminal encode

The key design decision: no GUI toolkit, no X11/Wayland dependency. Termium talks directly to Chromium’s debugging protocol and renders frames using terminal escape sequences — it works in any terminal that supports kitty or sixel graphics.


🏗️ Architecture

┌──────────────┐     CDP (WebSocket)     ┌──────────────────┐
│   Carbonyl   │◄────────────────────────►│  libtermium CLI  │
│  (Chromium   │                          │  (Rust)          │
│   headless)  │── JPEG frames ──────────►│  ├─ CDP client   │
└──────────────┘                          │  ├─ WS client    │
                                          │  ├─ JPEG decode  │
                                          │  └─ kitty/sixel  │
                                          │     /ANSI encode │
                                          └────────┬─────────┘
                                                   │ stdin/stdout
                                          ┌────────▼─────────┐
                                          │  Terminal         │
                                          │  (kitty/WezTerm/  │
                                          │   Ghostty)        │
                                          └──────────────────┘

The workspace has two crates:

  • libtermium — Core library: CDP client, WebSocket transport, JPEG decoding, and terminal protocol encoding (kitty/sixel/ANSI)
  • termium-cli — CLI frontend: keyboard input handling, frame rendering loop, terminal capability detection

🖥️ Render Protocols

ProtocolQualityTerminals
KittyPixel-perfect, 24-bit color, zstd compressionkitty, WezTerm (≥2023), Ghostty
SixelPixel-perfect, 256-colorxterm, mlterm
ANSIBlock characters (U+2584)All terminals (fallback)

🚀 Quick Start

# Build from source
git clone https://github.com/praneshnikhar/Termium
cd Termium
cargo build --release

# Download the Chromium binary
./target/release/termium download

# Browse the web in your terminal
./target/release/termium start https://news.ycombinator.com

🧠 How It Works

  1. termium download fetches a pre-patched Carbonyl Chromium binary
  2. termium start <url> launches Chromium headless with --headless=new and connects via CDP WebSocket
  3. Chromium captures viewport screenshots as JPEG frames and streams them over CDP
  4. libtermium decodes each JPEG, diffs against the previous frame, and encodes the delta as terminal graphics protocol commands
  5. The CLI pumps frames at ~10 FPS, forwarding keyboard input back to Chromium via CDP input events

The magic is in the protocol encoding: kitty graphics protocol supports 24-bit color, zstd-compressed frames, and pixel-perfect placement — making the terminal feel like a real browser window.


💡 Why It’s Interesting

Termium is a genuinely novel approach to terminal browsing. Instead of text-mode browsers (lynx, w3m) that strip the web to text, or framebuffer approaches that require root, Termium uses Chromium’s headless mode + terminal graphics protocols to deliver the real web in any modern terminal. It’s the only Rust-native terminal browser that supports kitty pixel graphics, and the architecture (CDP + JPEG frames + terminal encode) is clean enough to extend to any protocol.

 praneshnikhar.site / posts / termium · Top 1:1