Edited by humans. Written by AI. How our editing works
All articles

wterm: A Smarter Web Terminal or Too Soon to Tell?

wterm renders terminal output as HTML instead of canvas, fixing xterm.js's oldest problem. Here's what that means for teams evaluating it today.

Bob Reynolds

Written by AI. Bob Reynolds

May 29, 20266 min read
Share:
Large bold "12 KB TERMINAL" text with yellow highlight pointing to a terminal window displaying code output and system…

Photo: AI. Kasper Winter

Xterm.js has been the default web terminal for over a decade. GitHub Codespaces uses it. Portainer uses it. VS Code uses it. When a technology achieves that kind of ubiquity, it stops being evaluated and starts being assumed — which is exactly when a credible alternative becomes interesting.

wterm, a web-based terminal emulator whose project page lists it at wterm.dev, is that alternative. Whether it's ready to act on is a different question.

The problem it's actually solving

To understand what wterm does differently, you have to understand what xterm.js does that has always been awkward. Xterm renders its output to an HTML canvas element. That means the terminal is, from the browser's perspective, a picture — not text. Every feature that browsers give you for free with real text has to be rebuilt from scratch on top of that canvas. Text selection. Find in page. Screen reader support. Copy-paste. Ten years in, xterm still hasn't fully solved these.

The Better Stack review puts it plainly: "xterm has a big problem — it renders to a canvas element. So doing something like selecting text or finding words in a page all have to be re-implemented from scratch, which doesn't always work that well."

wterm takes the opposite approach. It renders terminal output directly to the DOM as HTML. The browser then handles text selection, find, copy-paste, and screen readers natively — no reimplementation required. For anyone who has ever watched a screen reader user try to navigate a canvas-based terminal, that sentence carries real weight.

The engineering behind this matters too. wterm's core is written in Zig and compiles to a 12KB WebAssembly binary — a figure cited in wterm's own project materials. At that size, it's not parsing your escape sequences in JavaScript; it's doing the heavy lifting in Wasm while keeping the footprint small enough that it doesn't fight for bandwidth with the rest of your application. Critically, the Zig core only re-renders rows that have actually changed, rather than repainting the entire terminal on every frame. For something like htop — constantly updating partial rows — that efficiency matters.

What the Better Stack test actually tells us

The Better Stack reviewer built a working demo: wterm on a React frontend, a WebSocket server spawning a pseudo-terminal on a headless Ubuntu instance, keystrokes routed from browser to server and output routed back. The architecture is straightforward — the same one any team would use — and it worked. File navigation, vim, container listings, all functional.

But "functional" and "production-ready" are not the same shelf.

With the default Zig core, the reviewer found text selection problems: highlighted characters that became unreadable. The fix is the optional Ghostty-powered backend — a substantially larger WASM binary that swaps in libghostty, the same rendering engine behind the Ghostty native terminal. With Ghostty active, text selection worked correctly, color rendering improved, and tools like OpenCode rendered as intended.

The Ghostty backend also surfaced its own issues. The reviewer documented rendering glitches when switching between Neovim and other applications. There was also a build environment friction worth naming specifically: Bun, which is gaining real traction as a JavaScript runtime and bundler, wouldn't automatically copy the Ghostty WASM file from node_modules because Bun's asset handling only covers JS files by default. The reviewer had to import the WASM file manually to work around it.

That's not a footnote. A significant number of teams evaluating wterm today will be using Bun or will adopt it within the next 12 months. If setup requires manual WASM handling for Bun users, that's a documentation gap that becomes a support burden in production. It's the kind of friction that doesn't surface in a 6-minute demo but costs real hours during an integration sprint. Teams on Bun should budget for it; teams on Node will have a smoother path.

How ready is it, specifically

My read: wterm is 12 to 18 months from being the obvious choice for greenfield projects. Here's why that range, not six months.

The Zig core has a known text-selection defect that requires the Ghostty backend to resolve. The Ghostty backend has documented rendering edge cases in complex terminal applications. The Bun friction is unresolved at the toolchain level. None of these are fundamental problems with the architecture — the DOM rendering approach is sound, and the performance model is smart — but they're the kind of rough edges that get filed as "known issues" and take multiple release cycles to close.

If you're building a new cloud IDE, a browser-based SSH tool, or an infrastructure dashboard today, the DOM rendering advantage is real and immediate: accessibility compliance without a custom implementation, native browser search that actually works, screen reader support that doesn't require a workaround. Those are concrete wins you'd be leaving on the table by defaulting to xterm.js. For that use case, wterm is worth integrating now, with eyes open to the edge cases.

If you're maintaining an existing xterm.js integration, the calculus is different. You've already paid the accessibility debt in custom code, your team knows the xterm API, and the ecosystem around xterm — plugins, documentation, Stack Overflow answers — is deep. Migrating for the sake of migrating makes no sense until wterm's Ghostty backend stabilizes.

The xterm.js comparison deserves honesty

The Better Stack reviewer ends with something that reads like a concession but is actually the right framing: "Xterm.js does have a massive ecosystem and is the battle-tested solution, so you won't go wrong if you do end up choosing it."

That's correct. xterm.js isn't broken. It has a structural limitation — the canvas rendering model — that creates persistent friction around accessibility and native browser features. But it has also been running in production for years at a scale that wterm hasn't approached yet. The question isn't whether xterm.js has problems. It does. The question is whether those problems are expensive enough, in your specific context, to justify adopting a library that is still working out its own.

For accessibility-first applications, the answer skews toward wterm. For everything else, give it a year.

The DOM rendering idea isn't new — browsers have always been better at text than at canvas pixels — but wterm is the first project to build a serious terminal emulator on that principle rather than retrofitting accessibility onto a canvas approach after the fact. That distinction matters. It means wterm's accessibility isn't a layer; it's the architecture. When the rough edges are resolved, that will be harder to argue with than any benchmark.


By Bob Reynolds, Senior Technology Correspondent, BuzzRAG

From the BuzzRAG Team

We Watch Tech YouTube So You Don't Have To

Get the week's best tech insights, summarized and delivered to your inbox. No fluff, no spam.

Weekly digestNo spamUnsubscribe anytime

More Like This

A dark terminal window displays code and system processes with "Fresh Text Editor" and "Powerful, Simple, Awesome!"…

Fresh Text Editor Challenges Terminal Editing Status Quo

Fresh Text Editor brings modern IDE features to terminal environments. Policy implications for developer tools, accessibility, and open-source ecosystems.

Samira Barnes·4 months ago·5 min read
Narak logo with red strikethrough and yellow arrow pointing to green Z on purple background, with "GOODBYE" text at top

Zrok vs ngrok: Why Developers Are Switching Tunneling Tools

Developers are migrating to Zrok, an open-source tunneling alternative to ngrok. We examine the technical and policy implications of this shift.

Samira Barnes·3 months ago·7 min read
Cyan "JSX UPGRADED?" text with red arrow pointing to purple box labeled "TSRX" on black background

TSRX Wants to Replace JSX — But at What Cost?

TSRX is a new syntax layer that lets you write React components with plain if statements and no return. Here's what junior devs actually need to know.

Tyler Nakamura·2 months ago·8 min read
Man in glasses contemplating beside a compact NAS device with ZimaOS interface displayed on monitor behind him.

ZimaCube 2 Review: A Meaningful Upgrade or Incremental Refresh?

The ZimaCube 2 is a compact home server that earns attention for its processor upgrade—but a quiet software licensing twist deserves yours too.

Bob Reynolds·2 months ago·8 min read
A code editor interface labeled "Project Alpha" displays Python code with yellow cursor arrows highlighting the editor…

Zed Wants to Fix Code Editors' Two Biggest Problems

Zed code editor tackles lag on large codebases and solo-first design. But can a Rust-native editor really beat Cursor at its own game?

Mike Sullivan·5 months ago·6 min read
Yellow "80% GONE" text with arrow pointing to pixelated digital elements dissolving on dark background, illustrating code…

PostgREST Promises to Delete Backend Code. Should You?

PostgREST turns Postgres into a REST API with no backend code. Better Stack's demo shows it working in 60 seconds. The question is whether you should.

Bob Reynolds·3 months ago·5 min read
Desktop with Command Prompt and browser warning of unsafe site, overlaid with illustration of robotic face with glowing…

What Happens When AI Gets Root Access to Your Computer

A YouTuber gave an AI agent root access to his Linux system. The results reveal both the promise and the friction of our autonomous software future.

Bob Reynolds·3 months ago·5 min read
Man in glasses wearing black shirt against brown background with text "it's just a tool" overlaid

Linux Kernel Draws a Line on AI-Generated Code

After six months of debate, Linux kernel developers establish new rules for AI assistance: disclosure required, human accountability mandatory.

Bob Reynolds·3 months ago·6 min read

RAG·vector embedding

2026-05-29
1,468 tokens1536-dimmodel text-embedding-3-small

This article is indexed as a 1536-dimensional vector for semantic retrieval. Crawlers that parse structured data can use the embedded payload below.