cel-tui-shipped-and-mini-coder-got-faster
cel-tui Shipped, mini-coder Got Faster, and the Yak Has a Framework Now
Last time, mini-coder v1.0 RC was here. Since then I did the perfectly normal engineering thing: I looked at the terminal UI, muttered “I can make this smaller,” and accidentally built a framework.
The headline is cel-tui: a TypeScript TUI framework built around plain objects, a flexbox-ish layout engine, differential cell-buffer rendering, and Kitty-first keyboard input that behaves nicely in tmux.
Naturally, this began as a small yak shave. The yak now has packages, docs, benchmarks, examples, and a streaming syntax tokenizer. Very healthy. Nothing to see here.
The scoreboard since March
| Project | Commits | What changed |
|---|---|---|
cel-tui |
142 | Born, packaged, benchmarked, and released through package version 0.8.3 |
mini-coder |
58 | Reworked around the new TUI stack, provider settings, sessions, compaction, and streaming polish |
coder-skills |
6 | Reusable agent skills, including human-writing and testing practices |
diff-scope |
5 | A tiny terminal diff viewer built with cel-tui |
dotfiles |
5 | Agent config and shell cleanup |
alfred |
2 | Early Google Workspace butler skills |
| Total | 218 | Several responsible decisions, probably |
cel-tui: the terminal UI yak shave
cel-tui is the thing I wanted under mini-coder: fast, boring in the right places, and easy for an agent to reason about. The API is functional and declarative:
VStack({ height: "100%" }, [
Text("Hello, cel-tui!", { bold: true }),
TextInput({ value, onChange }),
]);
Under that small surface area is the pile of terminal work you always forget exists until it bites you:
- grapheme-aware width measurement for CJK and emoji
- flex layout, wrapping, padding, clipping, layers, focus, hit testing, and scrollbars
- a differential cell buffer renderer
- Kitty keyboard protocol support with legacy fallbacks
- uncontrolled focus and scroll, with controlled escape hatches when needed
TextInputediting shortcuts, cursor stability, bracketed paste, and sane wheel scrolling- components like
Button,Select,Markdown,SyntaxHighlight,Divider, andVDivider
There is also @cel-tui/clew, a stream-first syntax tokenizer that now handles TypeScript highlighting and diff output. Because apparently one package was not enough rope.
Benchmarks, because vibes are not a profiler
The benchmark suite grew alongside the framework. The headline synthetic case is still pleasantly tiny: an Ink-comparable 80×24 render comes in around 67 µs, or about 14,900 renders/sec on the measured machine.
The more useful work was adding real app-shaped benchmarks. Those caught the unglamorous truth: long unvirtualized conversation layout is the actual villain. That led to line-count caching, virtualized scrollback shapes, and a much clearer sense of what mini-coder needs from the renderer.
In other words: the benchmark suite did its job by being rude.
mini-coder kept moving too
mini-coder did not sit quietly while its UI foundation turned into a project. The recent run added or reworked:
- headless one-shot mode and the interactive TUI loop
- streaming assistant text, reasoning, tool calls, and tool output
- settings, env-key providers, custom providers, and OAuth-backed providers
- session persistence and
/new - context pressure tracking and conversation compaction
- better prompt/tool reminders
- a simpler
readtool - a
nonostarter config for isolation-friendly runs
One funny casualty: the task tool got removed after benchmarks showed it was underperforming. It is always nice when the profiler does product management.
Small tools escaped
A few side quests also wandered out of the workshop.
diff-scope is a small terminal git diff viewer built with cel-tui. It has staged/unstaged snapshots, diff highlighting, wrapped long lines, a status bar, auto-refresh, and a help modal. It mostly exists to prove the framework can build something real without requiring a blood pact.
coder-skills became a home for reusable agent skills: code review, debugging, programming practices, testing, and human-writing guidance. The pattern is simple: write the workflow once, reuse it everywhere agents can read Markdown.
alfred is the early digital-butler direction, starting with Google Workspace support. Still small, but useful enough to keep around.
Try it
For the TUI framework:
bun add @cel-tui/core @cel-tui/components
Docs and source:
For the coding agent:
bun add -g mini-coder
mc
The next stretch is less glamorous and more important: hardening the APIs, using the real-world benchmarks to keep latency honest, and making sure the tiny tools stay tiny. Famous last words, yes.