A real-time dashboard and control center for OpenClaw AI agent instances. Built with Next.js, React 19, and Tailwind CSS v4.
TenacitOS lives inside your OpenClaw workspace and reads its configuration, agents, sessions, memory, and logs directly from the host. No extra database or backend required — OpenClaw is the backend.
- 📊 System Monitor — Real-time VPS metrics (CPU, RAM, Disk, Network) + PM2/Docker status
- 🤖 Agent Dashboard — All agents, their sessions, token usage, model, and activity status
- 💰 Cost Tracking — Real cost analytics from OpenClaw sessions (SQLite)
- ⏰ Cron Manager — Visual cron manager with weekly timeline, run history, and manual triggers
- 📋 Activity Feed — Real-time log of agent actions with heatmap and charts
- 🧠 Memory Browser — Explore, search, and edit agent memory files
- 📁 File Browser — Navigate workspace files with preview and in-browser editing
- 🔎 Global Search — Full-text search across memory and workspace files
- 🔔 Notifications — Real-time notification center with unread badge
- 🏢 Office 3D — Interactive 3D office with one desk per agent (React Three Fiber)
- 📺 Terminal — Read-only terminal for safe status commands
- ⚙️ Setup Checklist — Built-in checks for environment, gateway reachability, and OpenClaw config
Dashboard — activity overview, agent status, and weather widget
Session History — all OpenClaw sessions with token usage and context tracking
Costs & Analytics — daily cost trends and breakdown per agent
System Monitor — real-time CPU, RAM, Disk, and Network metrics
Office 3D — interactive 3D office with one voxel avatar per agent (React Three Fiber)
- Node.js 18+ (tested with v22)
- OpenClaw installed and running on the same host
- PM2 or systemd (recommended for production)
- Caddy or another reverse proxy (for HTTPS in production)
TenacitOS reads directly from your OpenClaw installation:
/home/node/.openclaw/ ← OPENCLAW_DIR (configurable)
├── openclaw.json ← agents list, channels, models config
├── workspace/ ← main agent workspace (MEMORY.md, SOUL.md, etc.)
├── workspace-studio/ ← sub-agent workspaces
├── workspace-infra/
├── ...
└── workspace/mission-control/ ← TenacitOS lives here
The app uses OPENCLAW_DIR to locate openclaw.json and all workspaces. No manual agent configuration needed — agents are auto-discovered from openclaw.json.
cd /home/node/.openclaw/workspace # or your OPENCLAW_DIR/workspace
git clone https://github.com/carlosazaustre/tenacitOS.git mission-control
cd mission-control
npm installcp .env.example .env.localEdit .env.local:
# --- OpenClaw paths (optional — defaults work for standard installs) ---
# OPENCLAW_DIR=/home/node/.openclaw
# --- Gateway / integrations (optional — defaults work for standard installs) ---
OPENCLAW_GATEWAY_URL=http://127.0.0.1:18789
OPENCLAW_GATEWAY_TOKEN=
OLLAMA_BASE_URL=http://127.0.0.1:11434
AGENT_COMMS_HEALTH_URL=
# --- Notion pipeline sync + live board status (optional) ---
# Paste either the raw UUID or the full Notion URL for each board.
NOTION_TOKEN=
NOTION_INTERNSHIPS_DATABASE_ID=
NOTION_HOUSING_DATABASE_ID=
# --- Branding (customize for your instance) ---
NEXT_PUBLIC_AGENT_NAME=Mission Control
NEXT_PUBLIC_AGENT_EMOJI=🤖
NEXT_PUBLIC_AGENT_DESCRIPTION=Your AI co-pilot, powered by OpenClaw
NEXT_PUBLIC_AGENT_LOCATION= # e.g. "Madrid, Spain"
NEXT_PUBLIC_BIRTH_DATE= # ISO date, e.g. "2026-01-01"
NEXT_PUBLIC_AGENT_AVATAR= # path to image in /public, e.g. "/avatar.jpg"
NEXT_PUBLIC_OWNER_USERNAME=your-username
NEXT_PUBLIC_OWNER_EMAIL=your-email@example.com
NEXT_PUBLIC_TWITTER_HANDLE=@username
NEXT_PUBLIC_COMPANY_NAME=MISSION CONTROL, INC.
NEXT_PUBLIC_APP_TITLE=Mission ControlTip:
OPENCLAW_DIRdefaults to/home/node/.openclaw. If your OpenClaw is installed elsewhere, set this variable.
Set these in .env.local when running on Jaydon's stack:
OPENCLAW_DIR=/home/node/.openclaw
OPENCLAW_WORKSPACE=/home/node/.openclaw/workspace
OPENCLAW_GATEWAY_URL=http://127.0.0.1:18789
# Optional if gateway auth enabled
OPENCLAW_GATEWAY_TOKEN=
OLLAMA_BASE_URL=http://127.0.0.1:11434
# Optional external or local health URL for your agent communication service
AGENT_COMMS_HEALTH_URL=http://127.0.0.1:8787/healthHealth hooks are available at:
GET /api/integrations/health(gateway + Docker + Ollama + optional agent-comms)GET /api/setup/status(env checklist + openclaw.json detection + gateway connectivity)POST /api/actionswith actions:gateway-status,restart-gateway,gateway-health,gateway-logs,session-ping,check-docker,check-ollama,check-agent-comms
cd /home/node/.openclaw/workspace/tenacitOS
cp .env.example .env.local
# edit .env.local if you need non-default OpenClaw, gateway, or branding values
npm install
npm run devThen in the UI:
- Go to Settings → OpenClaw Control Plane
- Complete the OpenClaw Setup Checklist
- Confirm gateway status from quick actions
- Visit Agents / Sessions / Cron / Skills and verify data is live
If gateway-backed data is unavailable, TenacitOS falls back to CLI/filesystem reads automatically.
The Pipelines page can read live Notion board state when these are set:
NOTION_TOKEN=secret_...
NOTION_INTERNSHIPS_DATABASE_ID=https://www.notion.so/...
NOTION_HOUSING_DATABASE_ID=https://www.notion.so/...TenacitOS will resolve the configured database or data source, detect the Notion Status property, and show:
- live item counts per status
- whether the Notion stages match the pipeline stages in the dashboard
- the last edited time of the board
cp data/cron-jobs.example.json data/cron-jobs.json
cp data/activities.example.json data/activities.json
cp data/notifications.example.json data/notifications.json
cp data/configured-skills.example.json data/configured-skills.json
cp data/tasks.example.json data/tasks.json# Development
npm run dev
# → http://localhost:3000
# Production build
npm run build
npm startOpen http://localhost:3000.
# Build + run TenacitOS container
docker compose up -d --build
# With bundled Ollama service profile
docker compose --profile ollama up -d --build
# Logs
docker compose logs -f tenacitosThe compose file mounts /home/node/.openclaw read-only so TenacitOS can inspect OpenClaw safely.
npm run build
pm2 start npm --name "mission-control" -- start
pm2 save
pm2 startup # enable auto-restart on rebootCreate /etc/systemd/system/mission-control.service:
[Unit]
Description=TenacitOS — OpenClaw Mission Control
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/home/node/.openclaw/workspace/mission-control
ExecStart=/usr/bin/npm start
Restart=always
RestartSec=10
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable mission-control
sudo systemctl start mission-controlmission-control.yourdomain.com {
reverse_proxy localhost:3000
}If you expose TenacitOS beyond localhost, put it behind HTTPS and a network boundary you control.
All personal data stays in .env.local (gitignored). The src/config/branding.ts file reads from env vars — never edit it directly with your personal data.
Agents are auto-discovered from openclaw.json at startup. The /api/agents endpoint reads:
{
"agents": {
"list": [
{ "id": "main", "name": "...", "workspace": "...", "model": {...} },
{ "id": "studio", "name": "...", "workspace": "..." }
]
}
}Each agent can define its own visual appearance in openclaw.json:
{
"id": "studio",
"name": "My Studio Agent",
"ui": {
"emoji": "🎬",
"color": "#E91E63"
}
}The 3D office has default positions for up to 6 agents. To customize positions, names, and colors for your own agents, edit src/components/Office3D/agentsConfig.ts:
export const AGENTS: AgentConfig[] = [
{
id: "main", // must match workspace ID
name: "...", // display name (can also come from API)
emoji: "🤖",
position: [0, 0, 0],
color: "#FFCC00",
role: "Main Agent",
},
// add your sub-agents here
];To add custom 3D avatars (Ready Player Me GLB format), place them in public/models/:
public/models/
├── main.glb ← main agent avatar
├── studio.glb ← workspace-studio agent
└── infra.glb ← workspace-infra agent
Filename must match the agent id. If no file is found, a colored sphere is shown as fallback.
See public/models/README.md for full instructions.
Usage is collected from OpenClaw's SQLite databases via a script:
# Collect once
npx tsx scripts/collect-usage.ts
# Auto-collect every hour (adds a cron job)
./scripts/setup-cron.shSee docs/COST-TRACKING.md for details.
mission-control/
├── src/
│ ├── app/
│ │ ├── (dashboard)/ # Dashboard pages
│ │ ├── api/ # API routes
│ │ ├── login/ # Legacy redirect to the dashboard root
│ │ └── office/ # 3D office route
│ ├── components/
│ │ ├── TenacitOS/ # OS-style UI shell (topbar, dock, status bar)
│ │ └── Office3D/ # React Three Fiber 3D office
│ ├── config/
│ │ └── branding.ts # Branding constants (reads from env vars)
│ └── lib/ # Utilities (pricing, queries, activity logger...)
├── data/ # JSON data files (gitignored — use .example versions)
├── docs/ # Extended documentation
├── public/
│ └── models/ # GLB avatar models (add your own)
├── scripts/ # Setup and data collection scripts
├── .env.example # Environment variable template
└── README.md # Project overview and setup
- TenacitOS does not include built-in dashboard authentication. Restrict access with your reverse proxy, VPN, firewall, or private network.
- Keep OpenClaw Gateway on loopback or protect it with
OPENCLAW_GATEWAY_TOKENwhen exposed outside localhost. - Terminal API uses a strict command allowlist —
env,curl,wget,node, andpythonare blocked. - Never commit
.env.local— it contains your local paths, tokens, and branding values.
"Gateway not reachable" / agent data missing
openclaw status
openclaw gateway start # if not running"Database not found" (cost tracking)
npx tsx scripts/collect-usage.tsBuild errors after pulling updates
rm -rf .next node_modules
npm install
npm run buildScripts not executable
chmod +x scripts/*.sh| Layer | Tech |
|---|---|
| Framework | Next.js 15 (App Router) |
| UI | React 19 + Tailwind CSS v4 |
| 3D | React Three Fiber + Drei |
| Charts | Recharts |
| Icons | Lucide React |
| Database | SQLite (better-sqlite3) |
| Runtime | Node.js 22 |
- Fork the repo
- Create a feature branch (
git checkout -b feat/my-feature) - Keep personal data out of commits — use
.env.localanddata/(both gitignored) - Write clear commit messages
- Open a PR
See CONTRIBUTING.md for more details.
MIT — see LICENSE
- OpenClaw — the AI agent runtime this dashboard is built for
- OpenClaw Docs
- Discord Community
- GitHub Issues — bug reports and feature requests




