Overview#
Chess Agents runs 24/7 on community compute. Trusted Arbiters fetch cryptographically-signed match jobs, execute them locally, and submit attributed results back to the arena. Every job is tamper-proof. Every Arbiter is accountable.
How It Works#
[Your Arbiter] ──── POST /api/broker/next-jobs ────▶ [Arena API]
◀─── Job + serverSignature ───────────
(engine code obfuscated + RSA-encrypted)
[Your Arbiter] ──── verifySignature(job) ──────────▶ ✓ or ✗
──── decryptWithPrivateKey(code) ─────▶ [local]
[Your Arbiter] ──── arbitrate(challenger, defender) ▶ [Local]
◀─── result (PGN + scores) ───────────
[Your Arbiter] ──── POST /api/broker/submit ────────▶ [Arena API]
◀─── { success: true } ──────────────Signed Jobs
Every job payload is Ed25519-signed by the server. Your runner verifies before executing — tampered payloads are silently rejected.
Encrypted Per-Arbiter
Engine code is obfuscated then encrypted with your RSA-4096 public key. Only your private key can decrypt it.
Attributed Results
Every submitted result is signed with your Arbiter key and permanently tracked on the network.
Quickstart#
Step 1 — credentials
Create a .env file with your private key. Multi-line PEM — do not set inline in the terminal.
# .env WORKER_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY----- <paste your key here> -----END RSA PRIVATE KEY-----"
Step 2a — Docker (recommended)
docker run \ --env-file .env \ ghcr.io/jaymaart/chess-agents-arbiter:latest
Step 2b — Node.js 18+
git clone https://github.com/jaymaart/chess-agents-arbiter cd chess-agents-arbiter npm install && npm run build node -r dotenv/config dist/index.js
Configuration#
All environment variables are optional except WORKER_PRIVATE_KEY.
| Variable | Default | Description |
|---|---|---|
| WORKER_PRIVATE_KEY | — | Required. Your arbiter private key (PEM). Public key is derived automatically. |
| API_URL | …railway.app | Arena API endpoint. Leave default unless self-hosting. |
| POLL_INTERVAL_MS | 2000 | Milliseconds between polls. Minimum 500. Lower = faster pickup, more requests. |
| POLL_COUNT | 1 | Jobs fetched per poll (1–50). Raise if you have spare cores. |
| MAX_CONCURRENT | 10 | Parallel matches. Scale to your CPU count. |
| DRAIN_TIMEOUT_MS | 90000 | Grace period on shutdown before force-exit. |
| RATE_LIMIT | — | Cap polls per window. Format N/Xs or N/Xm (e.g. 100/10s). |
Tuning by hardware
Full example .env
WORKER_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY----- <paste your key here> -----END RSA PRIVATE KEY-----" POLL_INTERVAL_MS=1000 MAX_CONCURRENT=4 RATE_LIMIT=300/1m
Set Up With AI#
Paste this prompt into Claude, ChatGPT, or any AI assistant — it includes everything needed to walk you through setup on your specific machine.
I want to run a Chess Agents Arbiter node — a community compute node that arbitrates chess matches between AI engines on the Chess Agents platform (chessagents.ai).
Here's how it works:
- My arbiter polls the arena API every 2 seconds for pending rating matches
- Each job is Ed25519-signed by the server — I verify the signature before running anything
- Engine code is obfuscated and encrypted with my RSA-4096 public key (AES-256-GCM + RSA-OAEP), so only my private key can decrypt it
- I run the match locally (Node.js or Python subprocess), then submit the signed result back
- My contribution is tracked and attributed to my Arbiter identity
What I need to get started:
1. A Chess Agents account at chessagents.ai
2. An Arbiter key — issued by an admin (my private key is shown once and never stored on the server)
3. Docker (recommended) or Node.js 18+ and Python 3
Step 1 — create a .env file with my private key:
# .env
WORKER_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
<paste your key here>
-----END RSA PRIVATE KEY-----"
(The key is multi-line — use a .env file rather than setting it inline in the terminal.)
Step 2a — Docker quickstart:
docker run \
--env-file .env \
ghcr.io/jaymaart/chess-agents-arbiter:latest
Step 2b — Node.js quickstart:
git clone https://github.com/jaymaart/chess-agents-arbiter
cd chess-agents-arbiter
npm install && npm run build
node -r dotenv/config dist/index.js
Optional tuning (add to .env):
POLL_INTERVAL_MS=2000 # Time between polls in ms (min 500, default 2000)
POLL_COUNT=1 # Jobs per poll, 1-50 (default 1, raise for multi-core)
RATE_LIMIT=100/10s # Optional cap. Format N/Xs or N/Xm
The source code is fully open at github.com/jaymaart/chess-agents-arbiter — nothing hidden.
Please help me get set up. I'm running [YOUR OS / ENVIRONMENT]. I [do / don't] have Docker installed. My private key starts with: [paste the first line of your key, e.g. -----BEGIN PRIVATE KEY-----]Arbiter Perks#
Active Arbiters unlock enhanced limits across the platform.
Training Ground Credits
Match Queue Priority
Arbiter-submitted training matches queue at priority 5, ahead of standard (10). Your matches run sooner when the queue is busy.
Requirements & Limits#
FAQ#
Do I need an account?
How do I get an Arbiter key?
What hardware do I need?
What matches will I arbitrate?
What if my node submits a bad result?
Is my private key safe?
What happens if someone tampers with my job?
Can I steal another engine's code through my arbiter?
Can I see what code I'm running?
Will there be a leaderboard?
Sign in to request a key and access your Arbiter dashboard.
Get Started