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
- π Auth β Password-protected with rate limiting and secure cookie
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:
/root/.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 /root/.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:
# --- Auth (required) ---
# Strong password to log in to the dashboard
ADMIN_PASSWORD=your-secure-password-here
# Random secret used to sign the auth cookie
# Generate with: openssl rand -base64 32
AUTH_SECRET=your-random-32-char-secret-here
# --- OpenClaw paths (optional β defaults work for standard installs) ---
# OPENCLAW_DIR=/root/.openclaw
# --- 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/root/.openclaw. If your OpenClaw is installed elsewhere, set this variable.
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# Auth secret
openssl rand -base64 32
# Password (or use a password manager)
openssl rand -base64 18# Development
npm run dev
# β http://localhost:3000
# Production build
npm run build
npm startLogin at http://localhost:3000 with the ADMIN_PASSWORD you set.
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=/root/.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
}When behind HTTPS,
secure: trueis set automatically on the auth cookie.
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 (protected)
β β βββ api/ # API routes
β β βββ login/ # Login page
β β βββ office/ # 3D office (unprotected 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
βββ middleware.ts # Auth guard for all routes
- All routes (including all
/api/*) require authentication β handled bysrc/middleware.ts /api/auth/loginand/api/healthare the only public endpoints- Login is rate-limited: 5 failed attempts β 15-minute lockout per IP
- Auth cookie is
httpOnly,sameSite: lax, andsecurein production - Terminal API uses a strict command allowlist β
env,curl,wget,node,pythonare blocked - Never commit
.env.localβ it contains your credentials
Generate fresh secrets:
openssl rand -base64 32 # AUTH_SECRET
openssl rand -base64 18 # ADMIN_PASSWORD"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




