This reporitory [https://tangled.org/janantos.tngl.sh/brow6el] is now the main and only source of truth, previous on Codeberg [https://codeberg.org/janantos/brow6el] is kept for referrence only. I have decided to migrated from Codeberg because of my other projects are not welcomed there anymore and I want to keep my projects together on single platform.
Brow6el - Terminal Web Browser with Graphics Support#
A full-featured web browser for the terminal using Chromium (CEF) with support for Sixel and Kitty graphics protocols.
WARNING: Kitty image support (currently only in main branch builds) by its design nature is barelly usable in SSH when brow6el runs on remote host, this feature is usable when brow6el is executed on localhost. On ssh the responsivenes of browser is significantly affected, due to massive data transfers on each frame rendered
WARNING: Kitty image support (currently only in main branch builds), Ubuntu 24.04 is shipped with very old Kitty version 0.32.2 which does not handle newer image protocol brow6el is using as BASE64 data are being printed instead rendered screen. however foot terminal works on Ubuntu perfectly fine
WARNING: this is POC code quality. Build process tested in Ubuntu 25.10, Debian 13, Arch Linux. The browser itself was tested in foot terminal, wezterm, kitty, ghostty, yaft framebuffer terminal and Windows 11 Terminal with sixel support using WSL2.
Screenshots#
Demo#

Page view#

JavaScript console#

Features#
Graphics Protocols - Supports both Sixel and Kitty graphics protocols with automatic detection
Tiled Rendering - Optional tile-based Sixel rendering for improved responsiveness (Sixel only)
Mouse Support - Click, scroll, and interact with web pages
Vim-Style Modal Control - Efficient keyboard navigation with three modes (STANDARD, INSERT, MOUSE, VISUAL)
Grid Jump Mode - Fast mouse positioning with recursive grid navigation (3-4 keystrokes to almost any element)
Element Inspector - Browser DevTools-like element inspection in MOUSE mode
JavaScript Console - Execute JS commands and view console logs
Bookmarks - Save and organize your favorite pages
User Scripts - Inject custom JavaScript into pages
Download Manager - Save files with progress tracking
Popup Handling - Terminal-friendly popup dialogs
Multi-Instance - Run multiple browser windows simultaneously
Configurable Profiles - Choose between temporary (private) or persistent (normal) browsing
DNS-over-HTTPS (DoH) - Secure DNS with configurable providers and modes
Modern Web - Full HTML5/CSS3/JavaScript support via Chromium
Vim-Style Modal Control#
Brow6el uses a vim-inspired modal keyboard interface with three modes. The current mode is always shown in the status bar (e.g., [S][T] for Standard mode with Tiled rendering).
STANDARD Mode [S] - Default#
Vim-like navigation with single-key commands (no Ctrl required):
Navigation:
h/j/k/l or arrow keys - Navigate (left/down/up/right)
t/g - Scroll up/down
p/n - Back/forward in history
Actions:
r - Reload page
u - Navigate to URL
U - Copy current URL to clipboard (Shift+U)
c - Toggle JavaScript console
d - Add bookmark
b - Open bookmarks
f - Hint mode (keyboard link navigation)
s - User scripts menu
y - Toggle auto-inject user scripts
z - Toggle tiled rendering (Sixel only, reduces flicker)
Z - Force full redraw (Sixel: monolithic render, Kitty: full refresh)
m - Open downloads manager
x - Exit browser
Zoom Controls:
- or = - Zoom in
- or _ - Zoom out
0 - Reset zoom to 1.0x
Mode Switch:
i - Enter INSERT mode
e - Enter MOUSE mode
v - Enter VISUAL mode (text selection)
INSERT Mode [I]#
All keypresses pass through to the webpage. Use for typing in forms, text areas, etc.
Exit: ESC - Return to STANDARD mode
VISUAL Mode [V]#
Text selection mode for copying page content. The caret starts at the first visible text, or if coming from MOUSE mode, at the mouse cursor position.
Caret Positioning (initial):
h - Move cursor left by character
l - Move cursor right by character
w - Move cursor forward by word
b - Move cursor backward by word
j - Move cursor down by line
k - Move cursor up by line
v - Start selecting from current position
Selection (after pressing v):
h - Extend selection left by character
l - Extend selection right by character
w - Extend selection forward by word
b - Extend selection backward by word
j - Extend selection down by line
k - Extend selection up by line
Actions:
y - Copy selection to clipboard, exit VISUAL mode
ESC - Cancel selection, exit VISUAL mode
Tip: Use MOUSE mode (e) to position cursor, then press ESC and v to start text selection at that exact position!
MOUSE Mode [M]#
Keyboard-driven mouse emulation with visual cursor:
Movement:
h/j/k/l or arrow keys - Move mouse (left/down/up/right)
q/f - Toggle precision/fast speed
r - Toggle drag-and-drop
g - Toggle grid jump mode (fast navigation)
Actions:
SPACE or ENTER - Click at cursor position or drop
i - Toggle inspect mode (show element info on hover)
r - Drop when drag-and-drop is active
Exit: e or ESC - Return to STANDARD mode
Grid Jump Mode#
Fast mouse positioning using keyboard-driven grid navigation. Press g in MOUSE mode to activate:
Adaptive Grid Overlay - A 3x3 grid with labeled cells appears (default keys: qweasdzxc)
Quick Jump - Press a key (q/w/e/a/s/d/z/x/c) to jump to that grid cell
Recursive Zoom - Automatically shows sub-grid in selected cell for precision
Visual Feedback - Green grid indicates more zoom levels available, red indicates maximum zoom
Auto-Precision_movement - At maximum zoom, grid switches to cursor movement mode with high precision
Navigation - Backspace to zoom out, ESC to exit grid mode
Configurable Keys - Customize grid keys in ~/.brow6el/browser.conf (grid_keys setting)
Grid mode enables precise element selection with just 3-4 keystrokes, combining speed with accuracy.
Inspect Mode#
While in MOUSE mode, press i to toggle inspect mode. This feature works similar to browser DevTools inspector:
Element Highlighting - Cyan border around the element under cursor
Info Panel - Shows element details including:
Tag name, ID, and classes
Key attributes (href, src, type, name, etc.)
Dimensions and position
Text content preview
Tag name, ID, and classes
Key attributes (href, src, type, name, etc.)
Dimensions and position
Text content preview
Real-time Updates - Info updates as you move the cursor
Toggle Off - Press i again to exit inspect mode
This is useful for debugging web pages, understanding page structure, or finding specific elements.
Smart Mode Switching#
The browser automatically switches modes based on context:
Clicking an input field in MOUSE mode → Auto-switch to INSERT mode
Clicking a select box in MOUSE mode → Auto-switch to STANDARD mode
Page navigation → Auto-reset to STANDARD mode
Advanced Navigation Modes#
Hint Mode (f key)#
Press f to show yellow hint labels on all links. Type the hint label (e.g., "a", "ab") and press Enter to navigate. This provides keyboard-only navigation without needing a mouse. Press ESC or f again to exit.
Mouse Emulation Mode (e key)#
Press e to activate a yellow mouse cursor overlay. Use hjkl or arrow keys to move it around the page and press SPACE/Enter to click at that position. q toggles precision mode, f toggles fast mode. Press i to toggle inspect mode which shows detailed element information as you hover. This works on all elements including iframes and consent dialogs. Press ESC or e again to exit.
Quick Start#
Examples#
The examples/ directory contains:
userscripts/ - Example user scripts (dark mode, Google customization, etc.)
See examples/README.md for details.
Advanced Features#
Bookmarks#
Press d (in STANDARD mode) to bookmark the current page
Press b (in STANDARD mode) to view and manage bookmarks
Navigate with ↑/↓ or j/k, press Enter to open, 'd' to delete
Bookmarks stored in ~/.brow6el/bookmarks
User Scripts#
Custom JavaScript injection system similar to Greasemonkey/Tampermonkey.
Quick Start:
Create script directory: mkdir -p ~/.brow6el/userscripts
Add .js files to the directory
Configure URL patterns in ~/.brow6el/userscripts.conf
Press s to manually inject or y to toggle auto-inject
Example config (~/.brow6el/userscripts.conf):
See USERSCRIPTS.md for detailed documentation.
Bundled Scripts:
The browser comes with several pre-installed scripts in the scripts/ directory:
view-source.js - View HTML source code with syntax highlighting, formatting, and line numbers (keyboard navigable)
reader-mode.js - Simplifies pages to just article content (like Firefox Reader View)
adblock.js - Basic ad blocking functionality
force-light-mode.js - Forces light color scheme on all pages
frameset-redirect.js - Redirects from frameset pages to actual content
To use bundled scripts, add them to your ~/.brow6el/userscripts.conf:
Then press s to open the user scripts menu and select "View Page Source", or enable auto-inject and press the script's trigger key.
Profile Modes#
Brow6el supports different profile modes for different use cases:
Temporary Mode (Default):
Each session uses a new profile
All data (cookies, cache, history) deleted on exit
Perfect for private browsing
No data persists between sessions
Persistent Mode:
Profile saved in ~/.brow6el/profile
Cookies and login sessions maintained
Cache speeds up repeated visits
Works like a normal browser
Configuration (~/.brow6el/browser.conf):
Examples:
Private browsing: profile_mode=temporary (default)
Normal browsing: profile_mode=persistent
Multiple profiles: profile_mode=custom with different paths
Semi-private: persistent with clear_cookies_on_exit=true
Secure DNS with blocking: doh_enabled=true with doh_mode=secure
HTTP proxy with auth: proxy_enabled=true, proxy_server=http://proxy.local:8080, proxy_username=user
DNS-over-HTTPS (DoH)#
Brow6el supports DNS-over-HTTPS to encrypt DNS queries and prevent DNS-based tracking or blocking.
Configuration (~/.brow6el/browser.conf):
DoH Modes:
secure - Mandatory DoH with no fallback to system DNS (recommended for ad-blocking/privacy)
automatic - Attempts DoH first, falls back to system DNS on failure
off - Disables DoH
Popular DoH Providers:
Cloudflare: https://cloudflare-dns.com/dns-query (fast, privacy-focused)
Google: https://dns.google/dns-query (reliable, global)
Quad9: https://dns.quad9.net/dns-query (security-focused, blocks malicious domains)
Note: When using secure mode, ensure your DoH server resolves google.com (used by CEF for connectivity checks) or allows all domains, otherwise DoH may fail to initialize.
Proxy Configuration#
Brow6el supports routing browser traffic through HTTP, HTTPS, and SOCKS proxies with optional authentication.
Configuration (~/.brow6el/browser.conf):
Proxy Schemes:
http:// - HTTP proxy
https:// - HTTPS proxy (connects to proxy via HTTPS)
socks4:// - SOCKS v4 proxy
socks5:// - SOCKS v5 proxy
Authentication:
HTTP/HTTPS proxies: Full authentication support via proxy_username and proxy_password
SOCKS proxies: Authentication not supported by Chromium's proxy implementation
If credentials are configured, authentication happens automatically (no dialog)
If credentials are empty and proxy requires auth, interactive dialog will appear
Examples:
SOCKS5 proxy (no auth): proxy_server=socks5://127.0.0.1:1080
HTTP proxy: proxy_server=http://proxy.example.com:8080
HTTPS proxy: proxy_server=https://secure-proxy.example.com:443
Corporate proxy: proxy_server=http://proxy.corp.local:3128
Note: Set proxy_enabled=false or leave proxy_server empty to disable proxy.
Graphics Protocols#
Brow6el supports both Sixel and Kitty graphics protocols with automatic terminal detection.
Sixel Protocol (recommended):
Default and most widely supported
Supports both tiled and monolithic rendering
Tiled rendering reduces flicker significantly
Generally faster for typing-heavy workflows
Supported terminals: mlterm, xterm, wezterm, foot, etc.
Kitty Protocol:
Alternative graphics protocol for Kitty-compatible terminals
Always uses monolithic rendering (entire screen redrawn)
Double buffering prevents flicker
30 FPS frame rate for smooth animations
Supported terminals: kitty, ghostty, wezterm, etc.
Configuration (~/.brow6el/browser.conf):
Runtime Controls:
Press z (in STANDARD mode) to toggle tiled/monolithic rendering (Sixel only)
Press Z (in STANDARD mode) to force full redraw
Current mode shown in status bar: [S][T] (Sixel tiled), [S][M] (Sixel monolithic), [S] (Kitty)
How It Works:
Sixel Tiled Rendering:
Tiles dynamically sized based on terminal resolution (~30-40 tiles per screen)
CEF dirty rectangles indicate changed regions
Only tiles intersecting dirty regions are redrawn
Tiles aligned to terminal cell boundaries for artifact-free rendering
Kitty Monolithic Rendering:
Entire screen encoded as RGBA and transmitted via base64
Double buffering (alternating image IDs) prevents flicker
Uncompressed for optimal typing performance
Images placed below text layer (z=-1) so dialogs appear on top
Zoom Control#
Brow6el provides intelligent zoom control with three modes and per-site customization.
Keyboard Controls (STANDARD mode):
- or = - Zoom in
- or _ - Zoom out
0 - Reset zoom to 1.0x
Zoom Modes:
Auto Mode (default_zoom_behavior=auto):
Automatically calculates optimal zoom based on:
Terminal cell size (DPI adaptation) - 60% weight
Window resolution - 40% weight
Terminal cell size (DPI adaptation) - 60% weight
Window resolution - 40% weight
Larger windows get bigger text, smaller windows get compact text
Adapts to high-DPI displays and large fonts
Recalculates on window resize
Range: 0.5x to 3.0x
Fixed Mode (default_zoom_behavior=fixed):
Uses zoom level from zoom_level setting
Consistent zoom across all pages
Ideal for high-DPI displays that need constant scaling
None Mode (default_zoom_behavior=none):
Starts at 1.0x zoom
Manual control only via keyboard shortcuts
No automatic adjustments
Per-Site Zoom:
Create ~/.brow6el/zoom.conf for site-specific zoom levels that override auto/fixed modes:
Site-specific zoom works with subdomains (e.g., github.com matches www.github.com).
Configuration (~/.brow6el/browser.conf):
Auto Zoom Formula:
Reference: 1600x900 resolution, 10x20 pixel cells
Cell zoom = (cell_height/20 × 0.7) + (cell_width/10 × 0.3)
Resolution zoom = (window_height/900 × 0.5) + (window_width/1600 × 0.5)
Final zoom = (cell_zoom × 0.6) + (resolution_zoom × 0.4)
This ensures text is readable on both high-DPI laptops and large desktop monitors.
JavaScript Console#
Press c (in STANDARD mode) to open/close the console
Type JavaScript and press Enter to execute
Scroll through output with ↑/↓
All console.log/warn/error messages are captured
CEF Configuration#
Brow6el uses a configuration file for Chromium command-line flags. On first run, a default configuration is created at ~/.brow6el/cef_flags.conf.
Features:
Enable/disable WebGL support
Configure rendering options
Adjust logging verbosity
Set custom user agent
And more!
Edit the config:
Changes take effect on next browser start. See the config file for available options and documentation links.
Privacy & Data#
What persists:
Bookmarks (~/.brow6el/bookmarks)
User scripts (~/.brow6el/userscripts/)
User script config (~/.brow6el/userscripts.conf)
CEF flags config (~/.brow6el/cef_flags.conf)
What doesn't persist (default temporary mode, persists in persistent mode):
Cookies (cleared on exit)
localStorage (cleared on exit)
Cache (cleared on exit)
History (not stored)
Each browser instance uses an isolated cache directory /tmp/brow6el_<PID> that is automatically deleted when you close the browser.
Multiple Instances#
You can run multiple browser instances simultaneously:
Requirements#
Graphics-capable terminal: Terminal emulator supporting Sixel or Kitty graphics protocols:
Sixel (recommended): mlterm, xterm, foot, wezterm, yaft, etc.
Kitty: kitty, ghostty, wezterm, etc.
The browser automatically detects graphics support - no manual configuration needed. If both protocols are supported, Sixel is preferred by default.
Build Dependencies:
Runtime Dependencies (automatically satisfied on most systems):
libsixel, X11 libraries, NSS/NSPR (SSL), GLib, D-Bus, ALSA, Pango, Cairo
How It Works#
CEF renders web pages offscreen → Graphics conversion (Sixel or Kitty protocol) → Output to terminal
Sixel pipeline: CEF BGRA buffer → libsixel conversion → Sixel escape sequences
Kitty pipeline: CEF BGRA buffer → RGBA conversion → base64 encoding → Kitty escape sequences
The browser continuously renders at 30 FPS, with synchronized input handling for mouse and keyboard events.
Distributions packages (community)#
Artix Linux, in the Omniverse repository : https://wiki.artixlinux.org/Main/Repositories#Omniverse
https://wiki.artixlinux.org/Main/Repositories#Omniverse
Arch Linux, in the Arch User Repository (AUR) : https://aur.archlinux.org/packages/brow6el-git
https://aur.archlinux.org/packages/brow6el-git
Debian, in Vejeta's unofficial repository (includes brow6el and latest libcef releases) : https://debian.vejeta.com
License#
MIT
Uses CEF (BSD clause 3 exception) and libsixel (MIT). See respective licenses for details.