# YABS node board > Public board of YABS disk and network benchmark runs, one row per node and > run time. Uploads use a per-node token obtained by registering the short > hostname. Numbers are unsigned labels, not proof of hardware. > Each run also carries the kernel's IO stall (PSI) during the run and the disk > media (virtio, HDD, SSD or NVMe); the disk averages weigh a congested run less. Board: https://05877bc1b477317f.mcx.fi/yabs/ The customer domain serves ~/www/public at the root, so /yabs/ works there. Do not use the panel path (/public-vasilves/...): it names the account. ## Install - [README](https://05877bc1b477317f.mcx.fi/yabs/README.md): full instructions, API, status codes, limits. - [racks](https://05877bc1b477317f.mcx.fi/yabs/racks): 3D view, one hall per hostname family, hover for numbers. Read-only, no JSON. - [history](https://05877bc1b477317f.mcx.fi/yabs/history): every stored run as server-rendered SVG charts, hover for values. `?nodes=a,b` and `?disk=virtio|SSD|HDD|NVMe` narrow the page, because one y axis is shared across nodes. - [source](https://05877bc1b477317f.mcx.fi/yabs/source): every served file as text, with sha256 per file. `?f=probe.sh&raw=1` downloads it for a local `sha256sum` diff. ```sh curl -fsSLO https://05877bc1b477317f.mcx.fi/yabs/probe.sh sh probe.sh # register + monthly cron, keeps the token if re-run sh probe.sh schedule daily # benchmark cron rate (daily|weekly|monthly) sh probe.sh update hourly # self-update cron rate (hourly|daily|weekly|monthly|off) sh probe.sh refresh # fetch the newest probe.sh and re-install it; cron untouched sh probe.sh now # one run now, output on screen, 10-20 minutes # installs nothing: register with `sh probe.sh` first sh probe.sh status # running or not, elapsed, last log line ``` Files: `~/.yabs-probe/{conf,probe.sh,run.sh,yabs.sh,last.log,progress}`. ## Upload without the probe One command, no install, no cron, no token: curl -sL yabs.sh | bash -s -- -i -g -j -s "?node=$(hostname -s)" `` is the Board URL at the top. `$(hostname -s)` expands in your own shell, so the name is this machine's. `-i` skips iperf3 (it waits on public servers that often time out), `-g` skips Geekbench, and `-j` prints the JSON last, after the board's answer, so you can copy it. YABS does not check the upload: if no `{"ok":...}` line appears, the post failed. To print without uploading, drop `-s URL` and pipe through `grep '^{'`, then paste it in `?node=`, where the form fills the name from the URL and opens the JSON box. Every answer carries `form`, that same link, so a rejected run still prints a URL to click. A token is optional: `POST ?do=register` body `{"name":""}` returns one that writes only that name, which is what the probe uses. A lost token is not reissued; the owner deletes the row. Everything except the JSON is optional too: a run without `?gpu=`, `?rota=0|1`, `?tran=nvme|sata|...`, `?virt=1` or `?psi_*` still stores, prints `—` for the missing value and weighs 1 in the averages (the maximum). ## API - `POST ?do=register` body `{"name":"","gpu":"renderD128"}` returns `{"ok":true,"token":"..."}` once. - `POST /` with `X-Upload-Token` and raw `yabs.sh -j` JSON stores the run; `?node=NAME` names it, `?gpu=NAME` records the GPU. Optional, all from the probe: `?psi_some=&psi_full=` = 0-100, share of the run stalled on IO; `?rota=0|1`, `?tran=nvme|sata|...` and `?virt=1` = the disk behind `$HOME`; `virt=1` wins, because a virtio disk's rotational flag is only a default. - `GET ?do=api` returns hardware, media and stall-weighted averages per node. - `GET ?do=list` returns the 500 newest runs, raw numbers and stall. Codes: 200 saved, 400 bad request, 401 bad token, 405 GET on register, 409 duplicate run or name taken, 413 body over 256 KB, 422 implausible or missing numbers, 507 registry full. ## Agent checklist 1. Run `hostname -s` and use that exact name. 2. `sh probe.sh` then `sh probe.sh now`, wait for completion. If nothing may be installed on the node, skip both: `curl -sL yabs.sh | bash -s -- -i -g -j -s "?node=$(hostname -s)"`, and check that the board's answer line appears. 3. Verify with `GET ?do=api` that the node has a new run. 4. Never post a run from a machine other than the one named in `?node=`.