The Dashboard Skill for OpenClaw
Stop configuring dashboards. Just tell OpenClaw what you want to see.
Glance is a free and open source dashboard that OpenClaw builds and manages for you. Not another app to configure β a skill that gives OpenClaw a visual command center.
Tell OpenClaw "show me my GitHub PRs" and watch it build the widget. Ask "what needs my attention?" and OpenClaw reads your dashboard and tells you. No manual setup. No YAML files. No .env hell.
If you're an AI agent (OpenClaw, Cursor, Claude, etc.), read these files:
| File | Purpose |
|---|---|
| SKILL.md | Quick reference (~200 lines) β API workflow, code patterns, essential info |
| docs/widget-sdk.md | Full documentation β components, hooks, examples, error handling |
TL;DR workflow:
POST /api/credentialsβ Store API keys (provider, name, value)POST /api/widgetsβ Create widget definition (source_code, server_code)POST /api/widgets/instancesβ Add widget instance to dashboard
curl -fsSL https://openglance.dev/install.sh | bashThis will:
- Clone the repository to
~/.glance - Install dependencies via pnpm
- Offer to install as a background service (launchd on macOS, systemd on Linux)
- Open the dashboard in your browser
git clone https://github.com/acfranzen/glance.git && cd glance && docker compose upgit clone https://github.com/acfranzen/glance.git
cd glance
npm install
npm run devOpen http://localhost:3333.
Note: On first run, Glance auto-generates a secure encryption key. Your data is stored locally in
./data/glance.db.
Keep Glance running 24/7 without keeping a terminal open.
cd ~/.glance # or your Glance directory
./scripts/install-launchd.shBenefits:
- β Starts automatically on login
- β Restarts on crash
- β
Logs to
~/Library/Logs/glance/ - β Survives terminal closes
Commands:
# Stop service
launchctl unload ~/Library/LaunchAgents/com.glance.dashboard.plist
# Start service
launchctl load ~/Library/LaunchAgents/com.glance.dashboard.plist
# View logs
tail -f ~/Library/Logs/glance/glance.log
# Uninstall service
./scripts/uninstall-launchd.shcd ~/.glance # or your Glance directory
./scripts/install-systemd.shBenefits:
- β Starts automatically on login
- β Restarts on crash
- β Integrates with journald
- β Survives terminal closes
Commands:
# Stop service
systemctl --user stop glance
# Start service
systemctl --user start glance
# View logs
journalctl --user -u glance -f
# Service status
systemctl --user status glance
# Uninstall service
./scripts/uninstall-systemd.shAdd to your OpenClaw workspace (TOOLS.md or memory):
### Glance Dashboard
- URL: http://localhost:3333
- Auth: Bearer <your-token>
- API: POST /api/widgets to create widget definitions
- API: POST /api/widgets/instances to add widgets to dashboard
- API: POST /api/credentials to store API keysFor agent_refresh widgets, Glance can ping OpenClaw immediately when a user clicks refresh (instead of waiting for heartbeat polls).
Add to your .env.local:
OPENCLAW_WEBHOOK_URL=http://localhost:18789/tools/invoke
OPENCLAW_WEBHOOK_TOKEN=your-openclaw-tokenWhen configured, clicking refresh on any agent_refresh widget will instantly wake OpenClaw to process the request. If the webhook fails, the request still queues normally for the next heartbeat.
You: "OpenClaw, add a widget showing my GitHub PRs"
OpenClaw: *creates the widget, stores your GitHub token, adds it to the dashboard*
You: "What needs my attention?"
OpenClaw: "You have 3 PRs waiting for review. One has failing CI."
That's it. OpenClaw handles the rest.
You: "Add a widget showing my Claude Max usage"
OpenClaw: *creates the widget, wires up the PTY capture, adds it to your dashboard*
No templates to browse. No documentation to read. Just describe what you want.
You: "What's on my dashboard?"
OpenClaw: "You have 3 open PRs that need review, your Claude usage is at 72%,
and the weather looks good for that outdoor meeting at 2pm."
OpenClaw interprets your widgets and surfaces what matters. You don't even need to look at the dashboard β OpenClaw does it for you.
Here's the magic: OpenClaw already knows your API keys. Your GitHub token, Anthropic key, Vercel token β they're already in OpenClaw's memory.
When you ask for a GitHub widget, OpenClaw doesn't ask you to configure anything. It just stores your existing credentials in Glance's encrypted database and wires everything up.
No .env files. No copy-pasting tokens. No configuration circus. It just works.
"OpenClaw, create a weather widget for NYC"
"Show me my open PRs across all repos"
"Add a widget tracking my Anthropic API spend"
"What's the status of my dashboard?"
"Move the GitHub widget to the top right"
"Delete the clock widget, I don't need it"
"Import this widget: !GW1!eJyrVkrOz..."
Export any widget as a shareable string and import widgets others have shared:
You: "Export my Claude usage widget"
OpenClaw: *generates a !GW1!... package string*
"Here's your widget package. Share this string and anyone can import it."
You: "Import this widget: !GW1!eJyrVkrOz0nVUbJS..."
OpenClaw: *validates, checks credentials, imports*
"Done! The widget needs a GitHub token. Want me to set that up?"
- π€ 100% OpenClaw-Managed β OpenClaw builds, updates, and interprets widgets
- π¬ Natural Language Widgets β Describe what you want, get a working widget
- π¦ Widget Package Sharing β Share widgets via compressed strings (WeakAuras-style)
- π Encrypted Credential Store β No
.envfiles, no plaintext secrets - π Local-First β Runs on your machine, your data stays yours
- π¨ Drag & Drop β Rearrange and resize widgets freely
- π Dark Mode β Beautiful light and dark themes
- β‘ Fast β Next.js 16 + Turbopack
- β° Clock β Time and date
- π€οΈ Weather β Real-time conditions
- π Quick Notes β Persistent notes
- π Bookmarks β Quick links
- π Claude Max Usage β Track your API consumption
- π GitHub PRs β Open pull requests across repos
- π§ Email Summary β Unread count and priorities
- π Calendar Glance β Today's schedule
- ...whatever you can describe
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/widgets |
Create widget definition |
GET |
/api/widgets |
List all widget definitions |
GET |
/api/widgets/:slug |
Get widget definition |
PATCH |
/api/widgets/:slug |
Update widget definition |
DELETE |
/api/widgets/:slug |
Delete widget definition |
POST |
/api/widgets/:slug/execute |
Execute server code |
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/credentials |
Store a credential (encrypted) |
GET |
/api/credentials |
List credentials + status |
GET |
/api/credentials/:id |
Get credential metadata |
DELETE |
/api/credentials/:id |
Delete a credential |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/widgets/instances |
List widgets on dashboard |
POST |
/api/widgets/instances |
Add widget to dashboard |
PATCH |
/api/widgets/instances/:id |
Update widget instance |
DELETE |
/api/widgets/instances/:id |
Remove widget from dashboard |
GET |
/api/layout |
Get layout and theme |
PUT |
/api/layout |
Save layout/theme |
GET |
/api/snapshot |
Dashboard snapshot for AI |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/widgets/:slug/export |
Export widget as package string |
POST |
/api/widgets/import |
Import widget from package string |
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/widgets/proxy |
Proxy API calls with credentials |
POST |
/api/widgets/:slug/refresh |
Request data refresh (webhook/agent) |
GET |
/api/widgets/:slug/cache |
Get cached widget data |
OpenClaw can use these components when creating widgets:
Card, Badge, Progress, Stat, List, Avatar, Button, Input, Switch, Tabs, Tooltip, Separator
π Full Widget SDK Documentation β
Your dashboard shows sensitive data β API usage, emails, calendar, code activity. That data shouldn't live on someone else's server.
Glance runs entirely on your machine:
- SQLite database β Everything stored locally
- No cloud sync β Your data never leaves your device
- No accounts β No sign-ups, no telemetry, no tracking
- Full control β Export, backup, or delete anytime
Glance runs locally, but you can securely access it from anywhere using a private network or tunnel.
Tailscale creates a private network between your devices β no port forwarding, no configuration.
- Install Tailscale on your Glance server and your phone/laptop
- Start Glance with network binding:
npm run dev -- -H 0.0.0.0
- Access via Tailscale IP:
http://100.x.x.x:3333
Find your Tailscale IP with tailscale ip -4. Add it to your bookmarks and you're done.
Tip: Tailscale is free for personal use (up to 100 devices).
Cloudflare Tunnel exposes your dashboard via a custom domain with automatic HTTPS.
# Install cloudflared
brew install cloudflare/cloudflare/cloudflared
# Authenticate and create tunnel
cloudflared tunnel login
cloudflared tunnel create glance
# Run the tunnel
cloudflared tunnel route dns glance glance.yourdomain.com
cloudflared tunnel run --url http://localhost:3333 glanceAccess at https://glance.yourdomain.com. Cloudflare handles SSL and DDoS protection.
If you just need temporary access from another machine:
# On your laptop/remote machine
ssh -L 3333:localhost:3333 user@your-server
# Then open http://localhost:3333 in your browser- Always use AUTH_TOKEN when exposing Glance to a network:
AUTH_TOKEN=your-secret-token npm run dev -- -H 0.0.0.0
- Never expose port 3333 directly to the internet without authentication
- Tailscale and Cloudflare Tunnel both provide secure access without opening firewall ports
Glance is built for the OpenClaw community. Find more skills at clawhub.com.
Want to share widget ideas? Tweet at me @AlexFranzen, Glance Discord coming soon!
Want to improve Glance? Contributions welcome!
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
MIT License β see LICENSE for details.
Stop configuring dashboards. Just tell OpenClaw what you want to see.

