MIT Rust + CEF Wayland on Linux

Vim-inspired
browser.

Native, GPU-accelerated. Rust on top of Chromium — no Electron-shaped layer above it.

Rendering sits behind a BrowserEngine trait with per-domain engine rules, so the web engine is a swappable detail rather than the architecture.

buffr
* Hacker News github.com/kryptic-sh/buffr MDN — KeyboardEvent

Hacker News

Modal browsing, hint-mode for links, ex-style command palette.

HINT https://news.ycombinator.com/ 4 matches* upd100%

why

A browser shaped like vim, not chrome.

01 — INPUT

Modal browsing

Normal/insert/visual modes. Real motions, real text objects, real ex commands.

02 — LINKS

Hint mode

Press f, every link gets a label. Type the label, you're there. No mouse needed.

03 — ENGINE

The engine is behind a trait

buffr-engine defines the BrowserEngine trait and buffr-cef wraps Chromium Embedded Framework — the backend every release ships, and the only one [engines] accepts today. buffr-webkit is an experimental WPE WebKit backend behind the same trait (Wayland subsurface compositing, DMA-BUF bridging), excluded from the workspace and off CI because it needs wpewebkit-2.0 system deps. Per-domain rules in config already route tabs to a named engine instance.

04 — GPU

GPU-accelerated

Compositing on the GPU. Smooth scroll, fast paint, low-latency input. Async render thread keeps Wayland resize backpressure honest.

05 — ISOLATION

Per-engine on-disk layout

Each engine instance gets its own ~/.local/share/buffr/engines/<id>/ — distinct cookies, cache, IndexedDB. Profile and cache share that root deliberately: XDG says ~/.cache may be lost without warning, and CEF only honours a per-context cache path that sits under one common root. Same layout on macOS and Windows — no %APPDATA% special case.

06 — PARITY

Permissions · downloads · find · IME · PiP

Geolocation / notification / mic / camera prompts, downloads with progress, / find-in-page, context-menu hit-test, IME composition, and HTMLVideoElement.requestPictureInPicture — all driven through the engine trait, so a second backend inherits the same status-line UX instead of reimplementing it.

07 — INTERACTION

Mouse + keyboard

Both, always. Power users get keys. Everyone else gets mice. Neither is second-class.

08 — PRIVACY

Zero telemetry

No analytics, no telemetry endpoint — the usage counters are opt-in, off by default, and only ever write a local JSON file. The daily update check against GitHub releases is the only network request buffr makes on its own, and updates.enabled = false turns it off. --private mode runs the stores in memory and tears down all engine profiles into a per-pid temp tree on exit.

09 — STATE

Your history is a database

History, bookmarks, downloads, per-origin permissions and per-domain zoom each persist to their own SQLite file under ~/.local/share/buffr/ — frecency-ranked history search, bookmark tags with Netscape HTML import, WAL mode, forward-only schema migrations. Every store has a --list-* CLI flag, so the data is yours without opening the browser.

install

Prebuilt binaries on every tagged release.

Linux (x86_64, aarch64) — .deb / .rpm / .tar.gz / Flatpak / Snap / AUR. macOS (Apple Silicon) — .dmg. Windows (x64, arm64) — .msi. SHA-256 sidecars on every artifact. Linux needs a Wayland session — X11 is not supported, and buffr exits with a clear error when XDG_SESSION_TYPE isn't wayland. cargo install buffr is not a supported path: the crates.io crate is a stub, because CEF needs a ~150 MB runtime payload cargo can't bundle. Intel Macs build from source — they were cut from the release pipeline in 0.1.14, not from the code.

buffr — Arch Linux (AUR)
$ yay -S buffr-bin
$ paru -S buffr-bin
buffr — macOS (Homebrew)
$ brew install --cask kryptic-sh/tap/buffr
buffr — from source
$ git clone https://github.com/kryptic-sh/buffr
$ cd buffr
$ cargo xtask fetch-cef    # vendor CEF runtime (~500 MB extracted)
$ cargo build --release