Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Chapter 8: The Upstream Reality

By now GPUI feels productive. Things compile. The entity model clicks. The async patterns make sense. This chapter steps back from the framework itself and answers a question worth asking before you build anything serious: what kind of tool is this, and what are you actually betting on?

Not to scare you off. To give you a map.


Where GPUI Came From

GPUI was not designed as a general-purpose UI framework. It was extracted from Zed, the high-performance code editor, and that origin explains almost everything about its design.

The history matters in brief. Zed’s earliest prototype was an Electron app with a Rust backend passing JSON messages back and forth. The first version of GPUI was essentially a layer to feed data to that Electron shell. Over several iterations — a Pathfinder renderer, a Flutter-inspired constraint system, a split between Rust code and JSON themes — the team kept finding UI development painful. The framework was accumulating complexity without gaining clarity.

In late 2023, the Zed team made a clean break. They froze the old framework, built GPUI 2 in parallel over roughly four months, and shipped it as the foundation for Zed’s collaboration features. Only after it stabilized did they open source it.

That sequencing is significant. GPUI was opened after it solved Zed’s problems, not before. It is not a community-first framework that happens to power an editor. It is an editor framework that happens to be open.


The Editor-First Constraint

Zed is a business. The team’s primary responsibility is improving the editor. Features that benefit Zed get prioritized. Features that don’t will wait — or never arrive. This is not hostility toward the community. It’s focus.

The practical consequence: if you’re building something that looks like Zed — a code editor, an IDE, a terminal, a data tool, a dashboard — you’re aligned with upstream’s priorities. The framework was designed for exactly your use case. If you’re building a creative tool with custom shaders, a 3D application, or something with heavy animations and visual effects, you’re working against the grain. GPUI will not grow in your direction quickly, if at all.

The practical rule: build with upstream GPUI until you hit a hard wall. Then decide whether to work around the gap, use a community fork, or choose a different framework. Don’t make that decision in advance — the gaps are fewer than they appear from the outside.


What GPUI Does Well

You’ve already used most of this. Here it is gathered in one place:

AreaStatus
LayoutProduction-ready. Flexbox, full style API, absolute positioning.
TextRope buffers, UTF-8 alignment, IME wiring.
Asynccx.spawn(), RAII cancellation, WeakEntity. Solid.
StateEntity model, cx.notify(), subscriptions.
PerformanceGPU-accelerated, 120fps capable, no layout thrashing.
Focus and ActionsKeyboard routing, bubble-and-handle, action system.
Custom ElementsElement trait, three-phase lifecycle, full GPU access.

For roughly eighty percent of what a native desktop app needs — windows, lists, forms, async data loading, keyboard-driven interfaces — GPUI is production-ready today.


What GPUI Doesn’t Have

These gaps are confirmed by the framework’s GitHub issues and the community’s own analysis. They’re stated plainly here because you’re better off knowing them now than discovering them mid-project.

GapWorkaroundWhen It Hurts
Custom shaders / GPU computeraw_window_handle + manual wgpu contextGames, data viz, video, creative tools
Transforms on generic elementsAbsolute positioning + nested views, or pre-render to imageComplex animations, drag gestures
Radial / conic gradientsPre-render to image, use as backgroundDecorative surfaces, animated gradients
Headless testingCLI harness pattern (Chapter 12) + snapshot testingVisual regression, CI without GPU
Rich text editing out of the boxWire rope, selection, IME yourself (Chapter 11)Serious text inputs

The honest framing: these gaps exist. For some apps they’re dealbreakers. For most they’re inconveniences with straightforward workarounds. The question isn’t whether GPUI has a feature — it’s whether you can live without it or build around it.


The Fork Landscape in Brief

If a gap is a dealbreaker, you’re not stuck. The community has produced several active forks that fill specific holes. Chapter 9 covers each in depth. Here’s the decision tree to hold in your head now:

Is your app Zed-shaped (text, data, tooling)?
├── Yes → Upstream GPUI
│
├── Need custom shaders or 3D? → Kael
│
├── Need wgpu backend + smooth scrolling? → WGPUI
│
└── Need stable versioned releases? → gpui-unofficial

Using a fork doesn’t mean abandoning upstream. Most forks rebase regularly on upstream GPUI, so you continue receiving fixes. The choice is about picking the branch that matches your constraints.


Three Questions Before You Commit

Does your app’s core value rely on a missing feature? If you’re building a 3D model viewer or a video editor, GPUI is the wrong tool. If you’re building a CRUD app, a chat client, a dashboard, or an internal tool, you’re in good shape.

Can you live with the workarounds for the near term? The gaps are real but not growing. The community is slowly filling them through forks. If your timeline is short and your app is Zed-shaped, upstream is fine today.

Are you building for the long term? If yes, expect to either contribute upstream, maintain a small fork with the features you need, or migrate to whichever community fork consolidates. The pure core pattern from Chapter 12 makes migration possible without rewriting your business logic. Put your domain logic in a crate with no GPUI dependencies, and you can swap the UI layer later.


The Final Advice

Don’t bet on GPUI. Bet on your domain logic being pure Rust. GPUI is the delivery mechanism, not the product.

That’s not pessimism — it’s good architectural hygiene regardless of which framework you choose. Build your business logic in a framework-agnostic crate, use GPUI to deliver it, and the specific state of the ecosystem matters less than it might seem.

The next chapter maps the fork landscape in detail — what each fork solves, who’s building it, and how to choose between them.


For a deeper dive into GPUI’s origins — the GPUI 1 to GPUI 2 rewrite, the frozen-crate strategy, and the open-source timing decision — see Appendix A.