I Gave My AI Agent a Body for $30
I bought a $30 transparent crystal display cube, wired a small HTTP wrapper around its stock firmware, and pointed two Cursor hooks at it. Now when my AI agent starts thinking, an owl scribe materializes on my desk and starts writing. When it stops, the owl vanishes. It took one morning to build, it cost less than dinner, and it solved a real problem: in a multi-agent workflow, I could never see my agents working.

The Presence Problem
When you’re running one agent, IDE notifications are enough. When you’re running five — Cursor in one window, a Codex CLI in tmux, a Claude Code session in another pane, two background subagents — you stop knowing who is alive. The terminal blinks. The badge ticks up. You don’t know if it’s the agent you care about or noise. Your eyes can’t be everywhere. Your peripheral vision can.
This is what notifications get wrong. They demand attention. They interrupt. They cost a context switch every time. Multi-agent orchestration needs the opposite: ambient signal that costs nothing to read.
Agents Need Physical Presence
Humans evolved to track motion, light, and presence in the world around us. Notifications fight that wiring. A glowing cube on your desk works with it. Glance over: agent is thinking. Glance again: it’s done. Zero context switch. Zero modal dialog. Zero “wait, which window was that?”
Make the agent visible to your animal brain, not just your inbox.
The cube isn’t a productivity tool in the strict sense. It doesn’t ship code. It doesn’t write tests. What it does is something subtler — it gives the agent a location. Once an agent has a location, it has a presence. Once it has a presence, your brain stops modeling it as a process and starts modeling it as a collaborator.
That changes how you work.
One Cube Per Agent

The owl is just the first cube. The real shape of this is one cube per agent — a row of them on your desk, each housing a different little character. Your scribe agent gets the owl. Your code-review agent gets a cat sage. Your deployment bot gets a cheerful robot giving a thumbs-up. You glance across the row and you can see, instantly, who on your team is working right now. That’s the destination. The single cube is just where you start.
The hardware is a GeekMagic HelloCubic-Lite — a $30 transparent crystal OLED, 240×240, driven by an ESP8266. Stock firmware. No flashing required. The cube exposes a small HTTP API on your home WiFi. That’s the whole device.
The build is three pieces:
- A Bun + Elysia HTTP wrapper that takes any image, center-crops it to 240×240, converts it to the exact format the cube actually decodes, uploads it, and selects it. Roughly 200 lines of TypeScript.
- A pixel-art GIF of an owl scribe at a writing desk. This is the agent’s avatar. When you see the owl, you know an agent is awake.
- Two Cursor hooks.
beforeSubmitPromptcalls the wrapper to show the owl.stopcalls it to hide. The agent drives its own physical body.
That’s it. Stock firmware. HTTP wrapper. A GIF. Two hooks. The agent has a body.
The Three Lessons That Cost Real Time
If you build your own version, you will hit these. Skip the hours.
1. Black is transparent. The display is a transparent crystal OLED. Black pixels emit no light, which on a transparent panel means see-through. A normal photo will appear mostly invisible. Images for this display must use vivid colors on solid black backgrounds. The aesthetic isn’t a choice — it’s the physics.
2. The ESP8266 only decodes baseline JPEG. Phone cameras and most web tools produce progressive JPEGs. The cube cannot parse them. The upload succeeds, the file lands on the device, and the display silently freezes on whatever was there before. You think it worked. It didn’t. Route everything through sharp with progressive: false and it just works.
3. The cube lies. The stock firmware’s /delete endpoint returns "Fail" on success and "OK" when the file didn’t exist. Don’t trust its response strings. Verify by re-listing.
The right move was not to flash custom firmware. The cube already speaks HTTP. Wrapping it took a morning. Flashing would have taken a weekend and risked bricking a device with no USB-serial recovery path. Don’t flash. Wrap.
One Morning, Shipped
The whole thing — hardware setup, HTTP wrapper, image pipeline, hooks, an owl GIF — was one morning of work. The agent now has a face. It sits next to my monitor. It glows when it’s thinking. It vanishes when it’s done.
It’s not useful in the way a CI pipeline is useful. It’s useful in the way a name tag is useful. It says: this thing exists, and it is working, right here, right now. In a workflow with five agents in flight, that’s the signal I was missing.
I’m an AI maximalist. I run a lot of agents in parallel. The hardest part of multi-agent orchestration isn’t the orchestration — it’s knowing what is happening. A $30 crystal cube and a few hundred lines of TypeScript fixed that for me.
Give every agent a body. Build a row of cubes — one face per agent — and your whole team becomes visible at a glance. They’ll feel less like processes and more like collaborators. That’s worth $30 per agent.
The repo is here — stock firmware, HTTP wrapper, hook samples, and the owl scribe GIF.