The Problem
Terminal users have long been stuck with text-only browsers like lynx or clunky framebuffer hacks like browsh. Neither handles modern web standards. lynx cannot run JavaScript, and browsh requires a Firefox instance and burns ~50x more CPU by downscaling a full framebuffer. Carbonyl solves this by embedding a real Chromium engine that renders natively to the terminal resolution.
What This Does
Carbonyl is a Chromium-based browser that renders directly into a terminal. The architecture is split into two parts: a Rust "core" (src/lib.rs, src/browser/, src/output/) compiled into libcarbonyl, and a patched Chromium "runtime" that dynamically loads that library. The chromium/patches/ directory contains 16 patches that modify Chromium, Skia, and WebRTC to bridge rendering into the terminal.
The Rust core handles terminal I/O (src/input/), rendering (src/output/), and UI state (src/ui/). It uses a custom renderer (src/output/renderer.rs) with a KD-tree quantizer (src/output/kdtree.rs) to map Chromium's framebuffer to terminal cells. The src/browser/ directory contains the C++ bridge code that connects Blink to the Rust library.
How To Use It
The README documents three installation paths:
Docker
$ docker run --rm -ti fathyb/carbonyl https://youtube.com
npm $ npm install --global carbonyl $ carbonyl https://github.com
Binaries
Download from GitHub releases for macOS/Linux (amd64/arm64)
For development, the core Rust code builds with cargo build (per Cargo.toml). The full Chromium runtime requires scripts/build.sh and takes over an hour. Configuration is minimal — there are no environment variables or config files. The CLI entry point is src/cli.rs, which takes a URL as its argument. The Dockerfile provides a reproducible build path.
Real-World Use
Carbonyl fits scenarios where a graphical browser is unavailable or undesirable: SSH sessions to headless servers, safe-mode console recovery, or CI environments that need to verify web pages render. It supports WebGL, WebGPU, audio/video, and animations, so it can run full web apps. A practical example: an operator SSHes into a remote server and runs carbonyl https://grafana.local/d/... to check a dashboard without X forwarding or a VNC tunnel.
Code Health & Issues
High — No test files detected — the entire Rust core (src/) has zero tests. Given the complexity of the rendering pipeline (src/output/quantizer.rs, src/output/kdtree.rs), this is a significant risk. Medium — No CI/CD pipeline — .github/ contains only funding.yml. No automated build or test gate exists, which is concerning for a project with a multi-hour Chromium build. Medium — Heavy patching of Chromium — 16 patches across chromium/patches/ modify core rendering and text layout. These will break or need significant rework on every Chromium update. Low — package.json present but unclear role — likely for the npm distribution wrapper (scripts/npm-package.mjs), but the dependency surface is undocumented. Low — No license file — license.md exists but the README doesn't state the license. This matters for commercial use.
The Bottom Line
Carbonyl is an impressive technical achievement — a full Chromium browser that runs at 60 FPS in a terminal with 0% idle CPU. The architecture is sound: the Rust core is modular and the patch set is organized. However, the lack of tests and CI, combined with the fragile Chromium patching strategy, makes it risky for production use. It's best suited for developers who need a modern browser in constrained environments and are willing to maintain the build themselves.