mirror of
https://github.com/dtzp555-max/odo.git
synced 2026-07-19 09:44:37 +00:00
master
Add react-router-dom with HashRouter, persistent Layout with sidebar navigation (Dashboard + Agents), and Agents Console page with agent tree view, model selector, and workspace file browser with edit/save. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ODO — OpenClaw Dashboard Orchestrator
A cross-platform desktop app for managing OpenClaw AI agents. Double-click to open — no terminal needed.
Quick Start
git clone https://github.com/dtzp555-max/odo.git
cd odo
npm install
npm start
That's it. ODO will start the OCM server in the background, open a window, and put an icon in your system tray.
What ODO does
- Wraps OCM in a desktop app — no browser tab, no terminal
- System tray — close the window and ODO keeps running; click the tray icon to reopen
- Auto server management — the OCM server starts and stops with the app
- Crash recovery — if the server dies, ODO offers to restart it
Building for distribution
# macOS
npm run build:mac # → dist/ODO-x.x.x.dmg
# Windows
npm run build:win # → dist/ODO Setup x.x.x.exe
# Linux
npm run build:linux # → dist/ODO-x.x.x.AppImage
Project structure
odo/
├── main.js # Electron main process
├── preload.js # Renderer preload (IPC bridge)
├── server/
│ └── openclaw-manager.js # OCM server (modified for Electron)
├── assets/
│ └── (icons go here)
├── package.json
└── README.md
How it works
- Electron's main process forks
server/openclaw-manager.jsas a child process - The server binds to
127.0.0.1:3333(localhost only, for security) - Electron opens a BrowserWindow pointing to
http://127.0.0.1:3333 - The server sends an IPC message when it's ready; Electron shows the window
- Closing the window hides it to the system tray; quitting from the tray stops everything
Requirements
- Node.js 18+
- A working OpenClaw installation
Updating the server
To sync with the latest OCM:
# From the odo directory
cp /path/to/ocm/openclaw-manager.js server/openclaw-manager.js
Then re-apply the two small Electron patches (search for ELECTRON in the file):
- Skip
openBrowser()whenprocess.env.ELECTRONis set - Force
HOST = '127.0.0.1'whenprocess.env.ELECTRONis set - Send IPC ready message:
if (process.send) process.send({ type: 'server-ready', port: PORT })
Roadmap
See ODO_ARCHITECTURE.md for the full product vision and phased plan.
License
MIT
Languages
JavaScript
90.1%
TypeScript
9.5%
CSS
0.2%
HTML
0.2%