Surfing the web really fast.
A keyboard-driven browser with vim-like bindings, built on Chromium and Rust.
Documentation · Install · Releases · Roadmap
Riptide is built on CEF through the cef crate, with everything else in Rust.
Note
Status: early. It's usable day to day, but expect rough edges; the roadmap tracks what's done and what's missing.
| Platform | Packages | Tested |
|---|---|---|
| Linux x86_64, X11 | .deb, AppImage, .tar.gz, AUR (riptide-browser, riptide-browser-bin), Nix flake |
The main platform, used day to day. Each release's .deb, AppImage and .tar.gz pass the full smoke test, and the AUR source package is built before it's published. |
| Linux, Wayland | The Linux packages | Untested |
| macOS, Apple silicon | .dmg, Homebrew cask |
Supported, used day to day. Each release is tried by hand. CI opens a window, and checks each release .dmg's signature. |
| macOS, Intel | .dmg, Homebrew cask |
Untested by hand. CI checks each release .dmg's signature and runs --version; it doesn't open a window. |
| Windows x86_64 | Installer (-setup.exe), .zip |
Untested by hand. CI opens a window, and each release's installer is installed, started with --version and uninstalled. |
See Installing for each package.
![]() |
![]() |
![]() |
| Command line with completion | Splits (sv, ss) |
The :settings page |
-
Keyboard first: normal, insert, command, hint, caret and passthrough modes, with vim-like bindings. Also counts, marks, macros,
/search,:navigate, and a command line with history and completion. -
Tabs and windows: pinned tabs, a tab bar that works with the mouse, favicons,
:tab-select, moving tabs between windows, private windows, splits that show several tabs side by side (sv,ss,<Ctrl-h/j/k/l>), and windows that remember their size and place. -
Video calls: Google Meet, Teams, Zoom, Webex, Jitsi and Whereby open in their own call windows, where screen sharing lets you pick a tab, a window or the whole screen.
cmmutes your microphone in the call from any tab or window,:media-devicespicks each site's camera, microphone and speaker (switching them mid-call),:share-stopends a share from anywhere, tabs using the camera, microphone or screen are marked, andgpfloats the call's video over your other tabs. -
Hints: for links, inputs, images, yanking and downloads, including number hints, iframes from any site and shadow DOM.
-
Privacy: ad and tracker blocking with EasyList, EasyPrivacy and uBlock Origin's own lists, including its scriptlets (which strip YouTube's video ads), stand-ins for blocked files, tracking parameters taken off links, and element hiding with
:has-text()and the like, in frames too, plus your own rules, which an element picker writes for you. Also: Google background calls turned off, the Chromium sandbox where Linux allows it, and per-site permissions and certificate decisions. -
Extensions: Chrome (Manifest V3) extensions from the Web Store, such as uBlock Origin Lite, with their popups floating over the page and updates in the background.
-
Lua plugins: sandboxed plugins you add from git on the
:pluginspage, pinned in a lockfile, and loaded only once you approve the permissions they ask for. A plugin can:- add commands with completion, key bindings, and hooks on events such as pages loading, tabs opening or the mode changing;
- draw status bar widgets, boxes floating over the page, panels docked beside it, and HTML pages of its own;
- ask you to pick from a list or type an answer, hint elements on the page and act on the one you pick, and fill in logins;
- keep data between runs, run timers, and, with your permission, run programs, read files or reach given hosts.
Its options sit in
:settings, and its secrets in the OS keyring. riptide-plugins has ready-made ones, such as filling logins from pass, Bitwarden or KeePassXC. See Plugins for using and writing them, and the Lua API. -
Configuration:
config.toml, orconfig.luawith full scripting (functions on keys, custom commands, event hooks, timers). A:settingspage to change settings, keys, site data, plugins and extensions; live:set; per-site settings; config files that reload when you save them; and a generated:helppage. -
Scripts and data: userscripts, Greasemonkey scripts,
:open-editor, quickmarks and bookmarks in plain text files, and history imported from qutebrowser (:history-import). -
Page tools: zoom (
+-=), DevTools (wi), print or save as PDF, fullscreen, picture-in-picture (gp), view source (gf),:jseval, tab muting,:messages, and.to repeat the last command. -
Everything else: sessions with crash recovery (
:recoverpicks which tabs to reopen), history and downloads pages, desktop notifications, spell checking with keyboard-driven fixes and:spell-installfor dictionaries, dark mode, opt-in Widevine, and handing commands to a running browser from the terminal (riptide ':open -t x').
Each release has x86_64 packages for Linux, macOS and Windows, and Apple silicon ones for macOS, with SHA256SUMS and build provenance:
| On | Get |
|---|---|
| Ubuntu 24.04+, Debian 13+ | the .deb: sudo apt install ./riptide_*_amd64.deb |
| Any distribution | the .AppImage (chmod +x it and run it), or the .tar.gz (unpack it and run riptide) |
| Nix | nix run github:joshzcold/riptide, or github:joshzcold/riptide#riptide-source to build it from source |
| Arch Linux | yay -S riptide-browser-bin from the AUR, or riptide-browser to build it from source |
| macOS | brew install --cask joshzcold/riptide/riptide, or the .dmg for your Mac (aarch64 for Apple silicon, x86_64 for Intel) |
| Windows (experimental) | the -setup.exe installer, or the .zip (unpack it and run riptide.exe) |
The nightly pre-release is rebuilt from main every night it changes. Installing covers the Linux sandbox setup and opening the unnotarized macOS app.
https://joshzcold.github.io/riptide/, built from docs/book/:
- Installing, including the Linux sandbox setup
- Keys and modes and configuration
- Reference: commands, key bindings, settings, Lua API
- Developer guide
In the browser, F1 or :help shows every command, setting and binding with your own config applied. The roadmap is in docs/PLAN.md.
Requirements: Rust 1.88+ (edition 2024).
./task setup # once: download CEF (~1.5 GB) into $CEF_PATH, default ~/.local/share/cef
./task run # build and launch; or: ./task run -- example.com
./task check # lint, unit, e2e and smoke tests (needs Xvfb and xdotool)
./task docs-serve # preview the documentation at http://localhost:3000./task downloads a pinned, checksum-verified Task if you don't have it. Building covers the rest, including building without Task.
Commits follow Conventional Commits, and changes that users or contributors would notice update the documentation in the same commit. See Contributing and Writing documentation. AI agents start at AGENTS.md.
Riptide owes its design to qutebrowser by Florian Bruhin and its contributors. The modes, key bindings, command and setting names, hint labels, quickmark and bookmark files, userscripts and Greasemonkey support all follow qutebrowser, and qutebrowser's documentation was the reference for how they should behave. Riptide is an independent project, written from scratch in Rust on Chromium, and isn't affiliated with qutebrowser.
GPL-3.0-or-later. See LICENSE, with an additional permission under section 7 for loading a content decryption module such as Widevine at run time (LICENSE-EXCEPTION).


