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.
why
A browser shaped like vim, not chrome.
Modal browsing
Normal/insert/visual modes. Real motions, real text objects, real ex commands.
Hint mode
Press f, every link gets a label. Type the label, you're there. No mouse needed.
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.
GPU-accelerated
Compositing on the GPU. Smooth scroll, fast paint, low-latency input. Async render thread keeps Wayland resize backpressure honest.
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.
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.
Mouse + keyboard
Both, always. Power users get keys. Everyone else gets mice. Neither is second-class.
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.
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.
$ yay -S buffr-bin $ paru -S buffr-bin
$ brew install --cask kryptic-sh/tap/buffr
$ git clone https://github.com/kryptic-sh/buffr $ cd buffr $ cargo xtask fetch-cef # vendor CEF runtime (~500 MB extracted) $ cargo build --release