cubicle
Health Warn
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 5 GitHub stars
Code Fail
- os.homedir — User home directory access in bin/cubicle-hook.js
- fs module — File system access in bin/cubicle-hook.js
- os.homedir — User home directory access in bin/cubicle.js
- process.env — Environment variable access in bin/cubicle.js
- fs module — File system access in bin/cubicle.js
- new Function() — Dynamic code execution via Function constructor in test/smoke.js
- child_process — Shell command execution capability in test/smoke.js
- rm -rf — Recursive force deletion command in test/smoke.js
- fs.rmSync — Destructive file system operation in test/smoke.js
- process.env — Environment variable access in test/smoke.js
- fs module — File system access in test/smoke.js
- network request — Outbound network request in test/smoke.js
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
A live pixel-art office for your Paperclip AI agents. Zero dependencies, read-only.
Cubicle
A live pixel-art office for your AI agents. Works with Paperclip, Claude Code, or any tool that can write a small JSON file.
▶ Live demo — no install, fake agents.
Your agents get a desk. When one starts working it walks over, sits down and starts typing, with its current task floating above its head. When it needs you, it raises a hand. When it finishes it goes back to the lounge for a coffee. If it hits an error, its screen flashes red.
- Zero dependencies. One small Node.js file plus one HTML page. No build step, no image assets.
- Read-only by design. Cubicle only ever makes
GETrequests, and only to a short allowlist. It cannot change anything in your agent system. - Not tied to one platform. Paperclip and Claude Code are built in; anything else plugs in through a tiny JSON feed.
- Runs anywhere Node runs.
npx, a clone, a systemd unit, or a browser tab pointed at the hosted demo. - English and Turkish UI, picked from your browser language or with
?lang=en/?lang=tr.
Quick start
Requires Node.js 18+.
Paperclip (default; expects Paperclip at http://127.0.0.1:3100):
npx @caglarutkuguler/cubicle
Claude Code (one character per session, driven by Claude Code's own hooks; details in examples/claude-code/):
npx @caglarutkuguler/cubicle install-hooks # once; backs up ~/.claude/settings.json first
npx @caglarutkuguler/cubicle --source claude-code
Anything else — a JSON file or URL in the feed format:
npx @caglarutkuguler/cubicle --source ./agents.json
npx @caglarutkuguler/cubicle --source http://localhost:8080/agents
Then open http://127.0.0.1:3200. Nothing running yet? Open http://127.0.0.1:3200/?demo, or the hosted demo.
Or from a clone:
git clone https://github.com/caglarutkuguler/cubicle.git
cd cubicle
node bin/cubicle.js # add --source … as above
Options
| Flag | Environment variable | Default |
|---|---|---|
--port |
CUBICLE_PORT |
3200 |
--host |
CUBICLE_HOST |
127.0.0.1 |
--source |
CUBICLE_SOURCE |
paperclip — or claude-code, a .json file, or an http(s):// URL |
--paperclip |
PAPERCLIP_URL |
http://127.0.0.1:3100 |
--token-file |
PAPERCLIP_TOKEN / PAPERCLIP_TOKEN_FILE |
none — API key for an authenticated Paperclip |
URL parameters:
?company=PREFIXopens a specific Paperclip company (for example?company=MEG). With several companies, a picker also appears in the header.?lang=enor?lang=trsets the language.?demoshows fake agents.
What the office shows
| Status | In the office |
|---|---|
running |
Sits at its desk, monitor on, typing; bubble shows the task |
waiting |
Sits at its desk with a hand up, amber screen — it needs your input or approval |
idle |
Wanders the lounge; says "✓ done" right after finishing a run |
error |
Slumped at its desk, red screen, error text on its card |
paused |
"zZ" |
Each card below the office links to the agent's current task when the source provides a link (Paperclip issues do).
Sources
Paperclip. Cubicle proxies three read-only endpoints (/api/health, /api/companies, /api/companies/:id/agents|issues) and maps Paperclip's agent status and open issues onto the office. Any adapter Paperclip supports — Claude Code, Codex, Cursor, HTTP agents — shows up, because the status comes from Paperclip itself.
The default local_trusted mode needs no key. For an authenticated or remote Paperclip, give Cubicle an API key; it is sent as Authorization: Bearer … on the forwarded requests only:
PAPERCLIP_URL=https://paperclip.example.com PAPERCLIP_TOKEN=pcp_… npx @caglarutkuguler/cubicle
# or keep it in a file only you can read
npx @caglarutkuguler/cubicle --paperclip https://paperclip.example.com --token-file ~/.config/cubicle/paperclip-token
Use a board API key with the narrowest read-only scope Paperclip lets you create; an agent key also works but only sees that agent's company. There is no --token flag on purpose, because command-line flags are visible in the process list. With systemd, put PAPERCLIP_TOKEN=… in a chmod 600 file and point EnvironmentFile= at it (see examples/systemd/cubicle.service).
Claude Code. A hook script (bin/cubicle-hook.js) runs on Claude Code's own hook events and rewrites ~/.cubicle/claude-code.json. Tool calls put the character at its desk, permission prompts raise its hand, Stop sends it to the lounge. Setup and privacy notes: examples/claude-code/README.md.
Feed. Any process can write { "company": "…", "agents": [{ "id", "name", "role", "status", "task", "error" }] } to a file or serve it over HTTP. Full spec with status aliases: docs/FEED.md. A sample is in examples/feed.json.
Run it as a service (Linux / WSL)
systemd user units are in examples/systemd/: cubicle.service (Paperclip, port 3200), cubicle-claude.service (Claude Code, port 3201), and an optional updater.
git clone https://github.com/caglarutkuguler/cubicle.git ~/cubicle
mkdir -p ~/.config/systemd/user
cp ~/cubicle/examples/systemd/*.service ~/cubicle/examples/systemd/*.timer ~/.config/systemd/user/
# edit ExecStart in cubicle*.service to point at your node binary (`command -v node`)
systemctl --user daemon-reload
systemctl --user enable --now cubicle.service cubicle-claude.service
Stay up to date automatically. cubicle-update.timer fast-forwards the clone every 10 minutes and restarts the running Cubicle services when something changed; open browser tabs reload themselves within a minute. It never touches a clone with local edits.
# link instead of copying, so updates to these two units arrive with the clone
systemctl --user link ~/cubicle/examples/systemd/cubicle-update.service ~/cubicle/examples/systemd/cubicle-update.timer
systemctl --user enable --now cubicle-update.timer
journalctl --user -u cubicle-update.service # what it did
Security notes
- Cubicle binds to
127.0.0.1by default. Keep it that way unless you put it behind your own authentication, because anyone who can reach it can see your agent names, statuses and task titles. - Only
GETandHEADare accepted; everything else gets405. In Paperclip mode only the three endpoints above are forwarded and any other/api/path gets403. In feed mode the only upstream request is aGETto the configured file or URL. - A Paperclip API key is added by the proxy and never sent to the browser. The browser's own cookies and
Authorizationheader are never forwarded upstream. If you bind to anything other than loopback while a key is set, Cubicle prints a warning at startup: everyone who can reach the port can read what the key can read. - The Claude Code hook never touches the network and stores only session id, directory name, status and a short summary of the current tool call.
How it works
bin/cubicle.js serves public/index.html and either proxies the allowed Paperclip endpoints or serves the feed at /api/feed. The page polls every 4 seconds and draws everything, including characters, furniture and the day/night windows, on a 352×208 canvas with plain rectangles.
Contributing
Issues and pull requests are welcome. Ideas: adapters for other agent runtimes (write a feed, send a PR with an example), a kiosk mode for wall displays, meeting-room animations when agents hand work to each other, per-agent sprite customisation, replay of a recorded day, and multi-source offices (Paperclip and Claude Code on one floor).
Releasing
Versions are published to npm by .github/workflows/release.yml with npm trusted publishing, so no npm token exists anywhere and every version carries a provenance attestation.
npm version patch # or minor / major: bumps package.json, commits, tags vX.Y.Z
git push --follow-tags # CI tests, publishes to npm, creates the GitHub release
Credits
Inspired by the idea behind Pixel Agents by Pablo De Lucca. Cubicle is an independent implementation and uses no code or assets from it.
Cubicle is a community project and is not affiliated with or endorsed by Paperclip Labs or Anthropic.
License
Türkçe
Cubicle, AI ajanlarınızı canlı bir pixel ofiste gösterir: Paperclip ve Claude Code hazır gelir; başka sistemler küçük bir JSON feed ile bağlanır. Çalışan ajan masasına oturup yazar ve başının üstünde görevi görünür; sizi bekleyen ajan elini kaldırır; işi biten ajan dinlenme alanına döner; hata alan ajanın ekranı kırmızı yanar.
Kurulum: npx @caglarutkuguler/cubicle (Paperclip) veya npx @caglarutkuguler/cubicle --source claude-code (Claude Code) çalıştırın ve http://127.0.0.1:3200 adresini açın. Kurmadan denemek için: canlı demo. Arayüz tarayıcı diline göre Türkçe açılır; ?lang=tr ile de seçilebilir.
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found
