Monitor a Worker
A running worker answers three questions in three places: is it alive (its logs), are its submissions landing on-chain (the explorer, or the Forge Builder Kit (opens in a new tab)'s dashboards), and is it scoring well enough to earn rewards (EMA score queries via allorad).
Goal
Watch your worker submit, see its submissions and scores on-chain, and check whether it is in a topic's active set — from the terminal, a web dashboard, and allorad.
Prerequisites
- A running worker — from the Python SDK guide, Docker, or the Forge Builder Kit
- For the dashboard and
workerctl(steps 3–4): workers deployed with the Forge Builder Kit (opens in a new tab)'sWorkerManager(python deploy_worker.pyin the kit'snotebooks/directory), which records them in its localworker_state.db - For EMA queries (step 5): the
alloradCLI
Steps
1. Read the worker's logs
The SDK worker logs every lifecycle event: wallet address and balance at startup, submission windows opening and closing, each submission's transaction hash, and any errors.
-
Local run: the logs are in your terminal. Successful submissions look like
✅ Successfully submitted: topic=<id> nonce=<block height>followed by the transaction hash. -
Docker:
docker logs -f allora-worker(see Deploy a Worker with Docker). -
Builder Kit deployments: each worker runs as a managed subprocess and writes to
worker_logs/. Faucet requests, balance checks, and on-chain errors appear there — not in the deploy script's output. You can also tail programmatically:from allora_forge_builder_kit import WorkerManager wm = WorkerManager(reconcile_on_start=False) lines = wm.get_worker_log_tail(topic_id=69, address="allo1...", lines=50) print("\n".join(lines))
2. Check the explorer
Every submission is a transaction. Look your worker up by its allo... address:
- Testnet: testnet.explorer.allora.network (opens in a new tab) — your topic's page (e.g. topics/69 (opens in a new tab)) lists its workers, and the transaction hashes from your logs resolve under
/explorer/transactions/<tx hash>. - Mainnet: explorer.allora.network (opens in a new tab).
3. Run the web dashboard
The Builder Kit ships a local web dashboard for every worker deployed with its WorkerManager:
python -m allora_forge_builder_kit.web_dashboardOpen http://localhost:8787 (opens in a new tab). The page auto-refreshes every 5 seconds and shows, per wallet address and topic:
- run status and submission counts (successes and errors), with 24-hour and 7-day breakdowns
- the latest on-chain EMA score and reward fraction, synced from the chain every 5 seconds
- a submission timeline of the last 25 submission windows — hover a cell for the nonce, inference value, transaction hash, and the latest score
- a live tail of each worker's stdout log
Options: --port (default 8787), --db-path / --secrets-path / --network (defaults worker_state.db / worker_secrets.json / testnet — run the command from the directory where you deployed, or point these at it). The JSON behind the UI is available at /api/dashboard and /api/workers.
The dashboard binds to 127.0.0.1 by default. If you expose it with --host 0.0.0.0, an auth token is generated and printed to stderr (or pass your own with --token); every request must then include it, either as ?token=... in the URL or an Authorization: Bearer ... header.
4. Use the workerctl CLI
For terminals and scripts, workerctl prints the same registry as text:
# Text dashboard: status, submission counts, rewards, last inference per worker
python -m allora_forge_builder_kit.workerctl dashboard
# Include workers that are not currently running
python -m allora_forge_builder_kit.workerctl dashboard --all
# Skip the on-chain sync for an instant, local-only view
python -m allora_forge_builder_kit.workerctl dashboard --no-monitor
# Reconcile recorded state with what is actually running
python -m allora_forge_builder_kit.workerctl reconcile
# Start every enabled worker (e.g. after a reboot) / stop all running workers
python -m allora_forge_builder_kit.workerctl start-all
python -m allora_forge_builder_kit.workerctl stop-allworkerctl accepts the same --db-path, --secrets-path, and --network options as the web dashboard. For finer control (starting, stopping, or removing a single worker), use the WorkerManager Python API:
from allora_forge_builder_kit import WorkerManager
wm = WorkerManager(reconcile_on_start=False)
for w in wm.status_all():
print(w['topic_id'], w['address'], w['status'])
wm.stop_worker(topic_id=69, address="allo1...")
wm.start_worker(topic_id=69, address="allo1...")5. Query EMA scores with allorad
The EMA score (Exponential Moving Average) reflects a participant's performance over time for a given topic, balancing recent and past achievements, and determines whether the participant stays in the active set (eligible for rewards) or remains in the passive set. Active participants have their EMA score updated based on their current performance; participants who do not contribute during a given epoch receive an adjusted score using a "dummy" value, which determines whether they can re-enter the active set in future epochs. Read about the v0.3.0 release on Merit-Based Sortitioning for a deeper dive on what makes up the active and passive sets.
The commands below use the testnet RPC endpoint; swap in the mainnet endpoint from networks as needed.
Worker EMA scores
Query the EMA score for a specific worker (identified by its allo... address):
allorad q emissions inferer-score-ema [topic_id] [worker_address] --node https://allora-rpc.testnet.allora.network/Query the lowest EMA score among workers in the topic's active set:
allorad q emissions current-lowest-inferer-score [topic_id] --node https://allora-rpc.testnet.allora.network/Reputer EMA scores
The same pair of queries exists for reputers:
allorad q emissions reputer-score-ema [topic_id] [reputer_address] --node https://allora-rpc.testnet.allora.network/
allorad q emissions current-lowest-reputer-score [topic_id] --node https://allora-rpc.testnet.allora.network/To determine whether a participant is in the active set and eligible for rewards, compare its EMA score against the lowest EMA score in the active set for the same topic: if the participant's score is higher, it is in the active set.
For the full catalog of worker-related chain queries — registration checks, per-block inference scores, latest submitted inference, and network regrets — see How to Query Worker Data using allorad.
Verify
- Your worker's log shows
✅ Successfully submittedlines, and the transaction hashes resolve on the explorer (opens in a new tab). - The web dashboard at http://localhost:8787 (opens in a new tab) lists your worker with a
runningstatus and a populating submission timeline. allorad q emissions inferer-score-ema <topic_id> <your allo... address> --node https://allora-rpc.testnet.allora.network/returns a score, and comparing it withcurrent-lowest-inferer-scoretells you whether you are in the active set.
Troubleshoot
- Dashboard or
workerctlshows no workers — they only track workers deployed through the Builder Kit'sWorkerManager, and readworker_state.dbfrom the current directory. Run them from the directory you deployed in, or pass--db-path. Workers started by hand (e.g.python worker.py, Docker) are monitored via their logs, the explorer, andalloradinstead. 401 Unauthorizedfrom the dashboard — you exposed it beyond localhost, so requests need the auth token printed to stderr at startup: append?token=...to the URL.- EMA query returns no score — the worker has not been scored yet. Scores appear only after its submissions are included in completed epochs; confirm submissions on the explorer first.
allorad: command not found— install the CLI: Allora CLI.- Dashboard
sync_ok=falseor zero on-chain data — the on-chain sync (every 5 seconds) may be failing; check network access to the RPC endpoint, and the--networkflag matches where the worker is deployed (testnetby default).
Next
- All worker chain queries: query worker data using
allorad - Understand how scores drive rewards: worker rewards
- Build or reconfigure your worker: build a worker with the Python SDK
- Run it unattended: deploy a worker with Docker