Agent skill

Limoni Performance

by thebanri in thebanri/limoni

Where allocations hide in a Limoni frame, how to find them, how to compare benchmarks honestly, and the release and CI checks that catch what one machine cannot.

Apache-2.0Auto-check passed

Install Limoni Performance

skills CLI
$ npx skills add thebanri/limoni --skill limoni-performance -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install thebanri/limoni limoni-performance --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/thebanri/limoni.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/limoni-performance .claude/skills/limoni-performance && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
limoni-performance
GitHub stars
152
Token cost
~1.4k tokens
SKILL.md length
667 words
Files
1
Skills in repo
4
Repo updated
First seen
Licence
Apache-2.0

At a glance

Where allocations hide in a Limoni frame, how to find them, how to compare benchmarks honestly, and the release and CI checks that catch what one machine cannot.

  • Works in 5 steps: go build ./... && go vet ./... && go… → gorelease -base= without -version:… → In a worktree of origin/main: turn ##… → …
  • SKILL.md covers Where allocations hide, Finding them, Comparing honestly and What only CI can tell you, plus 1 more section
  • Calls go, git and gh

What it does

Limoni Performance is an agent skill from thebanri/limoni. Where allocations hide in a Limoni frame, how to find them, how to compare benchmarks honestly, and the release and CI checks that catch what one machine cannot. Load before touching a Draw path, a benchmark, an allocation test, or before cutting a release.

Its SKILL.md is about 1.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It works with Model Context Protocol. The repository describes itself as: 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… The licence is Apache-2.0.

Example prompts

  • “/limoni-performance”

Workflow steps

5 steps, taken from the first numbered list in SKILL.md.

  1. go build ./... && go vet ./... && go test ./..., -race on the CLAUDE.md
  2. gorelease -base= without -version: naming a version
  3. In a worktree of origin/main: turn ## [Unreleased] into the version with
  4. gh release create with notes assembled from that CHANGELOG section.
  5. Verify from outside the repository: go install github.com/thebanri/limoni/cmd/zest@vX.Y.Z

What it can do on your machine

Read from SKILL.md and the folder at commit 025c5d5. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • go
    • git
    • gh

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git and gh, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Limoni Performance loads about 1.4k tokens when it runs. Until then it costs about 69 tokens; SKILL.md has 667 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~69
When it runs · the whole SKILL.md, loaded when a task matches
~1.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from thebanri/limoni at commit 025c5d5, republished under its Apache-2.0 licence (© thebanri). 667 words, ~1,359 tokens.

Download SKILL.mdSave it as .claude/skills/limoni-performance/SKILL.md (or your agent's skills folder).
name
limoni-performance
description
Where allocations hide in a Limoni frame, how to find them, how to compare benchmarks honestly, and the release and CI checks that catch what one machine cannot. Load before touching a Draw path, a benchmark, an allocation test, or before cutting a release.

Allocations, measurement, releases

The headline claim is a number — zero heap allocations per frame — so the rule is simple: measure the program people run, on more than one operating system, and distrust a number you like.

Where allocations hide

Every one of these was found in this repository, each after the widget benchmarks said 0 B/op:

Hiding placeWhat it looked likeFix
A closure built in Drawctx.RegisterClick(area, func(){...}) per clickable widget per framecell.ClickAction{Focus: id, Toggle: &b} / RegisterScroll: data, copied into a slice the frame reuses
The frame wrapping handlersRegisterClick wrapped each func() in a func(ev)store the handler as it is
A theme closurectx.ThemeStyle = func(role)... per widget per framebuild once on the frame
A captured local escapingvisibleCount captured by a mouse closure escaped even when no closure was registeredcopy it inside the if that registers
String buildingprefix + label, icon + " ", fmt.Sprintf in a drawwrite the parts separately with SetStringWithin
sync.Poolevery GC empties it, so the next frame allocated a scratch and two mapskeep scratch on the widget's state
os.Getenv on Windowsgraphics.DetectProtocol() per frame: ~12 env reads, 21 allocations on Windows onlydetect once, keep it in CapabilityProfile
Interface boxing by the callerRenderWidget(widgets.Checkbox{...}) copies the struct to the heaphold widgets by pointer
A struct growing past 128 bytesone bool added to the end of cell.Context → 144 B/op in every widget with a fallback click closurekeep Context ≤ 128 bytes; put new fields in an existing padding hole

The 128-byte cliff. A closure captures a variable by value only while it is small; above 128 bytes the compiler captures by reference, which moves the variable to the heap. cell.Context is passed to every Draw and captured by the fallback click closures, so one extra field at the end of it turned every widget from 0 B/op to 144 B/op — while the code around it was unchanged. go build -gcflags=-m says which it is: leaking param: ctx is free, moved to heap: ctx is an allocation per call. TestContextStaysUnder128Bytes guards the size; new fields go in the padding after Style.

Finding them

go
// Deterministic: force a GC each iteration, or a sync.Pool refill looks flaky.
if a := testing.AllocsPerRun(50, func() { draw(); runtime.GC() }); a != 0 { ... }
bash
go test ./pkg -run '^$' -bench X -benchmem -memprofile mem.out -memprofilerate 1 -o pkg.test
go tool pprof -sample_index=alloc_objects -top -lines pkg.test mem.out   # names the line

AllocsPerRun returns an average: a reading of 1 means every iteration allocated, not one stray. Treat it as a fact about the program, not as flakiness.

Benchmarks that only call Draw cannot see registration. BenchmarkInteractiveFrame (in benchmarks/) draws through a real Terminal with a theme; keep new interactive work covered by it, and CI gates every widget benchmark.

Show full SKILL.md (255 more words)Show less

Comparing honestly

bash
git worktree add --detach /tmp/base <base-commit>
(cd /tmp/base && go test ./core/buffer -run '^$' -bench X -count=5)
go test ./core/buffer -run '^$' -bench X -count=5      # same machine, same sitting
git worktree remove /tmp/base
  • Compare against the previous commit, never against the README's numbers.
  • Check numbers against each other. A load time that contradicts the per-item cost, or a line count that contradicts the elapsed time, means the harness is wrong — a "30 s" load turned out to be a leftover process from a failed run.
  • The order of a condition matters in a per-cell loop: cell.IsCluster(c) && !opts.ClusterWidths costs nothing; the reverse cost 5% on BenchmarkDiff_FullChanges.
  • Kill stray processes by pid file. pkill -f <pattern> matches the shell running it and kills your own session.

What only CI can tell you

Windows is the runner that catches what Linux hides: os.Getenv allocating, and AF_UNIX resetting a connection closed with unread data. Cross-compiling (GOOS=windows go vet ./...) proves it builds, nothing more. Push and read the job.

Releasing

  1. go build ./... && go vet ./... && go test ./..., -race on the CLAUDE.md list, the two benchmark gates, GOOS=js GOARCH=wasm build.
  2. gorelease -base=<previous tag> without -version: naming a version that does not exist yet makes the Go proxy cache a "not found" for it, and go install pkg@version then fails for ~18 minutes.
  3. In a worktree of origin/main: turn ## [Unreleased] into the version with today's date, add the compare link, commit release: vX.Y.Z, push, tag, push the tag.
  4. gh release create with notes assembled from that CHANGELOG section.
  5. Verify from outside the repository: go install github.com/thebanri/limoni/cmd/zest@vX.Y.Z in an empty directory. The proxy's @latest list lags the tag by a few minutes; the version itself is usually available at once.

© thebanri, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/limoni-performance of thebanri/limoni.

Open the folder on GitHubat commit 025c5d5

Compare with similar skills

Limoni Performance next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Limoni Performance compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Limoni Performance this skillthebanri/limoni152—~1.4kAutomated safety check: PassApache-2.0
MCP Server Builderanthropics/skills180k63 repos~2.3kAutomated safety check: PassApache-2.0
MCP Server BuildershareAI-lab/learn-claude-code78k5 repos~1.2kAutomated safety check: PassMIT
MCP Integration for Pluginsanthropics/claude-plugins-official38k11 repos~3.1kAutomated safety check: PassApache-2.0
Figma use_figma Plugin API Ruleswarpdotdev/warp65k4 repos~4.4kAutomated safety check: PassAGPL-3.0
Stitch to Remotion Walkthrough Videosgoogle-labs-code/stitch-skills8.4k6 repos~3.2kAutomated safety check: NotesApache-2.0

Similar skills

  • MCP Server Builder

    anthropics/skills

    Official

    Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.

    180k GitHub starsUsed in 63 repos~2.3k tokens
    Agent WorkflowsAuto-check passed
  • MCP Server Builder

    shareAI-lab/learn-claude-code

    Walks through building MCP servers in Python or TypeScript that expose tools, resources and prompts to Claude, with templates, registration and testing.

    78k GitHub starsUsed in 5 repos~1.2k tokens
    Agent WorkflowsAuto-check passed
  • MCP Integration for Plugins

    anthropics/claude-plugins-official

    Official

    Explains how to bundle Model Context Protocol servers in a Claude Code plugin, covering config files, stdio, SSE, HTTP and WebSocket server types, and authentication.

    38k GitHub starsUsed in 11 repos~3.1k tokens
    Agent WorkflowsAuto-check passed
  • Required groundwork before any use_figma call: the rules and reference files for running JavaScript in a Figma file through the Plugin API without common failures.

    65k GitHub starsUsed in 4 repos~4.4k tokens
    Frontend & DesignAuto-check passed
  • Stitch to Remotion Walkthrough Videos

    google-labs-code/stitch-skills

    Official

    Builds walkthrough videos from Stitch design projects using Remotion, with transitions, zoom effects and text overlays on each screen.

    8.4k GitHub starsUsed in 6 repos~3.2k tokens
    Media & CreativeAuto-check: notes
  • MCP Development

    coollabsio/coolify

    A skill your agent uses for Laravel MCP development. An agent skill from coollabsio/coolify.

    63k GitHub starsUsed in 1 repo~949 tokens
    Frontend & DesignAuto-check passed

More from thebanri/limoni

  • Limoni Agent Surface

    thebanri/limoni

    How Limoni exposes applications to AI agents and tests — the semantic tree, the automation socket, cmd/limoni-mcp, and the uitest package.

    152 GitHub stars~2.8k tokensUpdated 3 days ago
    Auto-check passed
  • Limoni Text Rendering

    thebanri/limoni

    How Limoni measures and stores text — UAX. An agent skill from thebanri/limoni.

    152 GitHub stars~1.9k tokensUpdated 3 days ago
    Auto-check passed
  • Limoni Zest

    thebanri/limoni

    zest, the log viewer built on Limoni — how its store, filtering and LogView fit together, how it is verified (in-process, in kitty, over MCP, in the browser), and what it deliberately does not do.

    152 GitHub stars~877 tokensUpdated 3 days ago
    Auto-check passed

Questions about Limoni Performance

What does Limoni Performance do?

Where allocations hide in a Limoni frame, how to find them, how to compare benchmarks honestly, and the release and CI checks that catch what one machine cannot. Limoni Performance is an agent skill from thebanri/limoni. Where allocations hide in a Limoni frame, how to find them, how to compare benchmarks honestly, and the release and CI checks that catch what one machine cannot.

How do I install Limoni Performance in Claude Code?

Run `npx skills add thebanri/limoni --skill limoni-performance -a claude-code`. Or copy the skill folder (.claude/skills/limoni-performance in thebanri/limoni) into .claude/skills/limoni-performance in your project. Claude Code loads it when a task matches its description.

How do I install Limoni Performance in Codex?

Run `npx skills add thebanri/limoni --skill limoni-performance -a codex`. Or copy the skill folder (.claude/skills/limoni-performance in thebanri/limoni) into .agents/skills/limoni-performance in your project. Codex loads it when a task matches its description.

Can I use Limoni Performance in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add thebanri/limoni --skill limoni-performance -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/limoni-performance, .gemini/skills/limoni-performance, .github/skills/limoni-performance and .opencode/skills/limoni-performance in your project.

What does Limoni Performance need to run?

Going by SKILL.md and its folder, Limoni Performance needs the command-line tools its instructions call (go, git and gh).

Does Limoni Performance access the network?

SKILL.md contains no URLs. Its commands use git and gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Limoni Performance safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Limoni Performance use?

Limoni Performance is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Limoni Performance use?

About 1.4k tokens (SKILL.md is roughly 5.4k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Limoni Performance?

Skills that share tags, products or a category with Limoni Performance: MCP Server Builder (anthropics/skills, 180k stars), MCP Server Builder (shareAI-lab/learn-claude-code, 78k stars), MCP Integration for Plugins (anthropics/claude-plugins-official, 38k stars) and Figma use_figma Plugin API Rules (warpdotdev/warp, 65k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Limoni Performance?

thebanri (a GitHub user) maintains it in thebanri/limoni, which has 152 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on October 5, 2026.

Source: thebanri/limoni on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.