Install
openclaw skills install opencron-skill-repoVisual cron job dashboard for OpenClaw — live countdown timers, run history, calendar view
openclaw skills install opencron-skill-repoA visual dashboard for your OpenClaw cron jobs. See job statuses at a glance, track run history with outputs, and view scheduled runs on a calendar.
prefers-reduced-motion supportpython3 skills/opencron/update_canvas.py
This fetches cron-dashboard.html from github.com/firstfloris/opencron and writes live cron-data.json.
nohup sh skills/opencron/watch_sync.sh &
Keeps cron-data.json in sync with jobs.json every 30 seconds.
The dashboard is served via the nginx proxy on port ${CANVAS_PORT:-8090} — NOT the gateway port.
Get the server's public IP (not the container's internal IP):
HOST_IP=$(curl -s ifconfig.me)
Dashboard URL:
http://${HOST_IP}:${CANVAS_PORT:-8090}/cron.html?token=${OPENCLAW_GATEWAY_TOKEN}
Important: Never use hostname -I — that returns the container's internal IP which is unreachable from outside.
| Script | What it does | Example |
|---|---|---|
update_canvas.py | One-shot deploy: fetches HTML from GitHub + writes JSON to canvas | python3 skills/opencron/update_canvas.py |
watch_sync.sh | Background sync loop (30s interval) | nohup sh skills/opencron/watch_sync.sh & |
generate.py | Generate standalone HTML with embedded data | python3 skills/opencron/generate.py -o dashboard.html |
serve.py | Run a local HTTP server for the dashboard | python3 skills/opencron/serve.py --port 8787 |
To access the dashboard from outside Docker, add an nginx reverse proxy. See nginx-canvas.conf.template for a production-ready config with:
/runs/canvas-proxy:
image: nginx:alpine
restart: unless-stopped
environment:
OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN}
volumes:
- ./nginx-canvas.conf.template:/etc/nginx/templates/default.conf.template:ro
- ./cron/runs:/openclaw-data/cron/runs:ro
ports:
- "127.0.0.1:${CANVAS_PORT:-8090}:80"
depends_on:
openclaw-gateway:
condition: service_healthy
/home/node/.openclaw/cron/jobs.json (read by gateway as cron-data.json)/home/node/.openclaw/cron/runs/<job-id>.jsonl (NDJSON, one entry per run)When a cron job finishes executing, always show the user the OpenCron dashboard link. Get the public IP via:
HOST_IP=$(curl -s ifconfig.me)
Then show:
See cron status on OpenCron: http://${HOST_IP}:${CANVAS_PORT:-8090}/cron.html?token=${OPENCLAW_GATEWAY_TOKEN}
Rules:
${CANVAS_PORT:-8090} (nginx proxy) — never the gateway port (18789)curl -s ifconfig.me for the IP — never hostname -I (that's the container's internal IP)Open demo.html in any browser for a fully working demo with mock data — no server required.