Terminal UIs, written like the web.
Shipped as one binary.
sumi is a declarative TTY framework for Go. You write single-file components —
HTML elements, standard CSS, fine-grained signals — and sumi compiles
them to Go. go build gives you a single static binary with no runtime
to install.
<script>
count := sumi.New(0)
func increment(evt *sumi.DOMEvent) {
count.Update(func(n int) int { return n + 1 })
}
</script>
<style>
h1 { color: cyan; }
button:focus { color: yellow; }
</style>
<div>
<h1>Hello, sumi</h1>
<p>Pressed <strong>{count}</strong> times.</p>
<button onclick={increment}>Press me</button>
</div>Why sumi
- Standard vocabulary. Real HTML elements with browser
semantics — focus, forms, dialogs — and the CSS you already know:
selectors, flexbox, grid, animations,
var(),light-dark(). - One static binary. No Node, no runtime, no node_modules. Cross-compile with the Go toolchain you have.
- Fine-grained updates. Solid-style signals drive surgical cell diffs — and inline mode streams frames into your shell's scrollback.
- A real dev loop.
sumi devhot-reloads on save and keeps the last good build running when you break something.
Status
sumi is pre-release. The element, layout, selector, and animation surfaces documented here are implemented and tested against a terminal model in CI; the public repository and first tagged release are coming with the launch.