Build the features OpenCode needs, stabilize the core, then refactor and optimize.
Now
v0.1, v0.2, v0.3 — Exploring the problem space.
- [DONE] CLI render mode (split mode), with interactive TUI at the bottom and immutable scrollback log stream at the top.bf8f195
- [DONE] Rework color transport for RGBA+A and indexed metadata. Cache nearest-index translations so both TS and native paths skip repeated conversion. 95d36f3
- [DONE] Split the 3d/threejs core part into a separate package a10e71c
- Find what features OpenCode and terminal.shop need
- Replace
setStyledText with a native interface for incremental text updates (depends on MarkTree)
- Cross-platform clipboard with OSC52 and platform-specific fallbacks
- Make OpenTUI run on other runtimes like Node and Deno (debunification)
- Native streaming path for SSH connections
- Add virtual text for textarea autocompletion. TypeScript-only first, native via MarkTree later
- Hunk navigation for code review in OpenCode. Inline editing likely depends on MarkTree
- Timing-based scroll handling with inertia and speed, telling trackpad from mouse. Partial version exists
- Load external modules at runtime (in progress)
- OpenCode tests use OpenTUI test helpers. Fill gaps in OpenTUI's testing tools
- Kitty Graphics & Sixel support
Next
v0.x — Refactor the hell out of it.
- Neovim-style sticky marks (MarkTree/extmarks) for highlights, virtual text, and conceal. Marks move with edits so treesitter skips full re-highlighting
- Move markdown parsing and rendering to native code, compatible with MarkTree
- TextBufferView caches all virtual lines, even invisible ones. Constrain to the viewport
- Close the gap between OpenTUI's grapheme/width model, Unicode, and how terminals render complex text
- Kitty keyboard protocol follow-ups for repeat event shape, modified Tab encoding, KP_BEGIN naming, and other spec gaps
Later
v1.0 — Everything moves native.
- The renderable tree, layout engine (Yoga), and rendering move to native code. Native callbacks for
calculateLayout let you update renderables directly without a separate update pass
Ongoing
Work that spans every phase.
- Replace inconsistent TS benchmarks with a canonical setup. Go-style calibration, warmup, robust stats, and JSONL output for opentui-bench
- Yoga-via-wasm has large overhead. Build Yoga into the OpenTUI binary with manual bindings. Becomes obsolete when the renderable tree goes native
- Rope is overkill for read-only text. A simpler TextBuffer would reduce overhead. Deprioritized after mixed benchmarks (Feb 2026)
- Remove non-determinism from the frame pipeline with an injectable Clock abstraction (in progress)
Build the features OpenCode needs, stabilize the core, then refactor and optimize.
Now
v0.1, v0.2, v0.3 — Exploring the problem space.
setStyledTextwith a native interface for incremental text updates (depends on MarkTree)Next
v0.x — Refactor the hell out of it.
Later
v1.0 — Everything moves native.
calculateLayoutlet you update renderables directly without a separate update passOngoing
Work that spans every phase.