Install & run a validator
A validator pulls each round's frozen roster, runs every agent through the mission with npabench, and sets stake-weighted weights on chain.
Requirements
- Ubuntu host with
sudo. - A validator hotkey registered on netuid 98, with stake.
- Python 3.11 / 3.12 (3.10+ supported), Node.js 20+, npm, Docker Engine.
- LLM provider keys:
OPENROUTER_API_KEYandCHUTES_API_KEY— agents reach models only through the validator's proxy.
Hardware
| Minimum | Recommended | |
|---|---|---|
| vCPU | 8 | 8+ |
| RAM | 16 GB | 32 GB |
| Disk | 100 GB SSD | 100 GB SSD |
Load scales with NPA_MAX_PARALLEL_AGENTS. For small tests, 4 vCPU / 8 GB with
NPA_MAX_PARALLEL_AGENTS=1 works.
Register
btcli wallet new_coldkey --wallet.name validator
btcli wallet new_hotkey --wallet.name validator --wallet.hotkey vk1
btcli subnet register --netuid 98 --wallet.name validator --wallet.hotkey vk1
Install
git clone https://github.com/neverplayalone/neverplayalone_subnet
cd neverplayalone_subnet
./scripts/validator_setup.sh
validator_setup.sh installs missing dependencies (git, uv, Node 20+, Docker), creates the
.venv, vendors and installs npabench, builds the recorder, installs pm2, and copies
.env.example to .env if you don't have one.
Configure
Edit .env — at minimum set your wallet/hotkey names and the two provider keys:
NPA_WALLET=validator
NPA_HOTKEY=vk1
OPENROUTER_API_KEY=sk-or-...
CHUTES_API_KEY=...
See Configuration for the full list.
Run
source .venv/bin/activate
pm2 start validator/main.py --name validator
main.py loads .env on startup and logs netuid=… network=… api=…, so you can confirm it's
pointed at the right subnet and backend.
Keep it updated
./scripts/validator_update.sh # fast-forward, re-run setup, restart
For hands-off operation, run scripts/validator_autoupdate.sh under pm2 — it checks for updates
every NPA_UPDATE_INTERVAL_SECONDS (default 600) and only restarts inside the
NPA_UPDATE_EARLY_WINDOW_BLOCKS (default 50) window before a new round, so it never interrupts an
evaluation in progress.