简体中文 | English | 한국어 | Français | Deutsch | 日本語 | Русский | Español | Português | Italiano | Tiếng Việt | العربية
A pixel-office dashboard for multi-agent collaboration: it visualizes what your AI assistants (OpenClaw, Lobster, etc.) are doing in real time—who is active, what happened “yesterday,” and who is online—so humans can read the room at a glance.
This repo is a Node.js / Express take on the upstream Star-Office-UI idea. It keeps the same look-and-feel and HTTP contract so existing agents and scripts need little or no change, while the backend is structured for long-running service use—not a single giant script.
This project supports four styles: Pixel, Soft, Night Blue, and Paper, with Pixel style as the default.

src/ instead of one monolithic file. Easier to review, test, and extend.engines, only-allow, .npmrc engine-strict, plus a startup guard in src/bootstrap/env-check.js). CI and onboarding behave the same way everywhere.SIGTERM / SIGINT (Docker/K8s friendly). GET /health for liveness and GET /ready after persistence is initialized.memory/ directory (see GET /yesterday-memo), turning diary files into a gentle “what we did last time” blurb.Upstream lineage and thanks are below; the sections after that cover how to run and integrate.
Thanks for open-sourcing the pixel-office concept, assets, and interaction design.
Requires Node ≥ 20 and pnpm ≥ 9 (install pnpm if needed).
git clone https://github.com/wangmiaozero/Star-Office-UI-Node.git
cd Star-Office-UI-Node
pnpm install
pnpm start
Default URL: http://127.0.0.1:18791
Development with file watch:
pnpm dev
If the port is busy:
PORT=18792 pnpm start
Optional env file:
cp .env.example .env
SKIP_PNPM_CHECK=1 is documented only for edge cases where you must run node src/server.js without pnpm—it is not recommended for production.
docker compose up -d
Then open: http://127.0.0.1:18791
Set the main agent state (CLI helper):
pnpm set-state writing "Drafting docs"
Health and readiness:
curl -s http://127.0.0.1:18791/health curl -s http://127.0.0.1:18791/ready
GET /health — livenessGET /ready — readiness (after startup checks)GET /status — main agent statusPOST /set_state — set main agent statusGET /agents — list agents (guest cleanup / offline logic applied)POST /join-agent — guest agent joinPOST /agent-push — guest status pushPOST /leave-agent — guest leavePOST /agent-approve / POST /agent-reject — approve or reject guestGET /yesterday-memo — memo derived from memory/YYYY-MM-DD.mdGET /, /join, /invite — web entry pages; static assets under /staticidle, writing, researching, executing, syncing, errorCompatibility mapping:
working / busy / write → writingrun / running / execute / exec → executingsync → syncingresearch / search → researchingcurl -s -X POST http://127.0.0.1:18791/join-agent \
-H "Content-Type: application/json" \
-d '{
"name": "openclaw-agent-01",
"joinKey": "ocj_starteam02",
"state": "idle",
"detail": "just joined"
}'
curl -s -X POST http://127.0.0.1:18791/agent-push \
-H "Content-Type: application/json" \
-d '{
"agentId": "agent_xxx",
"joinKey": "ocj_starteam02",
"name": "openclaw-agent-01",
"state": "writing",
"detail": "working on current task context"
}'
curl -s -X POST http://127.0.0.1:18791/leave-agent \
-H "Content-Type: application/json" \
-d '{"agentId":"agent_xxx"}'
Suggested lifecycle:
join-agent on startupagentId locallyleave-agent on graceful shutdown403/404, stop pushing and re-join or alertIf this project helps you, a star is appreciated.
Made with ❤️ by wangmiaozero