Auto-bench on the Website
Auto-bench benchmarks your server without you: on a schedule or on demand, VoxelBench sends a bot that joins as a player and has the plugin run the benchmark. This page covers the website side: targets, Microsoft accounts, schedules, launches, quotas, runs and errors.
How a Run Goes
- A run is due on its schedule, or you click Run now: VoxelBench queues a job.
- A bench agent picks the job up, and its bot connects to your server's verified address, as a Minecraft: Java Edition player.
- The bot types
/vbautobotfollowed by a one-time code and the mode: it is the only command the bot uses to start a run. The plugin asks voxelbench.com whether that code is valid for this server, and receives what to run: mode, test or profile, warm-up, number of runs. - The plugin runs the benchmark and reports its progress to the bot. Each measured run sends its report to voxelbench.com, attached to the job.
- The bot disconnects.
What happens on the server, and what the server needs, is described in Auto-bench in the plugin documentation.
Before You Start
- A plan that includes auto-bench: Pro, Enterprise, or a hosting provider account verified by VoxelBench. On the Free plan, the Auto-bench page only offers to upgrade.
- A linked and verified server. Only verified servers can receive a target, and the bot connects to the address you verified (see Linking and Verifying a Server). Linking the server again removes its verification: verify it again afterwards.
- On the server: the official, up-to-date VoxelBench jar, outgoing HTTPS to voxelbench.com, and a way in for the bot through whitelist, online mode, anti-bot plugins and proxies (see Letting the Bot In). A pinned benchmark world is strongly recommended (see Where Runs Take Place).
An auto-bench run loads the server like any benchmark: players online will feel it. Schedule it for quiet hours.
Microsoft Accounts
How the bot signs in depends on your server:
- Offline mode (
online-mode=false): no account is needed. The bot joins under a generated name starting withvb_. Choose Offline (cracked server) as the target's auth mode. - Online mode: the bot must sign in with a genuine Minecraft: Java Edition account. You lend one in the Microsoft accounts card of the Auto-bench page, then choose BYO Microsoft account as the target's auth mode.
To add an account, click Add Microsoft account. A window gives you a Microsoft address and a short code: open the address, type the code and sign in with the Microsoft account that owns Minecraft: Java Edition. The page notices the sign-in by itself. An account without Java Edition is refused.
VoxelBench never sees your password: you sign in on Microsoft's own page. It keeps the sign-in token Microsoft returns, stored encrypted, and lends it to the bench agent only for the runs that use this account. The page's own warning applies: Mojang may suspend accounts used by automated clients, so only add an account you are willing to lose.
Each account shows its state: available, leased (in use by a run), banned or invalid. After a failed sign-in (auth_failed), the account is marked banned and is no longer used until you remove it and add it again. Removing an account deletes its stored credentials; it is refused while a target still uses the account.
Creating a Target
A target is one server, one way of benchmarking it and one schedule. On the Auto-bench page, click New target:
| Field | What to put |
|---|---|
| Synced server | One of your verified servers. The bot connects to its verified address and port |
| Display name | Up to 100 characters |
| Schedule | A preset; any other schedule can be set afterwards by editing the target (see Scheduling) |
| Minecraft version | Leave on auto-detect, or force a version when the bot does not know the one your server announces. Use the Minecraft version, not your server software's build number. The page shows the latest version auto-bench supports, and the full list |
| Bench mode | Standard benchmark, Stress limit, Unit test or Custom profile |
| Bench args | For Unit test, required: the test ID, then its parameters in the order /bench test takes them, for example chunkLoading 500 or disk 4 8 512M 3 (see Test Parameters). Up to 256 characters |
| Custom profile name | For Custom profile, required: the profile's file name without .yml (letters, digits, - and _, up to 64 characters). The profile must be on the server, in plugins/VoxelBench/custom_benchmarks/ |
| Warmup pass | A full benchmark first, whose results are discarded, to warm the server up; the job takes that much longer. Ignored in Unit test mode |
| Runs | How many measured runs per job, each sent as its own report. Standard benchmark only; up to 10 on Pro, 20 on Enterprise and hosting provider accounts. The whole job, warm-up included, must finish within two hours |
| Auth mode | Offline (cracked server) or BYO Microsoft account (see Microsoft Accounts) |
| Microsoft account | With BYO Microsoft account: one of your available accounts |
| Notes | Optional, up to 1,024 characters |
Creating a target is only possible from the dashboard: the API and agents cannot do it, because a target engages a Microsoft account you lend.
Editing and Deleting
Edit (in the target's row) changes the name, the schedule (a preset or any cron expression), the Minecraft version, the mode, the arguments, the warm-up and the number of runs. The server and the auth mode cannot be edited: create a new target to change them. The Enabled switch pauses and resumes a target. Delete removes it for good, from the dashboard only.
Scheduling
The presets are Daily at 02:00 UTC (the default), Every 6 hours, Twice daily (02h/14h UTC), Weekly (Sunday 02:00 UTC) and Monthly (1st 02:00 UTC). When editing a target, you can also type any five-field cron expression — minute, hour, day of month, month, day of week — always in UTC, with *, */N, lists (2,14) and ranges (1-5).
- At most once an hour. A schedule that fires more often is refused when you save it.
- Around the time, not on the minute. Each run is moved by a random offset of up to 20% of the interval, 30 minutes at most, earlier or later, so that nobody can tune a server just for a known time. The scheduler checks every 5 minutes for runs that are due.
- One run at a time. If the previous run of the target is still going when the next one is due, the new one waits until the target is free.
- Within the quota. When your daily run quota is used up, a scheduled run is skipped and the target moves on to its next time.
An API token or a connected agent with the auto-bench:write scope can change a target's schedule, name and notes, and switch it on or off (see API and Tokens).
Launching and Cancelling
Run now, in the target's row, queues a run at once; a bench agent picks it up shortly after.
- One run in flight per target. While a run is queued or in progress, launching again is refused (through the API:
already_running, with the id of the run in progress). - 60 seconds at least between two launches of the same target.
- The run quota must cover the target's number of runs.
Cancel, in the Live runs panel, asks the bot to stop: it tells the plugin to stop the run, which the plugin does at once, and disconnects. The run first shows cancelling, then cancelled. If the agent does not confirm within 5 minutes, the run is closed anyway (cancel_timeout). A cancelled run is never counted as a failure of the target, but it stays counted in the run quota.
On the server, /bench stop also stops an auto-bench run; VoxelBench records it as stopped on the server (aborted_in_game), not as a failure. A run of a multi-run job that ends without its report is different: the plugin abandons the remaining runs, and VoxelBench records a failure of the target (agent_crash, see Other Errors).
Quotas
| Pro | Hosting provider | Enterprise | |
|---|---|---|---|
| Targets | 3 | 5 | 10 |
| Runs per 24 hours | 10 | 30 | 100 |
| Runs per job | 10 | 20 | 20 |
| Microsoft accounts | 2 | 10 | 5 |
The Free plan has no auto-bench.
The run quota counts every job created in the last 24 hours with its number of runs (the warm-up does not count), whether it succeeded, failed or was cancelled, and scheduled runs included. It is a rolling window: runs come back as earlier ones age past 24 hours. The Auto-bench page shows how many runs you used in the last 24 hours.
Following Runs
The Auto-bench page shows:
- Live runs, updated every 5 seconds: each run in progress, with its run number (Run 2/5), a warmup badge during the warm-up, the current test and the Cancel button;
- Recent runs: completed, failed and timed-out runs, with their status, target, mode, score, duration and start, and a link to the report or the test result. Click a failed run to see what went wrong, what to do, and the agent's raw message;
- in the targets table: the Next run, the Last success, and the Failures in a row, with the last error.
The same runs can be read through the API (GET /api/v1/auto-bench/jobs), each failure with the same explanation as the English dashboard.
Run Statuses
| Status | Meaning |
|---|---|
queued | Waiting for a bench agent to pick it up |
claimed | An agent took it and is connecting to your server |
connecting, online | The bot is connecting, then connected and waiting for the plugin to confirm its code |
benching | The benchmark is running |
cancelling | A stop was asked; waiting for the agent to confirm |
completed | The results arrived |
failed | The run ended with an error (see below) |
timeout | The run reached its deadline without finishing (expired) |
cancelled | Stopped from the dashboard or the API |
Failures and Automatic Pause
A failed run (status failed) sends you a notification with the number of failures in a row. After 5 failures in a row, the target is switched off automatically, and you are notified. Switching it back on resets the count, and so does a successful run.
Some endings are not the server's fault and are not counted: a run interrupted by a VoxelBench update (agent_shutdown), a run stopped on the server with /bench stop (aborted_in_game), and cancellations, including a certification run that VoxelBench's moderation rescheduled or cancelled (rescheduled, user_cancelled). Every other failure counts, including one caused by the target's settings, such as a wrong test ID, and a multi-run job abandoned because one of its runs failed.
Errors and What to Do
A failed run shows a label, its code, an explanation and what to do. The codes below are the ones you will see. Codes that come from the plugin are also listed, with their fixes, in Auto-bench in the plugin documentation.
Before the Plugin Answers
| Code | What happened | What to do |
|---|---|---|
connection_refused | The bot could not connect, did not reach the world within 2 minutes, or lost the connection during the run | Check that the server is running and reachable from the internet at its verified address and port; let the bot through firewalls and geographic filters |
kicked_on_join | The server kicked the bot; the reason is in the raw message | Whitelist, anti-bot plugin, full server, or an online-mode server with a bot in offline mode |
server_starting | The server was asleep and booting when the bot arrived; the agent waited and retried, but it did not finish starting in time | Launch again once the server is fully up, or keep it awake at the scheduled time |
auth_failed | The bot could not sign in with the Microsoft account | Check that the account still owns Java Edition and is not suspended, then remove it and add it again: until then it stays marked banned |
byo_lease_failed | Before connecting, the agent could not obtain a sign-in for the target's Microsoft account: the account is marked invalid or banned, Microsoft refused to renew its sign-in, it no longer owns Java Edition, or its stored credentials could not be read. The raw message gives voxelbench.com's answer. The bot never connected | If the raw message says account_unusable, auth_chain_failed or no_java_edition, sign in to the account, check that it still owns Java Edition, then remove it and add it again. Any other answer is on VoxelBench's side: report it |
version_mismatch | The bot does not know the Minecraft version your server announces | Set Minecraft version on the target to a version from the supported list |
no_plugin_response | The bot joined the world and typed /vbautobot, but no answer from VoxelBench came back within 10 minutes. VoxelBench answers that command at once, before anything else, so this silence means the command never reached VoxelBench, or its answer never reached the bot | Check that VoxelBench is installed and enabled on the server the bot actually lands on (not a proxy lobby), that no plugin blocks or rewrites /vbautobot (command filters, login or captcha plugins), and that no chat plugin hides VoxelBench's messages to the bot. The bot needs no permission to run /vbautobot |
On the Server
| Code | What happened | What to do |
|---|---|---|
bench_timeout | The plugin started, then said nothing for 10 minutes (it reports the start and end of every test), or the job reached its maximum duration of two hours, warm-up and all runs included | Look for an error in the server console at that time, and make sure no plugin hides VoxelBench's messages to the bot. If the job is simply too long, lower its number of runs or drop the warm-up |
plugin_test_already_running | A benchmark, stress run or test was already running when the bot arrived | Avoid running your own benchmarks at the scheduled time; the next run follows the schedule |
plugin_benchmark_world_unavailable | A Unit test job on a test that writes to the world, with no pinned world and no temporary world possible (always the case on Folia without a pinned world). Nothing ran | Pin a world loaded at startup with /bench world set <world>; elsewhere than on Folia, you can also allow benchmark.auto-temp-world in the plugin's configuration |
plugin_missing_test_args | A Unit test job reached the plugin with no arguments, so it did not know which test to run. Nothing ran. The website refuses to save a test target without arguments, so this is rare | Edit the target and put the test ID in Bench args, followed by its parameters in the order /bench test takes them, for example chunkLoading 500 |
plugin_unknown_test | The test named first in Bench args cannot start on this server: no test has that ID (unknown_test), or an extension registers it but could not build it (test_build_failed). Nothing ran | Run /bench test list on the server and put one of its IDs first in Bench args. A test from an extension needs that extension installed and enabled; for test_build_failed, update the extension |
plugin_invalid_test_args | The plugin knows the test but refused one of the parameters that follow its ID in Bench args (invalid_test_args): out of range or not a number, for example. Nothing ran | Fix the parameters. To read the plugin's own reason, type the same command in game: /bench test followed by the target's Bench args |
plugin_unknown_profile | A Custom profile job could not start: no profile name was sent (missing_profile_name), no benchmark profile of that name is loaded on the server (unknown_profile; a stress profile does not count, and the raw message lists the loaded names), or a test of the profile is no longer registered (test_no_longer_known). Nothing ran | Put the profile's file name without .yml in Custom profile name (its name: key is only a display name). /bench custom list shows the loaded profiles, and /bench custom reload picks up a file added since startup. For test_no_longer_known, reinstall the extension that provides the test, or remove the test from the profile |
plugin_unknown_mode | The installed VoxelBench does not know this mode | Update VoxelBench |
plugin_exception | VoxelBench hit an error while preparing the run | Look for the error in the server console and report it |
plugin_protocol_error | VoxelBench and voxelbench.com did not understand each other: an answer VoxelBench could not read, a request voxelbench.com refused as malformed, or voxelbench.com answering with a server error at every attempt. The raw message gives the code. Nothing ran | A server error (http_5xx, internal_error) is on VoxelBench's side: launch again later, and report it if it persists. Otherwise, update VoxelBench to the latest release, then launch again |
plugin_network_error | VoxelBench could not reach voxelbench.com to validate the run, even after retrying. Nothing ran | Run /bench ping and allow outgoing HTTPS to voxelbench.com |
plugin_rate_limited | voxelbench.com refused VoxelBench's challenge request: it hands out at most 150 challenges per hour to one IP address, and every signed request of the plugin (validating a run, sending a report or a unit test) starts with one. Servers that share the same outgoing address share this budget. Nothing ran | Launch again later: the budget frees up within the hour. If it keeps happening, look for what else sends to VoxelBench from that address, such as other servers on the same machine or repeated manual benchmarks (see Rate Limits) |
unauthorized_plugin | voxelbench.com does not recognise this VoxelBench jar | Install the latest official release, unmodified, and restart the server |
Codes and Server Identity
| Code | What happened | What to do |
|---|---|---|
invalid_nonce, nonce_expired, nonce_consumed, target_missing | The run's one-time code was unknown, past the run's deadline or already used, or the target was deleted meanwhile | Nothing to fix on the server: launch a new run. If invalid_nonce keeps coming back, check that no plugin rewrites the bot's commands |
server_mismatch | The server the bot reached is not the one the target was created for | Make sure the bot lands on the server you verified, behind a proxy too. If the server's identity changed (a reinstall without plugins/VoxelBench/identity.yml), link and verify it again, then create a new target |
Runs Ended on Purpose
| Code | What happened |
|---|---|
cancelled_by_user | Cancelled from the dashboard or the API |
cancel_timeout | Cancelled, but the agent did not confirm within 5 minutes; the run was closed anyway |
aborted_in_game | Someone ran /bench stop on the server, or the console did |
agent_shutdown | The bench agent was restarted during the run, by an update on VoxelBench's side: launch it again |
rescheduled | A certification run moved to another time by VoxelBench's moderation; the replacement run appears at its new time |
user_cancelled | A certification run cancelled by VoxelBench's moderation |
None of these counts as a failure of the target.
Other Errors
| Code | What happened | What to do |
|---|---|---|
expired | The run reached its deadline without finishing: no agent picked it up in time, or the agent running it stopped reporting (crash, restart, lost network) before the end. Nothing was measured | Launch it again; report it if it happens to runs that had already started |
agent_crash | The bench agent hit an unexpected error, or a run ended without its report: the plugin finished the benchmark, but its report was refused or could not be sent. The raw message then starts with report-fail for a single run, or with run-fail when one run of a multi-run job failed (the plugin then abandons the remaining runs), followed by the reason. For a Unit test job, the server must be linked | For report-fail or run-fail, update VoxelBench to the latest release and check that the server reaches voxelbench.com (/bench ping). Otherwise, read the raw message and report it if it keeps happening |
unknown | An error the agent does not classify | Read the raw message, and look the plugin's code up in Auto-bench; report it if the message says nothing useful |