Add clidash — a zero-dependency, read-only web dashboard that derives its tabs and tables at runtime from any CLI that lists resources as JSON. Ships pre-wired for NanoClaw's ncl CLI (agent groups, sessions, channels, users, roles), plus message-activity charts, a log tail, and a read-only file viewer for group skills/CLAUDE.md/profiles.
npx skills add https://github.com/nanocoai/nanoclaw --skill add-clidash
clidash is a small, read-only web dashboard. You point it at any CLI that can
list resources as JSON (NanoClaw's ncl, docker, kubectl, …) and it builds
the dashboard at runtime: one tab per resource, a generic table over whatever
columns the rows have. A new ncl resource becomes a new tab and a new column
becomes a new table column with zero code changes.
It ships pre-wired for NanoClaw's ncl CLI and adds three NanoClaw-aware
panels driven entirely by config:
groups + wirings (green <15m / amber <2h / red older).
read directly from the session DBs (ncl has no messages resource).
CLAUDE.md, and profiles.clidash is read-only by construction: the server can only execFile the
argv templates in its config. {resource} is the sole substitution and is
allowlist-validated against the discovered/static resource set before exec —
never a shell, no free-form input reaches argv. There is no auth; **the network
is the auth boundary** — it binds 127.0.0.1 by default. Only ever bind a
private interface (e.g. a tailnet IP), never a public one.
It's distinct from /add-dashboard (which pushes JSON snapshots to a separate
@nanoco/nanoclaw-dashboard npm package): clidash has zero dependencies, no
build step, no push pipeline, and no edits to NanoClaw source — it just reads
ncl and the session DBs.
clidash is fully self-contained — copy the whole directory in:
tools/ is not a standard NanoClaw directory and cp -R won't create it, so
make it first:
mkdir -p tools
cp -R .claude/skills/add-clidash/add/tools/clidash tools/clidash
That is the only file change this skill makes. Nothing in NanoClaw src/ is
touched, no dependency is added.
The example config is pre-wired for NanoClaw with paths relative to the repo
root, so it works as-is when you run clidash from tools/clidash/:
cd tools/clidash
cp clidash.config.example.json clidash.config.json
clidash.config.json is your local config — add it to .gitignore if you
don't want to commit install-specific paths:
echo 'tools/clidash/clidash.config.json' >> ../../.gitignore
The example assumes ncl is built at bin/ncl. If bin/ncl doesn't exist,
build it first (pnpm run build) or point clis.ncl.bin at the right path.
Tests use a stub CLI — no real ncl or docker needed:
npm test
All tests should pass (Node ≥ 22.5, node:test, zero dependencies).
node server.js # serves http://127.0.0.1:4690
In another shell, confirm it's live and that ncl discovery worked:
curl -s http://127.0.0.1:4690/api/clis | head -c 400 # CLIs + discovered resources
curl -s http://127.0.0.1:4690/api/r/ncl/groups | head -c 400 # a real resource table
Then open http://127.0.0.1:4690/ in a browser. You should see the Agents
overview plus a tab per ncl resource.
clidash binds 127.0.0.1 by default. To reach it from other devices, bind a
private (e.g. tailnet) IP via the BIND env var or bind in config — never a
public interface.
# ~/.config/systemd/user/clidash.service (Linux)
[Unit]
Description=clidash read-only CLI dashboard
[Service]
WorkingDirectory=%h/nanoclaw/tools/clidash
ExecStart=/usr/bin/node %h/nanoclaw/tools/clidash/server.js
Environment=BIND=127.0.0.1
Restart=on-failure
[Install]
WantedBy=default.target
systemctl --user enable --now clidash
On macOS, wrap node server.js (with WorkingDirectory = tools/clidash) in a
launchd plist the same way the main NanoClaw service is configured.
clidash.config.json keys (see tools/clidash/README.md and
clidash.config.example.json for the full shape):
| Key | Purpose |
|-----|---------|
| port, bind, refreshSeconds | server bind + UI auto-refresh cadence |
| clis.<name>.bin / cwd / env | how to invoke the CLI (bin is relative to cwd) |
| clis.<name>.discover or resources | runtime discovery (ncl help) vs a static resource list |
| clis.<name>.list | argv template; {resource} is the only substitution |
| clis.<name>.output | json or jsonlines (docker/kubectl style) |
| clis.<name>.unwrap | dot-path into a response envelope (e.g. data) |
| clis.<name>.enrich/badges/summary | table decorations (ID→name joins, status colors, summary cards) |
| activity | sessionsRoot + days for the message-activity charts |
| logs | dir, tailLines, and an allowlist of files to tail |
| docs | file viewer: root, a deny glob list, and collections of glob patterns |
Adding a second CLI is config-only — e.g. docker is included as a jsonlines
example. View plugins (views/<cli>-<view>.js) are the only per-CLI code and
are optional.
ENOENT / config not found — run from tools/clidash/ and make sure youcopied clidash.config.example.json to clidash.config.json (step 2), or set
CLIDASH_CONFIG=/abs/path.json.
ncl resources / discovery empty — bin/ncl isn't built or the pathis wrong. Build it (pnpm run build) or fix clis.ncl.bin.
docker CLI from config if you don't need it.
127.0.0.1; setBIND=<private-ip> (tailnet), never a public interface.
activity.sessionsRoot,logs.dir, and docs.root resolve to your NanoClaw root (relative to where
you launch node server.js).
See REMOVE.md.
Creating interactive data visualisations using d3.js. This skill should be used when creating custom charts, graphs, network diagrams, geographic visualisations, or any complex SVG-based data visualisation that requires fine-grained control over visual elements, transitions, or interactions. Use this for bespoke visualisations beyond standard charting libraries, whether in React, Vue, Svelte, vanilla JavaScript, or any other environment.
Comprehensive Python library for astronomy and astrophysics. This skill should be used when working with astronomical data including celestial coordinates, physical units, FITS files, cosmological calculations, time systems, tables, world coordinate systems (WCS), and astronomical data analysis. Use when tasks involve coordinate transformations, unit conversions, FITS file manipulation, cosmological distance calculations, time scale conversions, or astronomical data processing.
Convert laboratory instrument output files (PDF, CSV, Excel, TXT) to Allotrope Simple Model (ASM) JSON format or flattened 2D CSV. Use this skill when scientists need to standardize instrument data for LIMS systems, data lakes, or downstream analysis. Supports auto-detection of instrument types. Outputs include full ASM JSON, flattened CSV for easy import, and exportable Python code for data engineers. Common triggers include converting instrument files, standardizing lab data, preparing data for upload to LIMS/ELN systems, or generating parser code for production pipelines.
Quantum mechanics simulations and analysis using QuTiP (Quantum Toolbox in Python). Use when working with quantum systems including: (1) quantum states (kets, bras, density matrices), (2) quantum operators and gates, (3) time evolution and dynamics (Schrödinger, master equations, Monte Carlo), (4) open quantum systems with dissipation, (5) quantum measurements and entanglement, (6) visualization (Bloch sphere, Wigner functions), (7) steady states and correlation functions, or (8) advanced methods (Floquet theory, HEOM, stochastic solvers). Handles both closed and open quantum systems across various domains including quantum optics, quantum computing, and condensed matter physics.
Retrieve and display GitHub Copilot usage metrics for organizations and enterprises using the GitHub CLI and REST API.
Socratic mentoring for junior developers and AI newcomers. Guides through questions, never answers. Triggers: "help me understand", "explain this code", "I''m stuck", "Im stuck", "I''m confused", "Im confused", "I don''t understand", "I dont understand", "can you teach me", "teach me", "mentor me", "guide me", "what does this error mean", "why doesn''t this work", "why does not this work", "I''m a beginner", "Im a beginner", "I''m learning", "Im learning", "I''m new to this", "Im new to this", "walk me through", "how does this work", "what''s wrong with my code", "what''s wrong", "can you break this down", "ELI5", "step by step", "where do I start", "what am I missing", "newbie here", "junior dev", "first time using", "how do I", "what is", "is this right", "not sure", "need help", "struggling", "show me", "help me debug", "best practice", "too complex", "overwhelmed", "lost", "debug this", "/socratic", "/hint", "/concept", "/pseudocode". Progressive clue systems, teaching techniques, and success metrics.
Core Python library for astronomy and astrophysics workflows that need Astropy APIs, including units/quantities, coordinates, FITS I/O, tables, time systems, WCS, and cosmology. Use when implementing or debugging astronomical data analysis code with Astropy.
High-performance DataFrame library for Python ETL, analytics, and pandas migration. Use for expression-based data manipulation with lazy query optimization, parallel execution, streaming out-of-core processing, Arrow interoperability, and optional GPU execution.
Take nanocoai/add-clidash from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.