Agent skill

Dashboard

by LegoX in LegoX/Lego-RL

Bring up the Lego-RL training dashboard (webui/) on whatever machine you are on, adapting to that box's layout instead of assuming this repo's paths.

Apache-2.0Auto-check passedAI & LLM Engineering

Install Dashboard

skills CLI
$ npx skills add LegoX/Lego-RL --skill dashboard -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install LegoX/Lego-RL dashboard --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/LegoX/Lego-RL.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/plugins/rl-plugin/skills/dashboard .claude/skills/dashboard && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
dashboard
GitHub stars
108
Token cost
~4.2k tokens
SKILL.md length
2,112 words
Files
1
Skills in repo
11
Repo updated
First seen
Licence
Apache-2.0

At a glance

Bring up the Lego-RL training dashboard (webui/) on whatever machine you are on, adapting to that box's layout instead of assuming this repo's paths.

  • Works in 6 steps: Orient → Probe → The four decisions → …
  • Start the dashboard
  • SKILL.md covers Step 0 — Orient, Step 1 — Probe, Step 2 — The four decisions and Step 3 — Plan, then confirm…, plus 4 more sections
  • Calls cloudflared, bash and nvm

What it does

Dashboard is an agent skill from LegoX/Lego-RL. Bring up the Lego-RL training dashboard (webui/) on whatever machine you are on, adapting to that box's layout instead of assuming this repo's paths. Probes for the repo root, the directories that actually hold run logs, a free port, whether dist/ needs rebuilding and whether an instance is already serving, then proposes one concrete plan, waits for confirmation, and starts it in the background — optionally behind a Cloudflare quick tunnel. Also diagnoses a board that is up but showing nothing, and a run that…

Its SKILL.md is about 4.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in AI & LLM Engineering, covering Reinforcement learning. It works with Weights & Biases and Cloudflare. The repository describes itself as: Lego-RL: Harness-Native Reinforcement Learning for Coding Agents. The licence is Apache-2.0.

When your agent uses it

  • Start the dashboard
  • Deploy the webui
  • Put the board online
  • Bring the dashboard up

Example prompts

  • “s layout instead of assuming this repo”
  • “s instance. Triggers on”
  • “deploy the webui”
  • “/dashboard”

Requirements

  • Python 3

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. Orient
  2. Probe
  3. The four decisions
  4. Plan, then confirm (never skip)
  5. Start
  6. Report

What it can do on your machine

Read from SKILL.md and the folder at commit 7c30234. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • cloudflared
    • bash
    • nvm
    • curl
    • ssh
    • npm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use curl, ssh and npm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Dashboard loads about 4.2k tokens when it runs. Until then it costs about 238 tokens; SKILL.md has 2,112 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~238
When it runs · the whole SKILL.md, loaded when a task matches
~4.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from LegoX/Lego-RL at commit 7c30234, republished under its Apache-2.0 licence (© LegoX). 2,112 words, ~4,172 tokens.

Download SKILL.mdSave it as .claude/skills/dashboard/SKILL.md (or your agent's skills folder).
name
dashboard
description
Bring up the Lego-RL training dashboard (webui/) on whatever machine you are on, adapting to that box's layout instead of assuming this repo's paths. Probes for the repo root, the directories that actually hold run logs, a free port, whether dist/ needs rebuilding and whether an instance is already serving, then proposes one concrete plan, waits for confirmation, and starts it in the background — optionally behind a Cloudflare quick tunnel. Also diagnoses a board that is up but showing nothing, and a run that trains fine yet never appears because the config wrote its log outside the served directory. Never kills someone else's instance. Triggers on "start the dashboard", "deploy the webui", "put the board online", "bring the dashboard up", "deploy the dashboard", "start the webui", "the dashboard will not open", "tunnel 502", "why does this run have no curves", "wandb has it but the board does not", "training curves not showing".

/rl:dashboard — serve the training dashboard here

Gets webui/ running on this machine, whatever its paths look like. The dashboard is a stdlib-only Python server plus a prebuilt static bundle, so the work is never "install things" — it is deciding which logs to show, on which port, and whether the bundle is current.

/rl:dashboard [log-dir]
   │
   ├─ 1. lib/dashboard_probe.sh ..... layout · running instances · tunnels · ports
   │                                  · toolchain · dist freshness · log dirs
   ├─ 2. judgement ................. reuse or start? which log dir? rebuild?
   ├─ 3. plan + confirm ............. one block, explicit yes (a tunnel is public)
   └─ 4. start in background + report the URLs

Deterministic facts come from the probe; this skill only decides. It never kills a process it did not start.

Step 0 — Orient

Repo root is the checkout containing webui/server.py and scripts/lib/dashboard_probe.sh. If the user invoked this from elsewhere, locate it. An argument, if given, is the log directory to serve.

Step 1 — Probe

bash
bash scripts/lib/dashboard_probe.sh 2>&1

Read it as-is. Everything below is a judgement over these lines; never re-probe a fact the script already reported.

Step 2 — The four decisions

2a — Is one already serving?
Probe linesMeaningWhat to do
OK srv:nonenothing upstart one
WARN srv:running with a log-dir that matches what the user wantsalready donedo not start a second one — report its port + tunnel and stop
WARN srv:running on a different log-dirsomeone else's board (or another checkout's)leave it alone; start yours on a free port

Two servers on two ports is fine and common. Two servers on the same log dir is just confusion. Never kill an existing instance to take its port — the probe cannot tell you whose it is, and on a shared box it is usually not yours.

<!-- A `server.py` sometimes shows as two pids (parent + thread); same port and
same log-dir means it is one instance, not two. -->
2b — Which log directory?

This is the decision that actually moves between machines, and the one to get right before anything else: a board serving the wrong directory looks perfectly healthy and shows nothing.

Rank the logdir:* lines by evidence, not by name:

  1. an explicit argument or LOG_DIR from the user — always wins;
  2. logdir:* with the most run logs and the freshest newest-write;
  3. logdir:default (<repo>/logs) when nothing else has logs.

INFO logdir:… exists but holds no .log/.out means serving it yields an empty board — say so rather than starting it. If two candidates both look live (a sibling checkout is the usual case), ask which one; do not merge them silently. When the user wants several at once, that is what --extra-log-dir is for — the primary stays the one with the runs they care about.

<repo>/logs is NOT where the runner writes any more

Since the config/template refactor, scripts/templates/verl/common.env:126 derives

TRAIN_LOG=${HARBOR_LOG_DIR}/${TRAINER_EXPERIMENT_NAME}.log

and a real config overrides HARBOR_LOG_DIR to a per-experiment directory under the shared trials root (<trials-root>/<project>/<exp>/logs). Only the template default falls back to <repo>/logs, which is why serving <repo>/logs alone can look correct and still show nothing.

server.py globs one level, no recursion (webui/server.py:133), so a board on <repo>/logs shows nothing for those runs while training is perfectly healthy.

The probe reports this directly — act on these lines, never assume:

Probe lineMeaningWhat to do
INFO logdir:trialsrootthe shared root the configs point TRAIN_LOG atcontext for the two lines below
OK logdir:trials … already visible via a linka real run log that a served dir already reaches through a symlinknothing — it will show up
WARN logdir:offrepo … NOT visible from any candidate dira real run whose curve the board cannot showsurface it in the plan and pick one of the two fixes below

Two fixes, both fine; pick by how many runs and whether the board is already up:

  • --extra-log-dir <exp>/logs per run dir — explicit, but needs a restart, and you add a flag for every new exp;
  • ln -s <exp>/logs/<exp>.log <served-dir>/<readable-name>.log — no restart (run discovery re-globs per request), and the name becomes the run's id in the UI. The trials/exp-dir mapping for the analysis panels is parsed out of the log contents, not the filename, so any readable name works.

Never move a run log to make it visible — the runner is holding it open through tee, and a stale symlink left under a log dir is its own outage (webui/server.py:141).

Say which directories you scanned

Whatever you decide, the plan and the final report must name the directories being served and account for any logdir:offrepo line — including the ones you chose to leave out. "The board is up" while a live run is invisible is the exact failure this skill exists to prevent, and the user cannot see the probe output.

2c — Does the frontend need rebuilding?
Probe lineJudgement
OK dist:freshserve as-is; do not rebuild "just in case" — it costs minutes and changes nothing
WARN dist:stalesrc/ is newer than the bundle. start_dashboard.sh will not rebuild it (it only checks that index.html exists), so recent UI edits stay invisible until you rebuild
WARN dist:absentmust build before serving

Rebuilding needs OK node (>= 20). On WARN node, activate nvm in the same shell rather than declaring it impossible:

bash
export NVM_DIR="$HOME/.nvm"; . "$NVM_DIR/nvm.sh"; nvm use 22

If no Node >= 20 exists at all and dist:absent, stop and say the frontend cannot be built here — serving is impossible without a bundle. If dist:stale and Node is unavailable, serving the stale bundle is a legitimate fallback; just say it is stale.

2d — Port, and whether to expose it

Take OK port:free. Honour an explicit PORT= from the user even if the probe warns it is busy — but then say who holds it.

The deliverable is a URL the user can actually open. They are usually not on this box, so http://127.0.0.1:<P> alone is not an answer — default to proposing a tunnel, and only skip it if they say local-only.

It is still an outward-facing action: a quick tunnel makes the board reachable by anyone with the URL, so it goes in the plan and waits for the yes like everything else. Never open one silently.

Before opening a new one, check the WARN tunnel lines: if one already targets the port you are about to serve, reuse it — that URL is the answer, and a second tunnel to the same port just creates a second URL to keep track of.

A quick tunnel needs no Cloudflare account, no login, and no token. cloudflared tunnel --url http://127.0.0.1:<P> gets a random *.trycloudflare.com hostname anonymously. Never ask the user for credentials for this, and never tell them to run cloudflared tunnel login — it is not required and does not make a quick tunnel any more stable.

What can actually stop you, in the order it bites on a new machine:

Probe lineMeaningWhat to do
INFO cloudflared … not installedjust the binary is missinglocal + ssh -L <P>:127.0.0.1:<P> <host>; do not install it yourself
WARN egressbinary is there, the box cannot reach Cloudflare's edgethe tunnel will hang or die at startup — go straight to ssh -L, do not retry
OK egressgoodpropose the tunnel

INFO cf:account is informational only: it reports whether a login happens to exist, never a requirement.

If the user asks for a stable URL, be straight about the three options and their real costs — none of them is "the same thing but permanent":

  • quick tunnel (what this skill opens): no account, new URL on every restart.
  • named tunnel: needs a Cloudflare account and a domain on it, plus cloudflared tunnel login or an API token. Gives a hostname you control. This skill does not set one up; say what it takes and let the user decide.
  • Cloudflare Pages (webui/functions/): a fixed *.pages.dev URL, but it reads wandb, not local log files — so it shows different data than the board you just started. Do not offer it as a drop-in replacement.
Show full SKILL.md (879 more words)Show less

Step 3 — Plan, then confirm (never skip)

Print exactly what will happen, then ask. Prose in Chinese; keep paths and flags verbatim.

## Dashboard deployment plan

  log dir   <path>            (<N> run logs, newest <T> minutes old)
  extra dir <each --extra-log-dir path, or —>
  port      <P>               (<free / user-specified, currently held by pid X>)
  frontend  <reuse the existing dist / rebuild needed (<reason>)>
  tunnel    <on (publicly reachable — anyone with the link can open it) /
             reuse existing pid=<P> / off: this machine only>
  existing  <none / pid=<P> on <port>, serving <log-dir>, leaving it alone>

  runs the board cannot see (logdir:offrepo):
    <exp>/logs/<exp>.log        <T> min ago   → <symlink it / add --extra-log-dir / leave it>
    <write "none" when there are none>

<one line on why this log dir was chosen — from evidence, not guesswork>

Start with this plan? [Y]/[N]

If a tunnel is part of the plan, the confirmation line must say so explicitly — the user is publishing an internal training board to a public URL.

If any logdir:offrepo run is fresh (written in the last hour — i.e. probably the run the user actually wants), do not silently write it off: propose the symlink or the --extra-log-dir, and let them decline.

Step 4 — Start

Background, always: this process must outlive the session.

bash
cd <repo_root>/webui
# only when 2c said so:
export NVM_DIR="$HOME/.nvm"; . "$NVM_DIR/nvm.sh"; nvm use 22 && npm run build

TS=$(date -u +%Y%m%d-%H%M%S)
nohup setsid python3 server.py --port <P> --host 127.0.0.1 \
  --log-dir <log-dir> [--extra-log-dir <dir>]... --static-dir dist \
  > "/tmp/dashboard_${TS}.log" 2>&1 < /dev/null &

Do not use start_dashboard.sh for this: it runs in the foreground, traps EXIT to kill the server, and only rebuilds when dist/index.html is missing. It is fine for an interactive one-off; it is wrong for a board meant to stay up.

Verify before claiming success — a server that binds and then finds nothing is the failure this skill exists to catch:

bash
curl -s -o /dev/null -w '%{http_code}' "http://127.0.0.1:<P>/"          # fast
curl -s -o /dev/null -w '%{http_code}' -m 300 "http://127.0.0.1:<P>/api/runs"

/api/runs returning [] means the log dir was wrong — go back to 2b rather than reporting a working board.

Cold-cache first call. The first /api/runs on a fresh instance parses every log in the directory with an empty cache; over a few hundred runs that takes minutes, and every later call returns instantly. Give it a long timeout. A short one returns 000 and leaves a BrokenPipeError in the server log — the server finished the scan and was writing the response when the client left. That is not a crash: do not restart the server, and do not go looking for a dangling symlink because of it.

Then, if the tunnel was approved:

bash
nohup setsid cloudflared tunnel --url "http://127.0.0.1:<P>" --no-autoupdate \
  > "/tmp/cf_dashboard_${TS}.log" 2>&1 < /dev/null &

Poll that log (5s sleeps, up to 60s) for https://<...>.trycloudflare.com, then curl the URL and report the status code you actually got. A tunnel that is up before the server is ready returns 502 for a few seconds — retry once before calling it broken.

Step 5 — Report

Lead with the link the user can open. Put it on the first line, and only report a URL whose status code you have actually seen.

Dashboard is up → <public URL>        ← the one to click
  local    http://127.0.0.1:<P>
  log dir  <path> (<N> runs)
           <one line per --extra-log-dir>
  pid      server=<pid>  tunnel=<pid or —>
  log      <launch log path>
  not served  <run logs still outside every served dir, or "none">
Stop: kill <server_pid> <tunnel_pid>

The log dir lines are the answer to "why is my run missing" three days from now, so spell out every directory this instance serves — not just the primary.

If no tunnel was opened, the first line instead says the board is local-only and gives the SSH port-forward command — never leave the user without a way in.

Quick-tunnel URLs are ephemeral and change on every restart. If the user wants it written down somewhere (docs, README), say that it will go stale — a stable URL means a Cloudflare Pages deployment, which reads wandb rather than local logs and therefore shows different data.

A tunnel URL that resolves but 502s for a few seconds right after launch is normal (the tunnel registered before the server was ready); re-curl once before reporting it as broken.

Diagnosing a board that is already up

Two shapes come up constantly; both are answered from the probe alone.

"The URL 502s." A WARN tunnel line whose target port has no matching srv:running is a tunnel outliving its server — the URL is valid, nothing is behind it. Fix by starting a server on that port, or by opening a new tunnel to the port that does have one. Do not assume the URL expired.

"The board is empty / my run is missing." Check in this order — the first one is now the common answer and costs one probe line to rule out:

  1. WARN logdir:offrepo names the run → the runner wrote it under the trials root, the served dir never had it. Fix per 2b (symlink or --extra-log-dir). Confirm by resolving the config's own HARBOR_LOG_DIR rather than guessing: bash scripts/train/train.sh --dry-run <config> | grep -E 'train log|vLLM log'. Do not go looking at the training itself first — a run at step 12 with healthy metrics in its own log is not a training problem.
  2. Wrong served dir entirely (compare logdir:* counts).
  3. The run's file is *_vllm.log / *_train_gpu_wandb.log / launch_* — all deliberately skipped (webui/server.py:86-92).
  4. The run reached ≤ 5 training steps and is not currently being written to — _handle_runs hides those on purpose. A run visible in wandb but not here, with a cold log, is usually this.
  5. A dangling symlink under the log dir breaking /api/runs — curl it and look for a non-200.

Only then suspect the UI.

A multi-node async run has one exp dir per node (EXP_NAME=…$(date …) is evaluated on each node, so the timestamps differ by seconds). Only the ray-head dir has the full trainer log; the others hold just *_train_gpu_wandb.log. Link the head's log — the analysis panels recover the sibling dirs themselves (_expand_sibling_exp_dirs, 600s window).

"My UI change isn't showing." WARN dist:stale — rebuild, per 2c.

Guardrails — never do these

  • kill a server or tunnel this skill did not start — report the pid, let the user decide, even when it looks abandoned
  • take a port from a running instance
  • open a public tunnel without explicit confirmation in this conversation
  • run the server in the foreground, or under start_dashboard.sh's EXIT trap
  • delete or move dist.bak-*, snapshots/, val_judgments/, or anything under a log dir — a dangling symlink there breaks /api/runs for every run
  • report a URL as working without having curled it
  • edit server.py, start_dashboard.sh, or a config to make the launch work

© LegoX, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/plugins/rl-plugin/skills/dashboard of LegoX/Lego-RL.

Open the folder on GitHubat commit 7c30234

Compare with similar skills

Dashboard next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Dashboard compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Dashboard this skillLegoX/Lego-RL108—~4.2kAutomated safety check: PassApache-2.0
Hermes Atropos EnvironmentsTommy-yw/RunbookHermes546—~3.3kAutomated safety check: PassMIT
Hugging Face LLM Trainerhuggingface/skills11k3 repos~7.2kAutomated safety check: PassApache-2.0
Fix Art IssuesOpenPipe/ART11k—~840Automated safety check: NotesApache-2.0
Safactory WorkflowsAI45Lab/SAfactory236—~1.8kAutomated safety check: PassNone
Create Agentopenma-ai/open-managed-agents315—~808Automated safety check: PassApache-2.0

Similar skills

  • Hermes Atropos Environments

    Tommy-yw/RunbookHermes

    Build, test, and debug Hermes Agent RL environments for Atropos training.

    546 GitHub stars~3.3k tokensUpdated 4 mo ago
    AI & LLM EngineeringAuto-check passed
  • Hugging Face LLM Trainer

    huggingface/skills

    Official

    Trains or fine-tunes language and vision models with TRL or Unsloth on Hugging Face Jobs cloud GPUs, then converts the results to GGUF.

    11k GitHub starsUsed in 3 repos~7.2k tokens
    AI & LLM EngineeringAuto-check passed
  • Fix Art Issues

    OpenPipe/ART

    Fix a GitHub issue on OpenPipe/ART and open a PR. An agent skill from OpenPipe/ART.

    11k GitHub stars~840 tokensUpdated today
    AI & LLM EngineeringAuto-check: notes
  • Safactory Workflows

    AI45Lab/SAfactory

    Integrate a benchmark or custom environment into SAfactory using fixed adapter templates and local contract tests, optionally run Docker/RJob evaluation, or prepare GRPO/RL training.

    236 GitHub stars~1.8k tokensUpdated 14 days ago
    AI & LLM EngineeringAuto-check passed
  • Create Agent

    openma-ai/open-managed-agents

    Help users create and configure openma managed agents through conversation.

    315 GitHub stars~808 tokensUpdated 2 days ago
    AI & LLM EngineeringAuto-check passed
  • Huggingface LLM Trainer

    waybarrios/opencode-power-pack

    Train or fine-tune language models with TRL or Unsloth on Hugging Face Jobs, including SFT, DPO, GRPO, reward models, and GGUF conversion.

    533 GitHub stars~3k tokensUpdated 2 days ago
    AI & LLM EngineeringAuto-check passed

More from LegoX/Lego-RL

All 11 skills in this repo
  • Lego Rl Config

    LegoX/Lego-RL

    Compose, edit, refactor, and validate Lego-RL train/eval/infer .env configs and reusable scripts/templates modules.

    108 GitHub stars~2.1k tokensUpdated today
    Auto-check: notes
  • Check

    LegoX/Lego-RL

    Preflight a Lego-RL config: answer "is it safe to launch this run right now?".

    108 GitHub stars~2.9k tokensUpdated today
    Auto-check passed
  • Run

    LegoX/Lego-RL

    Preflight and launch a Lego-RL run (train, eval or infer). An agent skill from LegoX/Lego-RL.

    108 GitHub stars~3k tokensUpdated today
    Auto-check passed
  • Status

    LegoX/Lego-RL

    Diagnose a Lego-RL run that is already in flight (or just finished): which run is alive, how far it has got, and whether its numbers are healthy.

    108 GitHub stars~3k tokensUpdated today
    Auto-check passed
  • K8s Sandbox Install

    LegoX/Lego-RL

    Guided install / scale-out of a sandbox Kubernetes cluster for the Lego-RL k8s backend (kubeadm 1.32 + containerd + flannel + ImageVolume, optionally nydus / a shared registry / an isolated dockerd).

    108 GitHub stars~2.9k tokensUpdated today
    Auto-check: warnings
  • Rl Check

    LegoX/Lego-RL

    One-to-one Codex counterpart for Claude /rl:check. An agent skill from LegoX/Lego-RL.

    108 GitHub stars~338 tokensUpdated today
    Auto-check passed

Questions about Dashboard

What does Dashboard do?

Bring up the Lego-RL training dashboard (webui/) on whatever machine you are on, adapting to that box's layout instead of assuming this repo's paths. Dashboard is an agent skill from LegoX/Lego-RL. Bring up the Lego-RL training dashboard (webui/) on whatever machine you are on, adapting to that box's layout instead of assuming this repo's paths.

When should I use Dashboard?

Dashboard fits situations like: start the dashboard; deploy the webui; put the board online; bring the dashboard up.

How do I install Dashboard in Claude Code?

Run `npx skills add LegoX/Lego-RL --skill dashboard -a claude-code`. Or copy the skill folder (.claude/plugins/rl-plugin/skills/dashboard in LegoX/Lego-RL) into .claude/skills/dashboard in your project. Claude Code loads it when a task matches its description.

How do I install Dashboard in Codex?

Run `npx skills add LegoX/Lego-RL --skill dashboard -a codex`. Or copy the skill folder (.claude/plugins/rl-plugin/skills/dashboard in LegoX/Lego-RL) into .agents/skills/dashboard in your project. Codex loads it when a task matches its description.

Can I use Dashboard in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add LegoX/Lego-RL --skill dashboard -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/dashboard, .gemini/skills/dashboard, .github/skills/dashboard and .opencode/skills/dashboard in your project.

What does Dashboard need to run?

Going by SKILL.md and its folder, Dashboard needs the command-line tools its instructions call (cloudflared, bash, nvm, curl, ssh and npm). Our summary lists: Python 3.

Does Dashboard access the network?

SKILL.md contains no URLs. Its commands use curl, ssh and npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Dashboard safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Dashboard use?

Dashboard is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Dashboard use?

About 4.2k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Dashboard?

Skills that share tags, products or a category with Dashboard: Hermes Atropos Environments (Tommy-yw/RunbookHermes, 546 stars), Hugging Face LLM Trainer (huggingface/skills, 11k stars), Fix Art Issues (OpenPipe/ART, 11k stars) and Safactory Workflows (AI45Lab/SAfactory, 236 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Dashboard?

LegoX (a GitHub organization) maintains it in LegoX/Lego-RL, which has 108 GitHub stars. The repository holds 11 skills in this directory. The repository was last updated on October 8, 2026.

Source: LegoX/Lego-RL on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.