sumi

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.

counter.sumi — live, running in your browser
<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 dev hot-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.