Zervo is an experiment. It isn't ready for use: Zzz works in a browser, and Zervo renders it with known gaps. The question it answers is whether Servo can host Zzz well enough to replace the browser tab.
Zervo is part of the Fuz stack (fuz.dev, @fuzdev).
AI disclosure: this codebase is LLM-generated with uneven human review.
Zzz runs as a local daemon serving a web app over loopback. Zervo is a separate program that opens a Wayland window with winit, embeds Servo in it, and loads that app. It forwards keyboard, mouse, wheel, and touch input to the page, and sleeps until a window event or the engine wakes it.
- A separate process. Zervo never embeds the daemon, so a crash in the engine can't take down the daemon and the terminals it holds.
- Servo only. There's no seam for another engine.
- Linux on Wayland is the only target.
Against Zzz's production build, Zervo hydrates the app, holds its WebSocket,
and runs a terminal. It can't log in without a workaround, because Servo
drops Secure cookies on http://localhost. The terminal drops spaces and
some other characters, page text can't be selected, and context menus,
<select> popups, dialogs, and IME aren't wired.
docs/compat.md lists every known gap with its cause and owner, and how to recheck it.
Servo compiles from source and needs a large native toolchain (Debian
packages). Zap installs it from zap.ts:
zap apply # preview what would be installed
zap apply --wetrun # install itThen build:
cargo build -p zervo --lockedrustup installs the Rust toolchain pinned in rust-toolchain.toml. The first
build compiles all of Servo and takes a long time; later builds are
incremental.
./target/debug/zervo # a built-in stub page
./target/debug/zervo http://localhost:4460/ # a running zzz daemon
ZERVO_URL=http://localhost:4460/ ./target/debug/zervoThe URL comes from the final argument, then ZERVO_URL, then the stub page.
A bad URL exits with status 2 before any window opens. The zzz CLI can launch
Zervo instead of the browser: set its opener (in ~/.zzz/config.json, or
ZZZ_OPENER) to the path of the zervo binary, and zzz passes the URL as the
final argument.
RUST_LOG=zervo=debug logs the event loop's activity on stderr.
RUST_LOG=zervo=trace also logs every forwarded input event, including typed
passwords.
crates/zervo/ the binary: winit window, Servo embedding, input mapping
docs/compat.md known gaps, the Servo pin-bump procedure, a walk-through
scripts/ the compat audit harness
zap.ts Servo's build toolchain
Report vulnerabilities through the fuzdev security policy.