You don’t need windows.
The graphical window paradigm — windows, mouse, dock, desktop — was invented to make computers accessible to normal people. It succeeded. Billions of people use computers now who never could have navigated a command line. But if you’re a power user, the GUI was always a step backward. It traded control for accessibility. Every time you reach for the mouse, you’re moving slower than you could with a keystroke. Every time you cmd+tab between windows, you’re losing context. The command line gives you maximum power over your computer. Piping, scripting, automation, composability — the terminal is where you have total control.
The only thing missing is pixels.
Terminals are text-based, and that’s their strength. Text is scriptable, pipeable, greppable. But the moment you need to look at an image, read a formatted document, preview a webpage, or interact with a SaaS app, you’re forced out of the terminal and into a lesser paradigm. You cmd+tab into a window manager that doesn’t understand your keybindings, doesn’t compose with your tools, and doesn’t let you pipe anything anywhere.
The gap isn’t power. The terminal already has all the power. The gap is graphics.
Consider a web developer using Neovim. With a modern distribution like LazyVim, you have tremendous text-editing and text-viewing abilities. You can navigate code at the speed of thought. You can run builds, tests, and servers in split panes. You can search, replace, refactor, and commit without ever touching a mouse. The experience is fast, composable, and entirely keyboard-driven.
Then you need to see your app. You cmd+tab to Chrome. You’re in a different world now — a world designed for people who click on things. Your keybindings don’t work. Your splits don’t exist. Your pipes don’t reach. You look at the page, cmd+tab back, make a change, cmd+tab again. Hundreds of times per day. The terminal gives you total control, and then the browser takes it away.
Here’s the thing: since GUIs were invented, web browsers have become the standard way to render graphical content on a computer. Think about what you actually use GUI windows for. Email — that’s a web app. Slack — web app. Figma — web app. Your local dev server — that’s a webpage. Documentation — rendered in a browser. Video — plays in a browser. Even desktop apps are increasingly Electron wrappers around a browser engine.
The graphics layer you need isn’t some custom terminal drawing protocol. It’s a web browser. A real one, with GPU acceleration, JavaScript execution, CSS rendering, and DevTools. The missing piece for the terminal isn’t “a graphics protocol” in the abstract. It’s specifically a web browser, because that’s where all graphical content lives now.
Imagine this: you’re in Neovim editing a React component. You save. In the pane next to your editor — inside the same terminal — your app live-reloads. You see the change immediately. No cmd+tab. No context switch. You press a key to focus the browser pane, scroll around, click a button to test an interaction, press Escape, and you’re back in your editor. Everything stays inside the terminal, the environment where you have maximum power.
Now extend that. Open Figma in a terminal pane to reference the design while you code. Open GitHub to review a PR. Open the docs for that API you’re integrating. Open your production dashboard to monitor a deploy. All in terminal panes, all controlled by keyboard, all composable with the rest of your terminal environment.
The terminal becomes your entire operating environment. Windows become optional. If it runs in a browser, it runs in your terminal. And almost everything runs in a browser now.
TermSurf embeds a full Chromium browser directly into terminal panes. Type
web google.com and it’s there — GPU-accelerated, 60 frames per second, real
DevTools, real JavaScript. Not a screenshot. Not a text-mode rendering. A real
browser with zero-copy GPU compositing, controlled from within the terminal.
The browser pane blocks like vim or less. When you’re done, press ctrl+c and
you’re back at your shell prompt. The browser is a first-class citizen of the
terminal’s pane hierarchy — you navigate between terminal and browser panes with
the same keybindings.
And because TermSurf treats the browser as a terminal tool, it behaves like one.
console.log() goes to stdout. console.error() goes to stderr. You can pipe
browser output to grep, jq, or any other command-line tool. Pages can call
window.termsurf.exit(0) to return an exit code, enabling browser-based tests
in CI pipelines. The browser becomes composable with everything else in the
terminal.
This is the missing piece. A power user with TermSurf never needs to leave the terminal. Web development, SaaS apps, documentation, media — it’s all accessible from the place where you have maximum control.
One terminal plus one browser engine is a cool hack. A protocol is an ecosystem.
TermSurf defines a standard communication layer — protobuf messages over Unix domain sockets — so that any terminal emulator can host any browser engine. The terminal and the browser are separate processes that speak a common language. This makes every component interchangeable.
Today, Ghostboard (a Ghostty fork written in Zig) is the terminal, and Roamium (a Rust wrapper around Chromium) is the browser engine. But the protocol doesn’t care which terminal or which engine you use. Wezboard (a WezTerm fork) is in development as a second terminal. WebKit, Gecko, and Ladybird are planned as additional browser engines. Any combination works.
Think of how LSP changed code editors. Before LSP, every editor needed its own language integration for every language. LSP defined a protocol, and suddenly any editor could use any language server. The result was an explosion of capability — editors got better, language servers got better, and users got to choose their preferred combination.
TermSurf is LSP for terminal graphics. The protocol decouples the terminal from the browser engine so that both can evolve independently. Terminal authors can focus on terminal features. Browser engine integrators can focus on rendering. Users pick their preferred terminal and their preferred engine. The protocol connects them.
This matters because the terminal ecosystem is fragmented. People are loyal to their terminals — Ghostty, WezTerm, Kitty, Alacritty, iTerm2. A single monolithic app that bundles one terminal with one browser engine would reach a fraction of the audience. A protocol reaches everyone. Any terminal can adopt it.
Once your terminal can open browser panes, the use cases are everything:
Web development — preview localhost alongside your editor, see live reloads without switching contexts, inspect elements with DevTools in a split pane.
SaaS apps — open Slack, GitHub, Figma, Notion, or any web app in a terminal pane. Stay in the terminal while using graphical tools.
Documentation — read MDN, API references, or rendered markdown without leaving your workflow.
Media — watch video tutorials, inspect image assets, preview designs. If it renders in a browser, it renders in your terminal.
Testing — run browser-based tests that pipe results to stdout. Integrate graphical testing into terminal-native CI workflows.
The power user’s workflow becomes complete. You don’t cmd+tab. You don’t reach for the mouse. You don’t leave the terminal. Every tool, graphical or not, lives inside the paradigm where you have maximum control.
The GUI window paradigm served its purpose. It made computers usable for everyone. But for power users, it was always a compromise — trading speed and control for visual accessibility.
The terminal already had all the power. It just couldn’t show you a webpage. TermSurf fixes that. A terminal with a browser protocol is a complete computing environment. You can do anything a GUI user can do, but faster, with more control, and without ever losing your place.
You don’t need windows. You never did. You just needed a browser in your terminal.
TermSurf is open source. Learn more at termsurf.com or check out the code on GitHub.