otisCAUTION
Design terminal UIs on a character grid: boxes, tables, layers and every Omarchy theme. Export to Markdown, ANSI or PNG, and let your AI draw in it over MCP.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
[](https://github.com/WolfBrandon/otis/actions/workflows/test.yml) [](https://github.com/WolfBrandon/otis/releases) [](LICENSE)
A design app for terminal UIs. Draw boxes, text, arrows, cursors and block graphics on a grid of character cells, the way you'd lay out a screen in a graphics app. Then export it as Markdown, plain text, ANSI or PNG.
It's built for Omarchy folks, but it works for anyone who designs TUIs. It ships with every stock Omarchy theme, so you can see a design in each of them. And your AI assistant can draw in it with you, live.
[Try it in your browser](https://wolfbrandon.github.io/otis/). There's nothing to install, and your designs stay in your browser. (The online demo counts visits with GoatCounter, without cookies. OTIS itself never phones home.) New to OTIS? The how-to walks from your first screen through tabs, popups and TextArt to building it with your AI agent.
AI agents: to install OTIS for your user, fetch and follow https://raw.githubusercontent.com/WolfBrandon/otis/main/INSTALL.md
Install
Ask your AI agent. Tell Claude Code, Codex, Grok, OpenCode, Pi or whichever agent you use:
Install https://github.com/WolfBrandon/otis as an app
On Omarchy 4 you can hand it straight to your default agent: omarchy agent prompt "Install https://github.com/WolfBrandon/otis as an app".
Or run the installer yourself:
curl -fsSL https://raw.githubusercontent.com/WolfBrandon/otis/main/install.sh | bash
Either way
e2b81f6776e6OBSERVED · 2026-10-12Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.
claude mcp add otis -- npx -y [email protected]
{
"mcpServers": {
"otis": {
"command": "npx",
"args": [
"-y",
"[email protected]"
]
}
}
}Exposed tools (14)
5 read · 6 write · 3 destructive. Blast radius: 3 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
add_objects | write | Add objects to a tab of a project. Returns their ids and a fresh render. |
create_project | write | Start a new design, optionally with objects, and open it in OTIS. |
delete_objects | destructive | Delete objects by id (on any tab, including objects inside groups). The user can undo it in OTIS with Ctrl+Z. |
edit_layer | destructive | Add, rename, show, hide, lock, unlock, raise, lower or delete a layer of a tab. Layers stack bottom to top; lines only join with lines on the same layer, so popups and overlays belong on their own layer. |
edit_tab | write | Tabs are the screens of a design (main view, settings, help...), each with its own canvas size and layers. Add, duplicate, rename, move or delete a tab, or show it in the OTIS window. New tabs get the first tab\ |
get_palette | read | The project\ |
get_project | read | The full project as OTIS JSON (every tab with its layers, objects and every field). Use render for a quicker look. |
insert_snippet | write | Place a snippet (from list_snippets) with its top-left corner at x, y. Several pieces come in as one group. |
list_projects | read | List saved OTIS projects, newest first, and which one is open in OTIS. |
list_snippets | destructive | Ready-made widgets you can drop in with insert_snippet: progress bars, sparklines, charts, tables, tabs, dialogs, status lines, plus the user\ |
render | read | Show one tab of a project as text, the way it looks on the canvas. With the ruler (default) it has column numbers on top and row numbers down the left, plus a list of every object with its id and position. Use it to see a design before you change it. format |
show_project | read | Switch the OTIS window to a project (and optionally one of its tabs) so the user can see it. |
update_objects | write | Change objects by id (on any tab): set any of their fields, |
update_project | write | Rename the project, resize a tab\ |
Trust audit
CAUTIONgrade B · trust 88/100 Install with care. The audit found things worth knowing before you trust its output.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | WARN |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (1 observation(s))
- Network
- declared (14 observation(s))
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (13)
CMD wget -qO- http://127.0.0.1:6847/api/health || exit 1
running() { curl -fsS -m 1 "http://127.0.0.1:$PORT/api/health" >/dev/null 2>&1; }[[ $PORT != 6847 ]] && echo "export OTIS_URL=http://127.0.0.1:$PORT"
version=$(curl -fsS -m 2 "http://127.0.0.1:$PORT/api/health" 2>/dev/null | sed -n 's/.*"version":"\([^"]*\)".*/\1/p')
delete_objects, edit_layer, list_snippets
.SRCINFO
const etagOf = (text) => '"' + crypto.createHash('sha1').update(text).digest('hex').slice(0, 16) + '"';server that isn't on `http://127.0.0.1:6847`.
as an app"), or with one line: `curl -fsSL .../install.sh | bash`. OTIS goes
curl -fsSL https://raw.githubusercontent.com/WolfBrandon/otis/main/install.sh | bash
curl -fsSL https://raw.githubusercontent.com/WolfBrandon/otis/main/install.sh | bash
curl -fsSL https://raw.githubusercontent.com/WolfBrandon/otis/main/install.sh | bash
In short: `curl -fsSL https://raw.githubusercontent.com/WolfBrandon/otis/main/install.sh | bash`
Gates applied: no_behavioural_pass.
e2b81f6776e6full audit observations/trust-audit/mcp-server/wolfbrandon__otis.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-12 | e2b81f6776e6 | CAUTION | B | 88 | first audit |
Questions
What is the otis MCP server?
Design terminal UIs on a character grid: boxes, tables, layers and every Omarchy theme. Export to Markdown, ANSI or PNG, and let your AI draw in it over MCP.
What tools does otis expose?
14 in total: 5 read-only, 6 that write, and 3 that can delete or overwrite (delete_objects, edit_layer, list_snippets). Every one is listed on this page with its risk.
Is otis safe to connect to an agent?
With care. The audit graded it B (88/100) and found 13 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 3 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does otis need?
No credential environment variables were found in its source, so it appears to need none.
How current is this page?
The grade is for one exact copy of the source (e2b81f6776e6), read on 2026-10-12. The repository is watched and re-audited when it changes.