Skip to content

Use case · AI agent mascot

A mascot that shows what your agent is doing.

Agents work for minutes, then quietly wait for approval. A character that shows working, waiting for you, done or failed means you stop checking the terminal every thirty seconds.

Works with Claude Code hooks, the CLI and any agent loop

nova · working · 9 partslive vector, not a video

Try it

Simulate a build.

The ai_agent canvas, live. Run a build, or one that fails, and watch the states change.

lumorig companion

idle
$ claude "fix the flaky auth test"

State graph · ai_agent

now: idle
PreToolUseNotificationStoperrorthenidleworkingwaitingdonefailed

Where it runs

Terminal, browser or your own app.

Claude Code, in a side terminal

lumorig companion draws your character in the terminal; these hooks keep it in sync with the agent.

.claude/settings.json
{
  "hooks": {
    "UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "lumorig state working" }] }],
    "PreToolUse": [{ "matcher": "*", "hooks": [{ "type": "command", "command": "lumorig state working" }] }],
    "Notification": [{ "hooks": [{ "type": "command", "command": "lumorig state waiting" }] }],
    "Stop": [{ "hooks": [{ "type": "command", "command": "lumorig state done" }] }]
  }
}

Your agent UI, in the browser

Embed the character with <lumorig-player> and set one input from your run events.

agent-ui.ts
const agent = document.querySelector("lumorig-player");

// ai_agent canvas: 0 idle · 1 working · 2 waiting · 3 done · 4 failed
run.on("start", () => agent.setInput("status", 1));
run.on("needs-approval", () => agent.setInput("status", 2));
run.on("finish", () => agent.setInput("status", 3));
run.on("error", () => agent.setInput("status", 4));

Why a character

Status you notice without reading.

  • Waiting is the expensive state

    An agent blocked on approval wastes the most time. A waving character in the corner of your eye gets noticed; a line of terminal text doesn't.

  • Done and failed feel different

    A small celebrate or a sad beat tells you the outcome before you read the log.

  • Made by your agent, too

    With the MCP server, your agent can create, animate and embed its own mascot.

For agents

Give your agent the whole toolkit.

terminal
claude mcp add --transport http lumorig \
  https://lumorig.com/api/mcp \
  --header "Authorization: Bearer $LUMORIG_API_KEY"

FAQ

Agent status questions.

Which states does the agent template have?

Five: idle, working (loops), waiting for you (a looping wave), done (celebrates, then back to idle) and failed (a sad beat, then idle). One numeric input, status, moves between them with short blends.

How do I connect it to Claude Code?

Run lumorig companion in a side terminal, then lumorig hooks --write. It merges hooks into .claude/settings.json that call lumorig state working, waiting and done at the right moments, keeping your existing hooks.

Does it only work with Claude Code?

No. The companion only watches a small state file, so any tool can drive it with lumorig state <name>: a build script, a CI job, another agent. In a web app, set the status input on <lumorig-player> from your agent's events.

Can my agent create the mascot itself?

Yes. Add the hosted MCP server and your agent gets tools to create, animate, export and embed characters, including create_canvas for this template. The REST API and CLI do the same.

Is it free to run?

Running the companion, the player and canvases never costs credits. Creating the character does; the free plan includes 200 credits a month, enough for a couple of new characters.

Give your agent a face.

Start from a sentence or your own mascot, then pick the AI agent template.

Drop a PNG, JPG or SVG anywhere here

or pick a file · free to start · no card

Start from an idea