A lightweight coordination platform for managing multiple OpenCode instances. Each node (home computer, office computer, etc.) runs an independent deployment with Web UI for local task management. Data is aggregated through Feishu Bitable for a global view.
This system solves the coordination challenges when running OpenCode on multiple machines. It provides a Web UI console for task submission, worker pool management, real-time progress tracking, and automatic Feishu progress synchronization.
The main dashboard provides an overview of all tasks with real-time WebSocket status, task state visualization, and filtering capabilities.

Create new tasks with a simple form. Tasks are automatically distributed to available workers.

View detailed information about each task including status, assigned worker, and execution timeline.

Quickly identify and review failed tasks for troubleshooting.

| Component | Technology |
|---|---|
| Frontend | React + Vite + Tailwind CSS |
| Backend | Node.js + Fastify + Socket.io |
| Worker | Python 3.10+ |
| Data Sync | Feishu Bitable |
| Container | Docker + Docker Compose |
Each computer runs a complete, independent stack. No public server is required.
websocket-client (worker runtime imports websocket)git clone <repository-url>
cd opencode-multi-instance-coordinator
npm install
npm --prefix server install
npm --prefix web install
python3 -m pip install websocket-client
cp .env.example .env
# Edit .env with your settings
./scripts/start-local.sh
This starts:
Open http://localhost:5173 in your browser.
docker-compose.yml currently includes only backend + redis services; it does not start the Python worker.
Start worker separately after compose is up.
# Start services
docker-compose up -d
# Start worker separately (uses worker/.env or process env)
python3 worker/main.py
# View logs
docker-compose logs -f backend
# Stop services
docker-compose down
.
├── web/ # Frontend React application
│ ├── src/
│ │ ├── pages/ # Page components
│ │ ├── components/ # Reusable components
│ │ └── hooks/ # Custom React hooks
│ └── package.json
├── server/ # Backend Fastify application
│ ├── src/
│ │ ├── routes/ # REST API routes
│ │ ├── websocket/ # WebSocket handlers
│ │ ├── services/ # Business logic
│ │ └── middleware/ # Auth and other middleware
│ └── package.json
├── worker/ # Python worker daemon
│ ├── src/
│ │ ├── main.py # Entry point
│ │ ├── config.py # Configuration
│ │ ├── runtime.py # WebSocket client
│ │ └── opencode.py # OpenCode execution
│ └── main.py # CLI entry point
├── scripts/ # Utility scripts
│ ├── start-local.sh # Local development starter
│ └── stop-local.sh # Local development stopper
├── docs/ # Documentation
│ ├── API.md # API reference
│ ├── Worker.md # Worker configuration
│ └── Development.md # Development guide
├── docker-compose.yml # Docker orchestration
└── package.json # Root package configuration
Create a .env file in the project root:
# Server
PORT=3000
API_TOKEN=your-secret-token
CORS_ORIGIN=http://localhost:5173
# Web UI (Vite environment variables must be prefixed with VITE_)
VITE_SERVER_PORT=3000
VITE_API_TOKEN=your-secret-token
# Feishu Integration (optional)
FEISHU_APP_ID=your-app-id
FEISHU_APP_SECRET=your-app-secret
FEISHU_BITABLE_APP_TOKEN=your-app-token
FEISHU_BITABLE_TABLE_ID=your-table-id
# Worker
WORKER_WS_URL=ws://localhost:3000/ws/worker
WORKER_TOKEN=your-secret-token
WORKER_ID=worker-local-1
WORKER_NAME=Local Worker
See .env.example for the complete list of configuration options.
The scheduler uses a load-balanced round-robin algorithm:
/health) require Bearer token authenticationMIT License - see LICENSE file for details.
See Development Guide for setup instructions and contribution guidelines.