A pixel art office dashboard for OpenClaw — where your AI agents walk around, sit at desks, and visually reflect what they're doing in real time.
Turns your OpenClaw multi-agent system into a live pixel art office. Each agent becomes a character that walks to their desk, sits down, and animates based on real agent state — typing when writing code, reading when analyzing, thinking when reasoning, waiting when they need your attention.
- Live agent visualization — characters animate based on real OpenClaw Gateway state (typing, reading, thinking, waiting, error)
- Drag-and-drop layout editor — place, move, rotate, and delete furniture on a grid
- Persistent layouts — save and load office designs; create multiple layouts
- 25 furniture types — desks, PCs, chairs, plants, bookshelves, whiteboards, coffee machines, paintings, and more
- Agent toggle — choose which agents appear in the pixel office
- Character sprites — animated pixel characters with walk, typing, and reading states
- Fallback rendering — works even without sprite assets (colored rectangles)
- Real-time sync — polls OpenClaw Gateway for agent state every 3 seconds
git clone https://github.com/SweetSophia/openclaw-pixel-agents.git
cd openclaw-pixel-agents
npm install
npm run devThe app runs at http://localhost:5173 with the backend API on port 3001.
- Node.js 20+
- One of:
- OpenClaw running locally with CLI in PATH (for
cli/autodata mode) - Ingest API — set
DATA_SOURCE=ingest+INGEST_API_TOKENand push data from a collector script on the OpenClaw host
- OpenClaw running locally with CLI in PATH (for
Without a running OpenClaw Gateway, the app starts with 8 demo agents (Cybera, Shodan, Cyberlogis, Descartes, Chi, Cylena, Sysauxilia, Miku) in various activity states. This is enough to test the layout editor and rendering.
The right sidebar shows all configured agents with:
- Activity state badge (color-coded)
- Model name
- Token usage bar
- Toggle button to show/hide in the pixel office
- Bulk Show All / Hide All controls
Click ✏️ Edit in the header to enter editor mode:
| Action | How |
|---|---|
| Place furniture | Click a type in the 📦 palette, then click on the grid |
| Select furniture | Click on placed furniture (green dashed border) |
| Move furniture | Click and drag |
| Rotate furniture | Right-click, or use 🔄 button in the info bar |
| Delete furniture | Use 🗑️ button in the info bar, or press Delete |
| Save layout | Click 💾 Save |
Layouts auto-save 1 second after any change.
Click 📐 Layouts to manage saved layouts:
- Create new layouts with custom names
- Switch between layouts
- Delete layouts (default layout is protected)
The server supports three modes for getting agent data, controlled by the DATA_SOURCE env var:
| Mode | DATA_SOURCE |
How it works |
|---|---|---|
| Auto (default) | auto |
Tries CLI polling; if openclaw is not found and INGEST_API_TOKEN is set, switches to ingest-only |
| CLI Poll | cli |
Polls openclaw sessions locally every 3 seconds (requires OpenClaw on the same machine) |
| Ingest | ingest |
Accepts pushed data via POST /api/ingest/agents — no local OpenClaw needed |
Browser Server OpenClaw
┌──────────────┐ HTTP/WS ┌──────────────┐ CLI poll ┌──────────────┐
│ React 19 │◄───────────►│ Express │◄────────────►│ Gateway │
│ Canvas 2D │ │ Socket.IO │ (3s) │ Sessions API │
│ GameEngine │ │ Layout API │ └──────────────┘
└──────────────┘ └──────────────┘
Just run it on the same machine as OpenClaw. No extra configuration needed.
┌─────────────────────┐ every 15s ┌──────────────────┐
│ OpenClaw Server │ ──── collector script ───→ │ Your Server │
│ (has openclaw CLI) │ token-authenticated │ (pixel-agents) │
│ │ POST /api/ingest/agents │ │
└─────────────────────┘ └──────────────────┘
- Set
DATA_SOURCE=ingestandINGEST_API_TOKEN=<secret>on the pixel-agents server - On the OpenClaw host, copy
collector/.env.collector.exampleto.env.collectorand configure:PIXEL_AGENTS_URL— URL of the pixel-agents serverPIXEL_INGEST_TOKEN— same secret asINGEST_API_TOKEN
- Install the systemd timer from
collector/systemd/:# Edit the .service file to match your install path sudo cp collector/systemd/openclaw-pixel-collector.* /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now openclaw-pixel-collector.timer
See collector/README.md for full setup instructions.
| Component | Purpose |
|---|---|
GameEngine |
Canvas 2D rendering loop, sprite animation, editor mode, mouse handling |
SpriteLoader |
Loads and slices sprite sheets into individual frame canvases |
LayoutEditor |
Toolbar, furniture palette, layout manager UI |
PixelOffice |
Canvas wrapper, wires agent/layout data to GameEngine |
AgentSidebar |
Agent list with toggles and activity badges |
useAgentStore |
Fetches agent state from backend API |
useLayoutStore |
CRUD operations for layouts with auto-save |
Character sprite sheets are 112×96px PNGs:
- 7 frames per row (16×32px each)
- 3 rows: down (row 0), up (row 1), right (row 2)
- Frame mapping: 0-2 walk, 3-4 typing, 5-6 reading
- Left direction is auto-generated by flipping the right row
Furniture uses per-type directories with manifest.json for dimensions and rotation schemes.
- Add sprites to
public/assets/furniture/<TYPE>/ - Create
manifest.json:{ "id": "MY_FURNITURE", "name": "My Furniture", "category": "decor", "type": "single", "members": [{ "type": "asset", "id": "MY_FURNITURE", "file": "MY_FURNITURE.png", "width": 32, "height": 32, "footprintW": 2, "footprintH": 2 }] } - Add the type name to the furniture catalog in
server/index.ts - It appears in the editor palette automatically
- Create a 112×96px sprite sheet following the format above
- Place in
public/assets/characters/ - The
SpriteLoaderpicks it up automatically
- Frontend: React 19, TypeScript, Vite, Canvas 2D
- Backend: Node.js, Express, Socket.IO
- Assets: MetroCity character pack by JIK-A-4
- Agent Data: OpenClaw Gateway
| Environment Variable | Default | Description |
|---|---|---|
PORT |
3001 |
Backend server port (3000 in production) |
DATA_SOURCE |
auto |
Data mode: auto, cli (local polling), or ingest (push-based) |
OPENCLAW_CLI |
openclaw |
Path to OpenClaw CLI binary (cli mode only) |
POLL_INTERVAL |
3000 |
Agent state poll interval in ms (cli mode only) |
ACTIVE_MINUTES |
30 |
Session staleness threshold |
INGEST_API_TOKEN |
(none) | Shared secret for ingest API auth (required for ingest mode) |
OPENCLAW_AGENTS_DIR |
~/.openclaw/agents |
Path to agent session transcripts |
DATA_DIR |
./data |
Persistence directory for preferences and layouts |
| Command | Description |
|---|---|
npm run dev |
Start dev server (Vite + backend) |
npm run build |
Production build to dist/ |
npm start |
Run production build |
MIT — free for personal and commercial use.
Pixel art assets by JIK-A-4 (MetroCity pack) — free for personal and commercial use per itch.io terms.
See CONTRIBUTING.md for development setup, code style, and how to add custom assets.