Skip to content
joshzcoldPublic

About

Modern browser with vim-like bindings using rust and CEF

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Repository files navigation

Riptide logo

Riptide

Surfing the web really fast.
A keyboard-driven browser with vim-like bindings, built on Chromium and Rust.

Build Release Nightly Docs Security audit License

Documentation · Install · Releases · Roadmap



Riptide in hint mode on a Wikipedia article, with a two-letter label on every link and the tab bar above

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.

The command line with completion listing the :tab commands and what each does Two tabs side by side in a vertical split The settings page with its categories, search box and editable settings
Command line with completion Splits (sv, ss) The :settings page

Features

  • 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. cm mutes your microphone in the call from any tab or window, :media-devices picks each site's camera, microphone and speaker (switching them mid-call), :share-stop ends a share from anywhere, tabs using the camera, microphone or screen are marked, and gp floats 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 :plugins page, 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, or config.lua with full scripting (functions on keys, custom commands, event hooks, timers). A :settings page 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 :help page.

  • 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 (:recover picks which tabs to reopen), history and downloads pages, desktop notifications, spell checking with keyboard-driven fixes and :spell-install for dictionaries, dark mode, opt-in Widevine, and handing commands to a running browser from the terminal (riptide ':open -t x').

Install

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.

Documentation

https://joshzcold.github.io/riptide/, built from docs/book/:

In the browser, F1 or :help shows every command, setting and binding with your own config applied. The roadmap is in docs/PLAN.md.

Quick start

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.

Contributing

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.

Acknowledgements

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.

License

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).

About

Modern browser with vim-like bindings using rust and CEF

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages