Documentation
The plugin generates plugins/TunnelVision/config.yml on its first start. This page walks through every key, in the order they appear in the file. Nothing is computed inside the plugin itself: every command queries the analysis service (analysis-api.url) — the gateway (gateway.*) only feeds that service, it is not what makes the commands work.
Two blocks really matter to get started: analysis-api.url + analysis-api.api-key (given to you when your access is created) so the commands work, and gateway.token so your CoreProtect history reaches the service. Everything else ships with defaults that suit most servers.
The comments below are translated for this page. The config.yml the plugin generates currently ships with French comments — the keys and values are of course identical.
.jar) into plugins/, with CoreProtect already installed and running. Start the server once: config.yml is generated with its default values.analysis-api.url and analysis-api.api-key with your service URL and the key handed over when your access was created (during the beta: via Discord or email — see API authentication).gateway.token (replace CHANGE_ME) and pass it to the TunnelVision team along with the address to reach your server, so the central service can synchronise your history — how to connect securely (SSH tunnel or VPN, never a directly open port) is covered during onboarding.reload subcommand) — any change to config.yml requires a restart./tunnelvision status (in game): it should return the head of your CoreProtect history without an error.The gateway token travels in clear over the network if you do not protect it: never expose it directly on the internet (gateway.bind: 0.0.0.0 without a firewall). An SSH tunnel or a VPN between your server and the central service is the only recommended route.
Leave as is unless you use a custom schema. The database is only ever opened strictly read-only — the plugin never creates, modifies or deletes anything in it.
# Path to the CoreProtect database, relative to the server folder. coreprotect-db-path: "plugins/CoreProtect/database.db" # CoreProtect table names — only change these if your schema differs. table: block: "co_block" user: "co_user" material-map: "co_material_map" world: "co_world"
gateway)A small read-only HTTP server, local to your machine, that serves slices of your CoreProtect history to the central service so it can keep its mirror up to date. It plays no part in any command (score, suspects, render, menu): those talk only to analysis-api.url. Without a valid token the plugin still starts — it simply disables the gateway and the daily sync, and says so in the logs.
gateway: bind: "127.0.0.1" # local access only — recommended port: 8787 backlog: 0 threads: 4 # requests served in parallel token: "CHANGE_ME" # required to enable the gateway max-page-size: 50000
analysis-api / sync)Required: nothing is computed in the plugin, every command queries this URL. The plugin disables itself on startup if it is empty.
analysis-api: url: "http://127.0.0.1:8000" # your service URL (see the API docs) api-key: "" # tenant key, handed over once # Automatic daily synchronisation to the central service (pure JVM, no external # dependency): reuses gateway.token + analysis-api above, and catches up on the # next start if the server was offline at the scheduled time. sync: enabled: true
scoring)The default scope of /tunnelvision score, suspects and render — which sessions are relevant enough to be analysed, not how they are scored.
scoring: default-ore: "diamond" # target ore when --ore is not given min-ore-blocks: -1 # -1 = internal default (1) · 0 = filter disabled ore-families: "" # "" = diamond,ancient_debris · see below
ore-families: the families counted by min-ore-blocks, comma-separated — additive (a session is kept as soon as any single family reaches its threshold). Grammar: all (all ten families), -family (removes one), family:N (its own threshold). Coal is out of scope by default — it is the ore nobody ever investigates.
| Example | Effect |
|---|---|
"" | Plugin default: diamond + ancient debris. |
all,-coal | Everything except coal. |
diamond:1,emerald:3 | A threshold per ore. |
all,coal:0 | A zero threshold removes the family (same as -coal). |
report)Settings for /tunnelvision render and the in-game menu — delegated to analysis-api.url, and reusing the scoring.* filters above to decide which sessions show up.
report: output-subdir: "" # subfolder of plugins/TunnelVision/figures/ max-page-size-mb: 0 # 0 = the API applies its own default identify-by-default: true # real names/coordinates by default
identify-by-default: true means /tunnelvision render produces identified renders unless you pass --anonymize to the command; set it to false to invert that behaviour (--identify stays available case by case).
A single permission controls everything: tunnelvision.admin (no access by default, not even for operators). Grant it to your moderators and above with a permissions plugin such as LuckPerms: /lp group moderator permission set tunnelvision.admin true.
| Command | Purpose |
|---|---|
/tunnelvision status | Head of your CoreProtect history (confirms everything is wired up). |
/tunnelvision score <player> [window] [--ore family] | A player's suspicion score over a period. |
/tunnelvision suspects [window] [--min-score N] [--ore family] | Sorted list of the most suspicious sessions. |
/tunnelvision render <start> <end> [--identify|--anonymize] [--annotate|--no-annotate] | Generates the 3D HTML rebuild. |
/tunnelvision menu | In-game graphical interface (see the menu demo). |
A question about a specific setting, or behaviour that does not match this page: Discord · contact@tunnelvision.fr.