A native, text-first web browser for the terminal.
Puma renders web documents as readable terminal text. No JavaScript, no Electron, no Chromium. One native binary on Linux, macOS, and Windows.
HTML → Semantic document → Text layout → Terminal or MCP
Puma reads and navigates the web from the command line. It fetches a page over HTTP or HTTPS, parses the HTML into a semantic document model, lays it out as text, and renders it in a scrollable terminal viewport. The same core serves a built-in MCP server, so agents can read the web without a browser engine.
browser_open,
browser_read, browser_list_links) over stdio. Web content is always tagged
untrusted, and web pages can never invoke MCP tools.Active development. puma <url> fetches one HTTP or HTTPS page, parses it into a full
semantic document tree with a real CSS cascade, and renders it as scrollable terminal
text. The browser persists history with URL autocomplete, enforces a first-party and
third-party cookie policy, and exposes a full-screen settings panel. The
roadmap lists what is still ahead.
$ puma example.com # fetch, render, and scroll the page; Esc Esc quits
$ puma # terminal mode (default): opens a blank page; Esc Esc quits
$ puma mcp # MCP stdio server
<hr>, and
<q> citation links with hover-previewable cite targets. <script> content is
suppressed and counted, never executed./history.allow/session/ask/reject policy (default reject), a session jar, and
/cookies inspection with persisted per-site exceptions.User-Agent, Accept-Language, DNT, Sec-GPC) built from the app
version and detected OS/arch/locale./settings (alias /config) is a full-screen view over a real
SQLite-backed config store: toggles and radios apply instantly, text inputs auto-save
after a short idle./open, /search, /reload, /back, /history, /cookies, /settings, and
/help. /search runs a no-JavaScript web search.Esc Esc quits and Ctrl+C exits immediately.A blank page (puma with no URL) and an error page (a load that fails) both open in the
same viewport and quit the same way.
None of these are implemented yet. They describe where the project is headed.
<dialog> element support. Scriptless dialogs rendered as a non-modal
auto-popover.Puma requires Rust stable.
git clone https://github.com/meerita/puma-browser
cd puma-browser
make build
The release binary is written to target/release/puma. Run puma example.com to fetch
and render a page, or puma for a blank page. Esc Esc quits.
make is not required on Windows. Every make target wraps a single cargo command,
so call cargo directly:
cargo build --release
Cargo writes the binary to target/release/puma.exe. Two native dependencies matter:
rusqlite uses the bundled feature, which compiles SQLite
from C through the cc crate. Install the "Desktop development with C++" workload (or
the standalone Visual Studio Build Tools) so cl.exe is available to cc.reqwest uses rustls with default-features = false, so OpenSSL and perl
are not needed.The full release build succeeds on Windows 11 with Rust 1.97.1
(x86_64-pc-windows-msvc) and Visual Studio 2022 Build Tools, with no extra setup.
make fmt # Fix formatting
make fmt-check # Check formatting
make lint # Clippy (strict, -D warnings)
make check # Compile check
make test # Run tests
Without make, run the equivalent cargo commands:
cargo fmt --all # fmt
cargo fmt --all -- --check # fmt-check
cargo clippy --all-targets --all-features -- -D warnings # lint
cargo check --all-targets --all-features # check
cargo test --all # test
See docs/process/README.md for the full development workflow.
Contributions are welcome. Read CONTRIBUTING.md for the branch model, commit style, quality gates, and how to open a pull request. All participants are expected to follow the Code of Conduct.
Puma is released under the MIT License.
49 commits
Rust
99.9%
A native, text-first web browser for the terminal.
Puma renders web documents as readable terminal text. No JavaScript, no Electron, no Chromium. One native binary on Linux, macOS, and Windows.
HTML → Semantic document → Text layout → Terminal or MCP
Puma reads and navigates the web from the command line. It fetches a page over HTTP or HTTPS, parses the HTML into a semantic document model, lays it out as text, and renders it in a scrollable terminal viewport. The same core serves a built-in MCP server, so agents can read the web without a browser engine.
browser_open,
browser_read, browser_list_links) over stdio. Web content is always tagged
untrusted, and web pages can never invoke MCP tools.Active development. puma <url> fetches one HTTP or HTTPS page, parses it into a full
semantic document tree with a real CSS cascade, and renders it as scrollable terminal
text. The browser persists history with URL autocomplete, enforces a first-party and
third-party cookie policy, and exposes a full-screen settings panel. The
roadmap lists what is still ahead.
$ puma example.com # fetch, render, and scroll the page; Esc Esc quits
$ puma # terminal mode (default): opens a blank page; Esc Esc quits
$ puma mcp # MCP stdio server
<hr>, and
<q> citation links with hover-previewable cite targets. <script> content is
suppressed and counted, never executed./history.allow/session/ask/reject policy (default reject), a session jar, and
/cookies inspection with persisted per-site exceptions.User-Agent, Accept-Language, DNT, Sec-GPC) built from the app
version and detected OS/arch/locale./settings (alias /config) is a full-screen view over a real
SQLite-backed config store: toggles and radios apply instantly, text inputs auto-save
after a short idle./open, /search, /reload, /back, /history, /cookies, /settings, and
/help. /search runs a no-JavaScript web search.Esc Esc quits and Ctrl+C exits immediately.A blank page (puma with no URL) and an error page (a load that fails) both open in the
same viewport and quit the same way.
None of these are implemented yet. They describe where the project is headed.
<dialog> element support. Scriptless dialogs rendered as a non-modal
auto-popover.Puma requires Rust stable.
git clone https://github.com/meerita/puma-browser
cd puma-browser
make build
The release binary is written to target/release/puma. Run puma example.com to fetch
and render a page, or puma for a blank page. Esc Esc quits.
make is not required on Windows. Every make target wraps a single cargo command,
so call cargo directly:
cargo build --release
Cargo writes the binary to target/release/puma.exe. Two native dependencies matter:
rusqlite uses the bundled feature, which compiles SQLite
from C through the cc crate. Install the "Desktop development with C++" workload (or
the standalone Visual Studio Build Tools) so cl.exe is available to cc.reqwest uses rustls with default-features = false, so OpenSSL and perl
are not needed.The full release build succeeds on Windows 11 with Rust 1.97.1
(x86_64-pc-windows-msvc) and Visual Studio 2022 Build Tools, with no extra setup.
make fmt # Fix formatting
make fmt-check # Check formatting
make lint # Clippy (strict, -D warnings)
make check # Compile check
make test # Run tests
Without make, run the equivalent cargo commands:
cargo fmt --all # fmt
cargo fmt --all -- --check # fmt-check
cargo clippy --all-targets --all-features -- -D warnings # lint
cargo check --all-targets --all-features # check
cargo test --all # test
See docs/process/README.md for the full development workflow.
Contributions are welcome. Read CONTRIBUTING.md for the branch model, commit style, quality gates, and how to open a pull request. All participants are expected to follow the Code of Conduct.
Puma is released under the MIT License.
49 commits
Rust
99.9%