lotusui
A Go design system for desktop and mobile — one codebase, native apps. Web when you want it.
GitHub

Registry

Own the code when you need to: vendor any component, keep updating it with real merges.

The default way to use lotusui is the module import — idiomatic Go, updated by go get. The registry is for the moment a component must diverge: lotusui add copies a component's source into your app, where it is yours to edit — and unlike a snapshot, it stays updatable. Every capability here is BUILD-time: registry.json is generated from the source, consumed by the CLI and by AI agents, and never read by app code at runtime.

Add a component

The copy still imports the lotusui core (theme, scales, icons): exported identifiers are qualified automatically by an AST pass, and unexported helpers are gathered once into a CLI-owned companion file. A vendored Button keeps taking *lotusui.Theme and drops into existing call sites. Components vendored side by side form a coherent SET — they reference each other's local copies, never a mix of local and qualified.

Go
go run github.com/ikaito-com/lotusui/cmd/lotusui add button
go run github.com/ikaito-com/lotusui/cmd/lotusui add dialog -dir internal/ui

Update — a real three-way merge

Every vendored file carries a stamp: component, version, and the hash of its pristine form. On update, files you never touched are replaced cleanly. Files you customized go through diff3 — the merge base is reconstructed EXACTLY, because the vendoring transform is a pure function of (version, component set) and the Go module cache stores every version's pristine source. Your edits, and only your edits, surface as diffs; conflicts are standard markers, printed alongside the migration changelog sections between the two versions.

Go
go run github.com/ikaito-com/lotusui/cmd/lotusui update            # everything under ./ui
go run github.com/ikaito-com/lotusui/cmd/lotusui update button -dry  # preview one component

Blocks

Blocks are ready-made compositions built only on the exported API — vendor them as starting points and shape them to your app.

Go
go run github.com/ikaito-com/lotusui/cmd/lotusui add login-form

Skills — teach your agent lotusui

lotusui ships agent skills in the module itself: the registry catalog, the theming system, the add/update workflow and the changelog contract, as files the agent's harness discovers. Install them into the app and re-run after upgrades so the skill always matches the version you build against.

Go
go run github.com/ikaito-com/lotusui/cmd/lotusui skills   #  .claude/skills/lotusui/

registry.json — the machine-readable catalog

Generated at build time from the source (lotusui registry, guarded by lotusui verify -registry): every component and block with its files, computed dependencies, carried helpers and pristine hash. Agents read it to know what exists and what vendoring involves — app code never does.

Go
{
  "name": "lotusui",
  "components": [
    {"name": "button", "files": ["button.go"], "hash": "…"},
    {"name": "card", "files": ["card.go"], "carried": ["cardShadow"], "hash": "…"}
  ]
}

lotusui is a Go design system for native desktop and mobile — and the web when you want it. Docs demos are the real components (WebAssembly) — one gallery app, each Preview an iframe addressed by URL hash.