ajdnikov Dashboard

AjdnikovPanel Documentation

Version 1.2.0Hub Velocity 3.4+ or PaperAgents Paper 1.21.xJava 25Storage SQLite (built in)

AjdnikovPanel is network-wide monitoring for Minecraft servers: a live web dashboard, lag analysis in plain words, player inspection, alerts and a Discord bot. One hub runs inside your proxy (or one Paper server) and one agent runs on every server you want to watch. You open the dashboard from your AnziLock account — the hub connects out to it, so there is no dashboard port, password or address to set up.

Getting Started

Requirements

  • Java 25 on the hosts
  • Paper 1.21.x for agents and the standalone hub, and/or Velocity 3.4+ for the proxy hub
  • A licence key from AnziLock for the hub, and an outgoing HTTPS connection to it. Agents need neither.
  • Folia is not supported

Components

JarInstall onData folder
Panel-Velocity-1.2.0.jarThe Velocity proxy — hosts the hub and the Discord bot (recommended for networks)plugins/ajdnikovpanel/
Panel-Paper-1.2.0.jarOne Paper server, for setups without a proxyplugins/AjdnikovPanelHub/
Panel-Agent-1.2.0.jarEvery Paper server you want to monitorplugins/AjdnikovPanel/

Install one hub. It collects what the agents send, stores history in a local SQLite file and sends Discord alerts. No database server, Docker or extra process is needed. The panel has no in-game commands: everything is done from the dashboard, the config files and the Discord bot.

How the pieces connect

  • Agents → hub: each agent batches what it collects and ships it every ~500 ms, either through the proxy's ajdnikov:panel plugin-message channel or over HTTP to the hub's port.
  • Hub → you: the hub opens an outgoing, licence-checked connection to AnziLock (the relay), and AnziLock passes your dashboard through it. You never expose a dashboard port or run a tunnel yourself.
  • Hub → agents: commands such as "scan now" go back over the proxy channel when possible, and in the answer to the agent's next HTTP batch.

Installation

Step 1: Install the hub

On Velocity (recommended)

  1. Put Panel-Velocity-1.2.0.jar into the proxy's plugins/ folder and start the proxy once. This creates plugins/ajdnikovpanel/config.properties.
  2. Set your licence key — everything else has sensible defaults:
    licenseKey=ANZI-XXXXX-XXXXX-XXXXX-XXXXX
  3. Restart the proxy. The log shows Dashboard relay connected. Open the dashboard at https://license.ajdnikov-dev.com/networks/...

Problems in config.properties are logged as config.properties: ... warnings.

On Paper (no proxy)

Put Panel-Paper-1.2.0.jar into one Paper server's plugins/ folder instead and configure plugins/AjdnikovPanelHub/config.properties the same way. Every monitored server — including the one hosting the hub — then reports over HTTP, and the topology view shows them as standalone servers.

Step 2: Open the dashboard

Sign in at license.ajdnikov-dev.com with the Discord account your licence belongs to and open Networks. Each hub running on your licence is listed with its status and players; open it to see the dashboard. Links in Discord alerts go straight to the right page.

Step 3: Register each server

In the network, open Settings → Servers. Enter a name and, optionally, an id (e.g. survival), pick the type, and choose Register.

TypeMeaning
BACKENDBehind the Velocity proxy that hosts the hub
STANDALONEAnything else: its own IP, another network, or the hub-on-Paper setup

The dialog shows the API key (pk_...) once, with a ready-made config snippet. If you lose it, use New key.

Step 4: Install the agent on each server

  1. Put Panel-Agent-1.2.0.jar into the server's plugins/ folder and start it once. Optional: install Vault and an economy plugin to see player balances.
  2. Edit plugins/AjdnikovPanel/config.yml and paste the snippet from step 3:
    server-id: "survival"
    api-key: "pk_..."
    hub-url: "http://proxy-host:8080"
    transport: auto
  3. Restart the server. It shows up in the dashboard with its first heartbeat, within 10 seconds.
  • server-id must be the id the key was issued for.
  • hub-url is the hub's port on the machine running it — the agent port, not a dashboard.
  • transport: plugin-message uses the proxy channel and only works for backends behind the Velocity hub, and only while a player is online to carry the messages. http sends to hub-url — use it for standalone servers and the hub-on-Paper setup. auto (default) uses HTTP when hub-url and api-key are set, and plugin messages otherwise.

Set hub-url even on backends. HTTP is the only way the agent knows its data arrived, and it works whether or not anyone is online.

Step 5: Optional extras

  • Real item icons: set acceptMojangEula=true (see Item icons).
  • Discord alerts and bot: see Discord.
  • HTTPS for agents: see HTTPS.

Firewall & Upgrading

TrafficPortNeeded when
Hub → AnziLock (HTTPS, WebSocket)443 outboundAlways: licence checks and the dashboard relay
Agent → hub (HTTP)port (8080) inboundAgents using http or auto
Hub → Discord (HTTPS, WebSocket)443 outboundDiscord is configured
Hub → Mojang (HTTPS)443 outboundacceptMojangEula=true, once

Nothing needs to reach the hub from the internet. If every agent runs on the same machine or only uses plugin-message, set bindAddress=127.0.0.1 and open no inbound port at all.

Upgrading

Replace the jars and restart. The hub migrates panel.db itself, and new settings are appended to your config.properties with explanations. Your existing values stay untouched.

  • From 1.1 and older: the dashboard moved to AnziLock. adminPassword, sessionHours and publicUrl are no longer used (the hub says so once per start; you can delete them), and the hub's port now only receives agent data. Nothing else changes for agents.
  • From versions with a single discordWebhookUrl: it moved to discord.webhook.url. The old key keeps working until you move it; the hub logs a reminder.

Hub: config.properties

The hub's file lives in plugins/ajdnikovpanel/ (Velocity) or plugins/AjdnikovPanelHub/ (Paper). It is written as a commented template, grouped into sections. When an update adds settings, they are appended to the end of your existing file with their explanations; your values are never rewritten. Restart the proxy or server after editing.

Values are checked at start-up. Anything the hub cannot use — misspelled names, numbers out of range, unknown event names, malformed Discord IDs — is logged as a warning and the default applies instead:

[AjdnikovPanel] config.properties: unknown setting 'prot' is ignored (typo?)
[AjdnikovPanel] config.properties: heartbeatMisses='0' is not a whole number from 1 to 360; using 3

Booleans accept true/false, yes/no and on/off. Paths are relative to the plugin folder unless absolute.

License

SettingDefaultDescription
licenseKey(empty)Your licence key (ANZI-...). The hub does not start without a valid key.

Agent connections

SettingDefaultDescription
port8080Port agents send their data to (transport: http or auto).
bindAddress0.0.0.0Interface to listen on. 127.0.0.1 is enough when every agent runs on this machine or reports through the proxy.

HTTPS

Only needed when agents send over untrusted networks. On a trusted LAN plain HTTP is fine; behind a reverse proxy that handles HTTPS, leave this off.

SettingDefaultDescription
tlsEnabledfalseServe HTTPS instead of HTTP. Agents then use https:// in their hub-url.
tlsCert(empty)PEM certificate chain, e.g. fullchain.pem.
tlsKey(empty)PEM private key in PKCS#8 format. Convert with openssl pkcs8 -topk8 -nocrypt -in key.pem -out key-pkcs8.pem.

Monitoring and alerts

SettingDefaultDescription
heartbeatMisses3Agents send a heartbeat every 10 s. After this many missed heartbeats in a row, a server is reported down (3 = 30 s).
lagAlertCooldownMinutes10A lag alert for the same cause on the same server is not repeated within this time. A different main cause alerts immediately.

Data retention

History lives in panel.db (SQLite) in the plugin folder. Expired rows are deleted once an hour.

SettingDefaultKeeps
retention.metricsHours24TPS, tick time, memory and CPU graphs
retention.lagReportsHours24Lag analysis reports
retention.interactionsDays7Logged sign placement, edits and clicks, and crafting
retention.historyDays90Alerts, player routing, dupe flags and finished play sessions
retention.consoleLines1000Console lines kept per server

Item icons

SettingDefaultDescription
acceptMojangEulafalsetrue lets the hub download the official Minecraft client jar from Mojang once (about 35 MB) to draw real item icons. Setting it means you accept the Minecraft EULA. Offline hubs can instead copy a client jar to assets/client.jar in the plugin folder.
assetsVersionautoMinecraft version for the icons; auto uses the version your servers report.

Discord webhooks

SettingDefaultDescription
discord.webhook.url(empty)Webhook URL. Empty means no webhook.
discord.webhook.eventsallEvents to post, comma-separated: server-down, server-up, dupe-flag, lag, lag-over, or all.
discord.webhook.servers(empty)Only post about these server ids, comma-separated. Empty means every server.
discord.webhook.mention(empty)Who to ping on server-down, dupe-flag and lag: @here, @everyone, a role ID, or <@&role>/<@user>. Recoveries never ping.
discord.usernameAjdnikovPanelName webhook posts appear under.
discord.avatarUrl(empty)Avatar for webhook posts. Empty uses the webhook's own avatar.

Additional webhooks: repeat the four discord.webhook.* settings under a name of your choice, e.g. discord.webhook.staff.url, .events, .servers and .mention.

Discord bot

SettingDefaultDescription
discord.bot.enabledfalseRun the bot.
discord.bot.token(empty)Bot token from the Developer Portal. Keep it secret.
discord.bot.guildId(empty)Your Discord server's ID. Commands appear there instantly and are refused elsewhere. Empty registers global commands.
discord.bot.alertChannelId(empty)Channel the bot posts alerts to. Empty means the bot posts no alerts.
discord.bot.alertEventsallEvents the bot posts (same names as for webhooks).
discord.bot.alertMention(empty)Who the bot pings on urgent alerts (same format as discord.webhook.mention).
discord.bot.allowedRoleIds(empty)Role IDs allowed to use the commands, comma-separated. Members with Administrator always may. Empty means everyone who can see the commands.
discord.bot.ephemeraltrueAnswer privately: only the member who ran the command sees the answer.
discord.bot.presencetrueShow "Watching 4/5 servers · 23 players" as the bot's status.

A complete example

licenseKey=ANZI-XXXXX-XXXXX-XXXXX-XXXXX
port=8080
bindAddress=127.0.0.1

heartbeatMisses=3
retention.historyDays=30

acceptMojangEula=true

# everything to #server-status, pinging @here when something breaks
discord.webhook.url=https://discord.com/api/webhooks/123/abc
discord.webhook.mention=@here
# dupe flags from survival only, to the staff channel, pinging the Moderator role
discord.webhook.staff.url=https://discord.com/api/webhooks/456/def
discord.webhook.staff.events=dupe-flag
discord.webhook.staff.servers=survival
discord.webhook.staff.mention=987654321098765432

discord.bot.enabled=true
discord.bot.token=MTIz...
discord.bot.guildId=112233445566778899
discord.bot.allowedRoleIds=987654321098765432

Agent: config.yml

Each monitored server has plugins/AjdnikovPanel/config.yml, created with defaults on first start. Restart the server after editing.

SettingDefaultDescription
server-id""This server's id on the hub. Must match the server the API key was issued for; the hub rejects data for any other id.
server-name""Display name (informational).
transportautoplugin-message, http or auto — see Step 4.
hub-url""The hub's address, e.g. http://proxy-host:8080. Required for http; recommended for auto.
api-key""The pk_... key from Settings → Servers → Register.
heartbeat-interval-seconds10How often the server says "I'm alive". Keep 10: the hub's down detection counts in 10 s steps.
metrics-sample-seconds5How often TPS, memory and CPU are sampled.
metrics-report-seconds15How often samples are sent.
console-streamingtrueStream console output to the dashboard.
dupe-detection.enabledtrueHeuristic duplication detection. It only flags; it never punishes.
dupe-detection.stack-threshold128Flag a player holding more than this of one material.
dupe-detection.jump-threshold64Flag an unexplained gain of more than this within the window.
dupe-detection.window-seconds60Window for gain accounting.
lag-analysis.enabledtrueScan for lag causes (needed for /lag, /scan and lag alerts).
lag-analysis.interval-seconds300Scan interval while the server runs fine.
lag-analysis.lagging-interval-seconds30Scan interval while it lags.
lag-analysis.scan-budget-ms1.0Main-thread time a scan may use per tick. Scans are spread over as many ticks as needed, so a scan cannot cause lag itself.
lag-analysis.spike-samplertrueSample the main thread during slow ticks to measure which plugin or game system is responsible. Costs nothing while ticks are on time.
lag-analysis.spike-threshold-ms50A tick longer than this counts as slow (minimum 20).

Discord

Use webhooks, the bot, or both. Everything runs inside the hub — no separate bot host or extra plugin — and no outgoing Discord connections are made until you configure it.

What alerts look like

Every alert is an embed, coloured by type, that links to that server's dashboard page on AnziLock.

EventName in configPings?Contents
Server stopped reportingserver-downyesLast heard from, players affected
Server reporting againserver-upnoHow long it was down
Dupe flagdupe-flagyesPlayer (with head), item and amount, reason, recent events
Lag started, or the main cause changedlagyesTPS, tick time, main cause, where (with a /tp command), what to do
Lag is overlag-overnoCurrent TPS

Player names are escaped, so xX_Steve_Xx doesn't turn into italics. Lag alerts for the same cause are rate-limited by lagAlertCooldownMinutes.

Webhooks

  1. In Discord, open the channel's settings → Integrations → Webhooks → New Webhook, then Copy Webhook URL.
  2. Set discord.webhook.url=... in the hub's config.properties.
  3. Restart, then open Settings → Discord in the dashboard and press Send test message. Each webhook reports ✓, or the reason it failed.

Choosing what goes where

# the main webhook: everything, pinging @here when something breaks
discord.webhook.url=https://discord.com/api/webhooks/123/abc
discord.webhook.events=all
discord.webhook.mention=@here

# staff channel: only dupe flags, only from survival and skyblock, pinging a role
discord.webhook.staff.url=https://discord.com/api/webhooks/456/def
discord.webhook.staff.events=dupe-flag
discord.webhook.staff.servers=survival,skyblock
discord.webhook.staff.mention=987654321098765432

# ops channel: availability only, nobody pinged
discord.webhook.ops.url=https://discord.com/api/webhooks/789/ghi
discord.webhook.ops.events=server-down,server-up

The name between discord.webhook. and .url is yours to choose (letters, digits, - and _). It appears in the dashboard and in log messages, so a webhook URL — which works like a password — is never logged or shown. If Discord rate-limits a webhook, the hub waits as long as Discord asks and retries up to three times.

Mentions

ValuePings
(empty)Nobody
@here / @everyoneOnline members / everyone in the channel
987654321098765432 or <@&987654321098765432>That role. The role must be mentionable, or the webhook needs permission to mention it.
<@123456789012345678>That user

The bot

  1. Create it: at discord.com/developers/applications choose New Application, open Bot, Reset Token and copy it. Consider turning Public Bot off. The bot needs no privileged intents.
  2. Configure the hub:
    discord.bot.enabled=true
    discord.bot.token=MTIzNDU2Nzg5...
    discord.bot.guildId=112233445566778899
    With guildId set, commands register in that server instantly and the bot refuses to answer anywhere else. Without it, commands are global and can take a while to appear.
  3. Invite it: restart the hub. Settings → Discord shows Bot connected as YourBot and an invite button (scopes bot and applications.commands, with View Channel, Send Messages and Embed Links). Once invited, commands register within a minute — no restart needed.
  4. Optional — alerts from the bot: set discord.bot.alertChannelId, alertEvents and alertMention. Send test message checks the channel together with the webhooks.

Bot commands

CommandAnswers with
/statusEvery server: online or offline, TPS, players, lag state. The footer has totals.
/server server:<id>One server: status, players, TPS, tick time, CPU, memory, uptime, chunks, lag verdict.
/players [server:<id>]Who is online, per server or on one server.
/player name:<name>Online or last seen, server, location, health, food, game mode, balance (with Vault), effects, session length. Works for offline players too.
/lag server:<id>The latest lag analysis: verdict and up to five likely causes, each with where it is and what to do.
/scan server:<id>Runs a lag scan now and edits in the result when the server reports back (up to 90 s).
/alerts [count:<1-20>]The most recent alerts.

Server and player options autocomplete, and you can type a server's display name as well as its id.

Who can use the commands

The bot's answers include player locations, so decide who sees them:

  • discord.bot.ephemeral=true (default): answers are visible only to the member who asked.
  • discord.bot.allowedRoleIds: only members with one of these roles, or with Administrator, get answers.
  • Discord's own command permissions (Server Settings → Integrations → your bot) can hide commands from roles or channels. /scan is limited to members with Manage Server by default.
  • discord.bot.guildId: the bot answers only in your server, even if someone else invites it.

With discord.bot.presence=true the bot's status reads Watching 4/5 servers · 23 players, refreshed every minute.

Dashboard

Sign in at license.ajdnikov-dev.com and open Networks. Every hub on your licence is a network there, with a lamp that is lit while it is connected, its players and servers, and its version (flagged when an update is available). Every view updates live; the header shows Live while the feed is connected. A network that is not connected still opens and explains why: the hub is down, or it runs a version older than 1.2.

Overview

Players online, servers up, average TPS and how many servers lag; each proxy with its backends and the standalone servers as a rack of modules (status lamp, TPS, players, lag verdict); live player routing; and Players and uptime over 24 hours, 7 or 30 days, sampled every 5 minutes.

Server

  • Health: memory, CPU, disk, uptime, worlds and loaded chunks, and TPS and tick-time (MSPT) graphs over retention.metricsHours.
  • Lag analysis: see below.
  • Players: who is online, linking to their player pages.
  • Console: a live tail of the server console (console-streaming).

Player

Session time, live health, hunger and effects, Vault balance, location, game mode and routing history. The inventory and ender chest are drawn like in the game, with real item and block icons, durability bars, enchantment glint, and tooltips showing lore and shulker box or bundle contents. Also: the player's dupe flags and logged interactions (signs placed, edited or clicked, and crafting). The inventory view is read-only.

Alerts & the dupe detector

Servers going down or coming back, dupe flags, and lag starting, changing cause or ending — newest first, with live additions.

The dupe detector is a deliberately simple heuristic: a big stack of one material, or an unexplained jump within a window. It flags players for you to check and never punishes anyone. Gains it can account for are not flagged: mining, crafting (shift-click included), picking items up, trading, and taking items out of chests, ender chests, furnaces and other open inventories. What a player carries when they join is their starting point, and players in creative or spectator mode are not checked for gains.

Settings

  • Servers: register servers and get their API keys, issue new keys, delete servers.
  • Item icons: which game version the icons come from. The network's Item icons tab renders every item and lists any that could not be drawn — run it after a Minecraft update.
  • Discord: configured webhooks and their filters, the bot's state, where its commands are registered, an invite link, and Send test message.
  • Sharing and Support access (licence owner only).

Lag Analysis

The agent measures; the hub explains. Each server page starts with a one-line verdict, e.g. Lagging: 14.9 TPS, a tick takes 68 ms, followed by the likely causes in plain words, most impactful first:

Hoppers are slowing the server: 713 hoppers across 2 neighbouring chunks
in world at 200, 64, -110 (near Steve)

Each cause expands into every location (with a copyable /tp), the numbers behind it, what to do about it and, for measured causes, a stack sample.

  • Confirmed causes are backed by timing: during slow ticks the agent samples the main thread and attributes the time to plugins or game systems.
  • Possible causes are large counts known to be expensive: hopper piles, crowded mob farms, redstone clocks, force-loaded chunks and so on.

Scans run every 5 minutes, every 30 seconds while the server lags, and on demand with Scan now (or /scan in Discord). Scans are time-sliced, so they cannot cause lag themselves. On a healthy server every finding is capped at info.

Sharing & Support Access

WhoCan
The licence ownerEverything
People shared as AdminEverything except changing who has access
People shared as ViewerLook only: no server registration, keys, scans or Discord tests
AnziLock staffOnly whether the network is up, its players, servers and version. They can look inside, read-only, only while you grant support access.
  • Sharing: enter the Discord name or ID of someone who has signed in to AnziLock once and pick Viewer or Admin. Sharing applies to every network on that licence; remove people at any time.
  • Support access: when you need help, let staff look for 1 hour up to 7 days. End it early with End now.

Every visit by someone other than the owner, every change made through the dashboard, and every sharing or support change is written to AnziLock's audit log.

Licensing & Relay

Licensing

The hub is licensed through AnziLock. Agents need no key; they are useless without a licensed hub.

  • At start-up the hub verifies licenseKey before it starts, and re-checks on the server-chosen heartbeat (by default every 10 minutes).
  • Every answer is Ed25519-signed and bound to a fresh nonce and this machine's hardware id. The public key is compiled into the jar.
  • If the licence server is unreachable, the hub keeps running on its last signed OK for the product's grace period (cached as .license-* in the plugin folder). A hub that has never been verified cannot start offline.
  • When a licence is rejected, the product's failure action runs: disable, shut down the server or proxy, or warn only.

The dashboard relay

The dashboard is not served from your machine. Once the licence is valid, the hub opens a WebSocket to AnziLock and proves itself with the licence key and this machine's hardware id. AnziLock answers with a welcome signed by the same Ed25519 key, bound to the hub's nonce; the hub refuses anything else, so a fake server cannot drive it.

From then on AnziLock signs people in with Discord, decides who may open the network, and passes their requests down the socket. The hub answers them from a dashboard API that listens on 127.0.0.1 only, on a random port, and accepts nothing that did not come through the relay.

  • The relay reconnects on its own (1 s up to 1 min back-off). If AnziLock refuses the licence, it retries every 5 minutes.
  • Every 15 seconds the hub reports player counts and server states for the network list. Nothing about individual players leaves the hub except while someone is looking at the dashboard.
  • While AnziLock is unreachable the hub keeps collecting, storing and alerting; only the dashboard is unavailable.

Security & Backups

Security checklist

  • Limit exposure. The hub's port only receives agent data. If every agent runs on this machine or uses plugin-message, set bindAddress=127.0.0.1; otherwise allow only your agents' addresses.
  • Use HTTPS on untrusted networks (tlsEnabled or a reverse proxy). Agents send their API key with every request.
  • Share deliberately. Viewers and admins can see player locations, inventories and console output. Remove them when they leave.
  • Treat secrets as secrets: the licence key, API keys (pk_..., stored only as SHA-256 hashes and shown once), Discord webhook URLs and the bot token. The hub never logs or displays webhook URLs or the bot token.
  • Discord bot: set guildId, keep ephemeral=true or restrict allowedRoleIds, and turn off Public Bot.

Data and backups

PathWhat
config.propertiesSettings
panel.db (+ -wal, -shm)SQLite database: servers, API key hashes, metrics, sessions, alerts, lag reports, console
assets/Extracted textures and the icon manifest (rebuilt automatically)
.license-*Signed licence cache

To back up, stop the proxy or server, or copy all three panel.db* files together.

Troubleshooting

SymptomCheck
Network shows not connectedThe hub log: Dashboard relay connected means it is up. Dashboard relay cannot connect names the reason — outgoing HTTPS to license.ajdnikov-dev.com blocked, or the licence refused.
Network missing under NetworksYou are signed in with a different Discord account than the licence owner, or the hub runs a version older than 1.2.
Hub doesn't startLicence messages in the log; config.properties: warnings; a port conflict on the agent port (Failed to start AjdnikovPanel hub).
A server never shows upserver-id matches the registered id; api-key is correct; with http, hub-url is reachable from that machine (try <hub-url>/api/health); with plugin-message, a player must be online.
A server flips between down and upIts heartbeats arrive late: an overloaded main thread or a slow network. Raise heartbeatMisses.
payload is for server 'x' but the API key belongs to 'y'server-id in the agent's config.yml doesn't match the key.
Item icons missingSettings → Item icons shows the state. Without acceptMojangEula=true or assets/client.jar, the dashboard shows names only.
Disk keeps growingLower the retention.* settings; console lines are capped per server.

Discord

SymptomCause and fix
Settings → Discord says Not set upNo webhook URL and the bot isn't enabled. Check config.properties and the start-up log.
Test message: HTTP 404: Unknown WebhookThe webhook was deleted. Create a new one and update the URL.
Test message: HTTP 401The webhook URL was copied incompletely (the part after the last / is its token).
Bot stopped: Discord rejected the bot tokenWrong or reset token. Copy a fresh one from the Developer Portal.
Commands don't show upWithout guildId they are global and can take a while; set guildId. Also check Server Settings → Integrations for hidden commands.
Commands show up twiceThe bot ran once without guildId and later with it, so both sets exist. Remove the global set through Discord's API: curl -X PUT -H "Authorization: Bot <token>" -H "Content-Type: application/json" -d "[]" https://discord.com/api/v10/applications/<application id>/commands
Bot channel: HTTP 403: Missing PermissionsGive the bot View Channel, Send Messages and Embed Links in the alert channel.
/scan times outThe agent has lag-analysis.enabled: false, or it is an HTTP agent that cannot reach the hub.
Links in embeds are missingThe hub has not connected to AnziLock yet since it started.

Need more help?

Join the Discord server for support and bug reports. If you want someone from AnziLock to look at your network, grant support access first.