Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
Limoni
Terminal UI engine for Go that tests can click and AI agents can drive (MCP). Zero-allocation rendering, immediate mode + Elm architecture, 3D, images, charts, accessibility,…
Install
claude mcp add limoni -- limoni-mcp -socket "$XDG_RUNTIME_DIR/limoni-checklist.sock"Install command taken from the project's README or registry entry. Always review code before running it.
README excerpt
Read full README on GitHub →🍋 Limoni
A terminal UI engine for Go that tests can click, AI agents can drive,and the garbage collector never sees.
English • Türkçe
▶ Try it in your browser — the same engine compiled to WebAssembly, no install.
Quick start
go get github.com/thebanri/limoni
package main
import "github.com/thebanri/limoni"
func main() {
limoni.Run(func(f *limoni.Frame, ev *limoni.Event) bool {
if ev != nil && ev.Type == limoni.EventKey && ev.Key.Type == limoni.KeyEsc {
return false // quit
}
f.RenderComponent(limoni.Border(
limoni.Center(limoni.Label("Hello from Limoni 🍋 (Esc quits)", limoni.Bold())),
limoni.SymbolsRounded,
limoni.Fg(limoni.Hex("#FFCC00")),
), f.Area())
return true
})
}
Or generate a project that runs straight away, with a test already written:
go run github.com/thebanri/limoni/cmd/limoni@latest new myapp # -template counter|dashboard|form|chat|ssh
cd myapp && go mod tidy && go run .
go test ./... # a uitest test comes with every template
Next: Getting started · Widget gallery · Examples
Why Limoni
1. Your TUI has a semantic tree, so tests and agents address widgets by name
Most terminal automation, such as termwright or mcp-tui-test, parses the rendered character grid, so a test breaks when the layout moves by one column. A Limoni app builds a semantic tree every frame (the same tree a screen reader uses), and the tools below work on that tree instead.
uitest: Playwright-style tests. Checks wait instead of sleeping, and a failure
prints the whole tree of the last frame.
page := uitest.Run(t, 80, 24, app.draw) // in process: no terminal needed
page.GetByRole("input", "New task").Type("Tag v1.0")
page.GetByRole("button", "Add task").Click()
page.Expect(page.GetByRole("list-item", "").Within(page.GetByRole("list", "Tasks"))).ToHaveCount(3)
page.Expect(page.GetByID("status")).ToContainLabel("Added")
limoni-mcp: let an AI agent drive the app. It gives Claude Code, Cursor or any
MCP client eight tools (tree, click, type_text, wait_for…) that work on the
same tree. In one recorded run, Claude Code completed a release checklist in 17 tool
calls. That run included typing a deploy token the agent could not read back.
go run -tags limoni_debug ./examples/agent_checklist
claude mcp add limoni -- limoni-mcp -socket "$XDG_RUNTIME_DIR/limoni-checklist.sock"
The automation socket only exists in -tags limoni_debug builds. It is closed by
default, only the same user can connect, and secret fields are never exposed.
→ Semantic automation, MCP and uitest
2. Fast where you can feel it
Similar plugs
Build Agentic workflows, RAG pipelines, with rich AI model and tool support on one collaborative workspace. Deploy on cloud, VPC, or self-hosted, so teams move from prototype…
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
A cross-platform desktop All-in-One assistant for Claude Code, Codex, OpenCode, OpenClaw, Grok Build & Hermes Agent. Only official website: ccswitch.io
An open-source AI agent that brings the power of Gemini directly into your terminal.