
🔐 Panel de monitoreo seguro y en tiempo real para agentes de OpenClaw AI. Autenticación, TOTP MFA, seguimiento de costos, feed en vivo, explorador de memoria y más.
Un hermoso, seguro y en tiempo real panel de monitoreo para agentes OpenClaw. Sigue sesiones, monitorea el uso de API, visualiza costos, administra archivos de memoria y mantente al tanto de la salud del sistema, todo en un solo lugar.

| Vista General | Sesiones | Costos |
|---|---|---|
![]() | ![]() | ![]() |
| Límites de Tasa | Feed en Vivo | Registros |
|---|---|---|
![]() | ![]() | ![]() |
git clone https://github.com/tugcantopaloglu/openclaw-dashboard.git cd openclaw-dashboard
export WORKSPACE_DIR=/path/to/your/openclaw/workspace
node server.js
Visit `http://localhost:7000` en tu navegador. En la primera visita, verás una **pantalla de registro** donde crearás tu nombre de usuario y contraseña. Después del registro, inicia sesión con tus credenciales.
## 📦 Instalación
### Requisitos previos
- **Node.js** v18 o superior (verifica con `node --version`)
- **OpenClaw** instalado y ejecutándose
- **Systemd** (opcional, para instalación como servicio en Linux)
#### Dependencias opcionales
| Herramienta | Requerido para | Instalar |
|------|-------------|---------|
| `jq` | Página de gestión de Docker | `sudo apt install jq` |
| `tmux` | Scraper de uso de Claude CLI | `sudo apt install tmux` |
| `python3` | Analizador de uso de Claude CLI | Generalmente preinstalado |
| `docker` | Página de gestión de Docker | [docs.docker.com](https://docs.docker.com/engine/install/) |
### Instalación manual
1. **Clona el repositorio** ```bash
git clone https://github.com/tugcantopaloglu/openclaw-dashboard.git
cd openclaw-dashboard
El servidor imprimirá: ``` 🚀 Dashboard running on http://localhost:7000 🔑 Recovery token: abc123def456...
**Guarda el token de recuperación** — lo necesitarás si olvidas tu contraseña.
4. **Accede al panel**
Abre `http://localhost:7000` y registra tu cuenta.
### Servicio Systemd (install.sh)
Para ejecutar el panel como un servicio del sistema con inicio automático y recuperación ante fallos:```bash
sudo ./install.sh
Esto hará:
/etc/systemd/system/agent-dashboard.service/etc/systemd/system/agent-dashboard.service.d/override.confVer registros:```bash journalctl -u agent-dashboard -f
### Docker```bash
# Build
docker build -t openclaw-dashboard .
# Run
docker run -d \
--name openclaw-dashboard \
-p 3001:3001 \
-e WORKSPACE_DIR=/app/workspace \
-e DASHBOARD_ALLOW_HTTP=true \
-v ~/.openclaw:/home/node/.openclaw:ro \
-v ~/.openclaw/workspace:/app/workspace \
openclaw-dashboard
Para el acceso a la página de gestión de Docker, pasa el socket de Docker:```bash
docker run -d
--name openclaw-dashboard
-p 3001:3001
-e WORKSPACE_DIR=/app/workspace
-e DASHBOARD_ALLOW_HTTP=true
-v ~/.openclaw:/home/node/.openclaw:ro
-v ~/.openclaw/workspace:/app/workspace
-v /var/run/docker.sock:/var/run/docker.sock:ro
--group-add $(stat -c '%g' /var/run/docker.sock)
openclaw-dashboard
### Variables de Entorno
| Variable | Descripción | Predeterminado |
|----------|-------------|---------|
| `DASHBOARD_PORT` | Puerto del servidor | `7000` |
| `DASHBOARD_TOKEN` | Token de recuperación para restablecer contraseña | Generado automáticamente al inicio |
| `WORKSPACE_DIR` | Ruta del espacio de trabajo de OpenClaw | `$OPENCLAW_WORKSPACE` o directorio actual |
| `OPENCLAW_DIR` | Directorio de configuración de OpenClaw | `~/.openclaw` |
| `OPENCLAW_AGENT` | ID del agente a monitorear | `main` |
| `DASHBOARD_ALLOW_HTTP` | Permitir HTTP desde IPs no locales | `false` |
**Ejemplos:**```bash
# Custom port
DASHBOARD_PORT=8080 node server.js
# Custom recovery token
DASHBOARD_TOKEN=my_secret_token_12345 node server.js
# Different workspace
WORKSPACE_DIR=/mnt/data/openclaw node server.js
El panel utiliza autenticación por nombre de usuario y contraseña con sesiones seguras del lado del servidor.
http://localhost:7000)localStorage)sessionStorage)Para prevenir ataques de fuerza bruta:
Agregue una capa adicional de seguridad con contraseñas de un solo uso basadas en tiempo (TOTP).
Una vez habilitado, cada inicio de sesión requiere:
Si pierde el acceso a su aplicación de autenticación (teléfono perdido, aplicación desinstalada, etc.):
Importante: Ajusta la ruta /root/clawd/data/credentials.json si tu espacio de trabajo está en otro lugar.
Si olvidas tu contraseña:
El token de recuperación (DASHBOARD_TOKEN) se imprime cuando se inicia el servidor. Puedes encontrarlo en varios lugares:
journalctl -u agent-dashboard | grep "Recovery token"
Salida:```
🔑 Recovery token: 3e6b91f352418b486a9aa9d82fbbc1b1
cat /etc/systemd/system/agent-dashboard.service.d/override.conf
Buscar:```ini
Environment=DASHBOARD_TOKEN=3e6b91f352418b486a9aa9d82fbbc1b1
Si la configuraste manualmente:```bash echo $DASHBOARD_TOKEN
### Cambiando tu Contraseña
Para cambiar tu contraseña mientras estás conectado:
1. Ve a la página de **Seguridad**
2. Ingresa tu **contraseña actual**
3. Ingresa tu **nueva contraseña**
4. Haz clic en **"Cambiar Contraseña"**
5. Todas las demás sesiones se invalidan (tendrás que iniciar sesión nuevamente en otros lugares)
### Restablecimiento Completo de la Cuenta (Opción Nuclear)
Si todo está bloqueado y no puedes iniciar sesión:
1. **Conéctate por SSH a tu servidor**
2. **Elimina el archivo de credenciales**: ```bash
rm /root/clawd/data/credentials.json
Advertencia: Esto elimina tu nombre de usuario, contraseña y configuración de MFA. Los archivos de memoria y los registros de auditoría no se ven afectados.
El panel está construido con las mejores prácticas de seguridad:
data/audit.log*).bak creados antes de sobrescribir archivos del espacio de trabajoEl panel está diseñado para acceso local o a través de Tailscale:
http://localhost:7000http://100.x.x.x:7000
DASHBOARD_ALLOW_HTTP=true)Por defecto, el panel bloquea el acceso HTTP desde IPs no locales. Exenciones:
Para otras redes, el panel requiere HTTPS o el encabezado X-Forwarded-Proto: https (desde un proxy inverso).
Para permitir HTTP desde todas las IPs (no recomendado):```bash DASHBOARD_ALLOW_HTTP=true node server.js
### No exponer a Internet pública
**Este panel NO está endurecido para exposición a Internet pública.** Si bien tiene autenticación y limitación de tasa, está diseñado para redes privadas. Si debe exponerlo:
- Use un proxy inverso (nginx, Caddy) con HTTPS
- Agregue lista blanca de IP
- Considere VPN (Tailscale, WireGuard) en su lugar
## 🛠️ Solución de problemas
### "Demasiados intentos fallidos"
**Problema:** Ve "Demasiados intentos fallidos de inicio de sesión. Intente nuevamente más tarde."
**Soluciones:**
- Espere **15 minutos** a que expire el bloqueo suave
- Reinicie el servicio para borrar los límites de tasa: ```bash
systemctl restart agent-dashboard
Problema: Se cambió su contraseña pero no puede iniciar sesión.
Solución: Use el flujo "¿Olvidó su contraseña?" con su token de recuperación para establecer una nueva contraseña.
Problema: El código TOTP de 6 dígitos es rechazado.
Soluciones:
Problema: El navegador muestra una página en blanco o error de conexión.
Soluciones:
Debería devolver: ```json {"authenticated": false, "requiresRegistration": false}
### Error de "HTTPS requerido"
**Problema:** El navegador muestra "Se requiere HTTPS. Acceda a través de localhost, Tailscale o habilite HTTPS."
**Soluciones:**
- Acceda a través de **localhost**: `http://localhost:7000`
- Acceda a través de **Tailscale**: `http://100.x.x.x:7000`
- Configure `DASHBOARD_ALLOW_HTTP=true` en el entorno (no recomendado): ```bash
# Add to /etc/systemd/system/agent-dashboard.service.d/override.conf
Environment=DASHBOARD_ALLOW_HTTP=true
# Reload and restart
systemctl daemon-reload
systemctl restart agent-dashboard
Problema: El dashboard muestra una página en blanco después de actualizar el código.
Soluciones:
Ctrl+Shift+R (Windows/Linux) o Cmd+Shift+R (macOS)El dashboard expone una API REST para acceso programático. Todos los endpoints requieren autenticación mediante el encabezado Authorization: Bearer <sessionToken>.
GET /api/auth/status — Verificar estado de autenticaciónPOST /api/auth/login — Iniciar sesión con usuario/contraseña (+ TOTP si MFA está habilitado)POST /api/auth/register — Registrar una nueva cuenta (solo si no existen credenciales)POST /api/auth/reset-password — Restablecer contraseña con token de recuperaciónTodos los demás endpoints requieren autenticación:
GET /api/config — Configuración del dashboardGET /api/sessions — Listar todas las sesiones de agentesGET /api/usage — Datos de uso de ventana móvil de 5 horasGET /api/costs — Datos de gasto por día, modelo y sesiónGET /api/system — Métricas de salud del sistemaGET /api/memory-files — Listar archivos de memoriaGET /api/memory-file?path=<path> — Leer un archivo de memoriaGET /api/key-files — Listar archivos del workspace (skills, configs)GET /api/key-file?path=<name> — Leer un archivo del workspacePOST /api/key-file — Escribir en un archivo del workspace (con respaldo)GET /api/crons — Listar trabajos cronPOST /api/cron/<id>/toggle — Habilitar/deshabilitar un trabajo cronPara ejemplos detallados de solicitud/respuesta, consulta la versión anterior de este README o explora la API en la pestaña Red del navegador.
El dashboard almacena datos en tu directorio de workspace:
Estructura del archivo de credenciales:```json { "username": "admin", "passwordHash": "pbkdf2_sha512$100000$...", "salt": "...", "mfaSecret": "BASE32SECRET..." // Only if MFA enabled }
## 🔗 Integración con OpenClaw
El panel detecta automáticamente:
- **Sesiones** de `$OPENCLAW_DIR/agents/$AGENT_ID/sessions/`
- **Tareas cron** de `$OPENCLAW_DIR/cron/jobs.json`
- **Archivos de memoria** de `$WORKSPACE_DIR/MEMORY.md`, `HEARTBEAT.md` y `memory/*.md`
- **Repositorios Git** de `$WORKSPACE_DIR/projects/*/`
- **Datos de salud** guardados en `$WORKSPACE_DIR/data/health-history.json`
### Archivos Requeridos
El panel funciona mejor cuando estos archivos existen:
- `$WORKSPACE_DIR/MEMORY.md` - Memoria a largo plazo del agente
- `$WORKSPACE_DIR/HEARTBEAT.md` - Lista de tareas de heartbeat
- `$WORKSPACE_DIR/memory/YYYY-MM-DD.md` - Notas de memoria diarias
- `$WORKSPACE_DIR/scripts/scrape-claude-usage.sh` - Scraper de uso de Claude
- `$WORKSPACE_DIR/scripts/parse-claude-usage.py` - Analizador de uso de Claude
- `$WORKSPACE_DIR/scripts/scrape-gemini-usage.sh` - Scraper de uso de Gemini
- `$WORKSPACE_DIR/scripts/parse-gemini-usage.py` - Analizador de uso de Gemini
## ⌨️ Atajos de Teclado
| Tecla | Acción |
|-------|--------|
| `1` | Cambiar a Vista General |
| `2` | Cambiar a Sesiones |
| `3` | Cambiar a Costos |
| `4` | Cambiar a Límites de Tasa |
| `5` | Cambiar a Memoria |
| `6` | Cambiar a Archivos |
| `7` | Cambiar a Fuente en Vivo |
| `8` | Cambiar a Registros |
| `9` | Cambiar a Seguridad |
| `Espacio` | Pausar/Reanudar Fuente (cuando esté en la página de Fuente en Vivo) |
| `/` | Enfocar cuadro de búsqueda |
| `Esc` | Cerrar modales y superposiciones |
| `?` | Mostrar ayuda de atajos de teclado |
## 🤝 Contribuciones
¡Las contribuciones son bienvenidas! Por favor, siga estas pautas:
1. **Haz un fork** del repositorio
2. **Crea** una rama de funcionalidad (`git checkout -b feature/amazing-feature`)
3. **Haz commit** de tus cambios (`git commit -m 'Añadir funcionalidad increíble'`)
4. **Sube** los cambios a la rama (`git push origin feature/amazing-feature`)
5. **Abre** una Pull Request
### Configuración de Desarrollo```bash
git clone https://github.com/tugcantopaloglu/openclaw-dashboard.git
cd openclaw-dashboard
export WORKSPACE_DIR=/path/to/test/workspace
node server.js
El panel no tiene paso de compilación — edita server.js o index.html y recarga.
Licencia MIT - consulta el archivo LICENSE para más detalles.
Hecho con ✨ por Tuğcan Topaloğlu
jq (página Docker), tmux + python3 (recolector de uso de Claude CLI), docker (gestión Docker)POST /api/cron/<id>/run — Ejecutar manualmente un trabajo cronGET /api/logs?service=<service>&lines=<N> — Obtener registros del sistemaPOST /api/action/<action> — Ejecutar acciones rápidas (restart-openclaw, restart-dashboard, etc.)POST /api/claude-usage-scrape — Disparar extracción de uso de ClaudeGET /api/claude-usage — Obtener último uso extraído de ClaudePOST /api/gemini-usage-scrape — Disparar extracción de uso de GeminiGET /api/gemini-usage — Obtener último uso extraído de GeminiGET /api/live — Flujo de eventos enviados por el servidor (Server-Sent Events) de mensajes en tiempo realGET /api/notifications?limit=<N> — Eventos del registro de auditoría para el centro de notificacionesPOST /api/reauth — Re-autenticar para páginas sensibles (Seguridad, Configuración)GET /api/openclaw-config — Leer archivo de configuración de OpenClawPUT /api/openclaw-config — Guardar configuración con respaldo automático y reinicio del gatewayGET /api/sys-security — Información de seguridad del sistema (UFW, puertos, fail2ban, registros SSH)GET /api/docker — Listar contenedores Docker, imágenes y uso del sistemaPOST /api/docker/action — Acciones de Docker (iniciar/detener/reiniciar contenedor, limpiar)GET /api/services — Listar servicios systemdPOST /api/services/action — Acciones de servicio (iniciar/detener/reiniciar, solo los permitidos)| Archivo | Propósito |
|---|
data/credentials.json | Nombre de usuario + contraseña hasheada + secreto MFA |
data/audit.log | Registro de auditoría de seguridad (rotación automática a 10MB) |
data/health-history.json | Historial de CPU/RAM/Temp/Disco para sparklines |
data/claude-usage.json | Últimos datos de uso extraídos de Claude |
data/gemini-usage.json | Últimos datos de uso extraídos de Gemini |