“Show the weather, then a clock”
The agent calls show_app and checks the result with panel_snapshot.
Fastest way in
Paste one prompt into Claude Code, Gemini CLI, Codex, Cursor or any coding agent with a terminal. It clones the repo, installs everything with uv, starts the simulator, and waits for you before it touches the real panel. Then it connects itself to the panel through the MCP server.
It follows the repo's own rules in CLAUDE.md: only the engine talks Bluetooth, and nothing gets "fixed" by editing source.
Pick your agent below for the exact command and where its MCP config lives.
The studio opens at http://127.0.0.1:8765 with a simulated panel. No hardware needed yet.
Close the iDotMatrix phone app first; the panel takes one connection at a time. The agent scans, pairs and draws a test pattern.
"Draw a pixel-art rocket, check the snapshot, fix anything that looks off." More in docs/MCP.md.
Set up DeskDot for me: an open-source engine, studio and MCP server for the
iDotMatrix 32×32 LED panel. Repository: https://github.com/shivpatel2468/idotmatrix
Work step by step and tell me what you are doing before each step.
1. Check prerequisites: git, uv (https://docs.astral.sh/uv/, install it if missing;
it brings its own Python 3.13) and Node.js 20+ (only to build the studio once).
Tell me whether this machine has Bluetooth LE.
2. Clone the repo into a folder called deskdot and work inside it:
git clone https://github.com/shivpatel2468/idotmatrix.git deskdot
3. Read CLAUDE.md and README.md before doing anything else, and follow their rules.
Above all: only the DeskDot engine may talk to the panel over Bluetooth. Never
connect to it with any other tool, and never disconnect it on purpose.
4. Install the Python dependencies: uv sync --extra mcp
5. Build the studio once (in web/): npm ci, then npm run build
6. Start the engine with the simulated panel, in the background:
uv run deskdot serve --sim
Wait until http://127.0.0.1:8765 answers, then tell me to open it.
7. STOP and ask me before touching real hardware. When I confirm the panel is on
and the iDotMatrix phone app is closed:
- stop the simulator
- uv run deskdot scan (finds the panel, named IDM-xxxxxx)
- copy deskdot.example.toml to deskdot.toml and set address = "<the MAC found>"
- uv run deskdot doctor (draws a test pattern; ask me whether I can see it)
- uv run deskdot serve (the real panel; leave it running)
8. Connect yourself to the panel through DeskDot's MCP server (docs/MCP.md):
a stdio server started with
uv run --project <absolute path to deskdot> deskdot-mcp
with env DESKDOT_URL=http://127.0.0.1:8765. Then call panel_snapshot,
list_apps, and show_app with "clock" to prove it works.
9. Finish with a short summary: what is running, the studio URL, how to stop and
restart it, and where my deskdot.toml is.
If something fails, read the error and the docs (docs/DEPLOY.md, docs/MCP.md,
docs/HARDWARE_PROTOCOL.md) and fix the setup. Do not edit DeskDot's source code to
work around a problem; tell me instead.
.mcp.json: approve it when asked, or run /mcp.$ claude$ claude mcp add deskdot -- uv run --project /path/to/deskdot deskdot-mcpBonus: merge integrations/claude-code/hooks.json into .claude/settings.json and a mascot on the panel shows when Claude is thinking, working or waiting for you.
settings.json (your user one, or .gemini/settings.json in the project), then restart Gemini CLI.$ gemini{
"mcpServers": {
"deskdot": {
"command": "uv",
"args": ["run", "--project", "/path/to/deskdot", "deskdot-mcp"],
"env": { "DESKDOT_URL": "http://127.0.0.1:8765" }
}
}
}config.toml (usually ~/.codex/config.toml), then restart Codex.$ codex[mcp_servers.deskdot]
command = "uv"
args = ["run", "--project", "/path/to/deskdot", "deskdot-mcp"]
env = { DESKDOT_URL = "http://127.0.0.1:8765" }.cursor/mcp.json in the project (or your user-level mcp.json), then enable it in Cursor's MCP settings.{
"mcpServers": {
"deskdot": {
"command": "uv",
"args": ["run", "--project", "/path/to/deskdot", "deskdot-mcp"],
"env": { "DESKDOT_URL": "http://127.0.0.1:8765" }
}
}
}claude_desktop_config.json.DESKDOT_URL=http://<host>:8765 in the server's env.{ "mcpServers": { "deskdot": { "command": "uv", "args": ["run", "--project", "/path/to/deskdot", "deskdot-mcp"] } } }Config formats for third-party agents change over time; if a key is rejected, check that agent's MCP docs. The command itself (uv run --project … deskdot-mcp) is always the same.
Then
The agent calls show_app and checks the result with panel_snapshot.
It draws pixel by pixel, looks at the snapshot and fixes anything that reads badly at 32×32.
Notifications slide over whatever is on screen, then the panel goes back to its app.