Команды 4#
Примеры#
Поднять API вручную и снять адрес#
В поставке webDashboard.autoStart: false и port: 8080 — после старта сервера HTTP молчит, пока не выполните start.
/dashboard status
/dashboard start
/dashboard url
status печатает running/offline, включён ли конфиг и, если останавливали командой, пометку manually disabled. start поднимает REST и WebSocket (websocketPort, в поставке 8081). url повторяет базовый http://: и отказывается, если сервер не запущен. Если enabled: false — start отвечает disabled_in_config и ничего не слушает.
Ключ для внешней панели#
Laravel/внешний бэкенд ходит в /api/* с Authorization: Bearer. Человеческий логин для этого не нужен.
/apikey create farmstead-dash ADMIN
/apikey list
/dashboard status
create печатает токен один раз — его кладут в server-side конфиг панели, не в браузер. list показывает id (он нужен для revoke) и last used: never, пока ключом не воспользовались. GET /api/ping без заголовка должен ответить 200 и {"success":true,"mod":"neoessentials","mode":"external|internal"} — это проверка порта, не ключа.
Игрок регистрирует свой аккаунт панели#
Не API-ключ, а логин/пароль для человека. Два шага: токен, затем complete.
/dashboardregister start
/dashboardregister complete steve_admin S3cretPass
/dashboardregister status
start выдаёт одноразовый токен на 5 минут. complete ищет pending по UUID (токен в чат повторно слать не нужно), проверяет длину имени/пароля и создаёт dashboard user, привязанный к этому Minecraft-аккаунту. Если у игрока уже связан Discord через компаньон-мод, complete дополнительно автолинкует его. Повторный start у уже зарегистрированного — already_registered. status показывает имя в панели, ник, время и Discord.
Регистрация через связанный Discord#
Пароль не задаём: вход потом кнопкой Discord на стороне панели, если компаньон-мод отдаёт link.
/dashboardregister discord
/dashboardregister status
Нужен установленный и ready Simple Discord Link, Mc2Discord или DCIntegration плюс уже связанный Discord у этого UUID. Успех создаёт аккаунт с dashboard-именем = ник Minecraft. Если компаньона нет — discord_unavailable и совет идти в start/complete. DiscordSRV не поддерживается (это Bukkit-плагин). Сам NeoEssentials в discord.com не ходит.
Сопряжение с внешней панелью и привязка ника#
Панель показывает код на своей Configuration/Settings; мод отдаёт ей API-ключ и запоминает обратный токен.
/dashboard pair "https://dash.example.com" ABCD1234
/linkaccount K7MNPQ2R
/dashboard unpair
pair (кавычки обязательны) POST на {url}/api/pair/complete с code, modToken (новый ключ label dashboard-pairing, роль ADMIN), serverName и websocketPort. 200 + dashboardToken — url/token/keyId пишутся в webDashboard.externalDashboard. Код linkaccount игрок берёт со страницы Settings (POST /api/auth/link-minecraft/start); успех связывает этот ник с тем dashboard-аккаунтом. unpair отзывает ключ pairing и чистит externalDashboard.
Тонкие места#
internal vs external — другая страница#
Как слушается порт, что отдаёт /, и чем webDashboard.mode (external в поставке, internal/both) отличается при диагностике «панель не коннектится», разобрано на странице подключения панели. Здесь достаточно: mode читается при старте HTTP, /neoe reload его не меняет; /api/ping жив в любом mode и без Bearer.
Что делать: Смена mode — рестарт модового HTTP (/dashboard restart или рестарт сервера). Разбор bind/файрвола/ключа — страница «Подключение панели».
`/dashboard stop` ставит флаг до рестарта JVM#
stopDashboard поднимает static manuallyDisabled. На текущей сессии auto-start уже прошёл (он только в ServerStartedEvent), так что флаг в основном для status («override manually disabled»). После полного рестарта процесса флаг снова false: если autoStart: true, HTTP поднимется сам, даже если в прошлой сессии его останавливали командой. start сбрасывает флаг. restart не умеет поднимать уже лежащий сервер — сначала пишет not_running и предлагает start.
Что делать: В поставке autoStart: false — после рестарта сервера снова нужен /dashboard start, независимо от stop. Не путайте stop с webDashboard.enabled: false.
pair требует второй узел, URL только в кавычках#
Корень /dashboard пропускает OP 2 через validateAdminPermission. Ветка pair/unpair дополнительно делает validatePermission(neoessentials.dashboard.pair). При opsBypassPermissions: false оператор без этого узла стартует HTTP, но pair получит отказ. Unquoted string в Brigadier — [0-9A-Za-z_\-+.], двоеточие и слэш запрещены, поэтому http://127.0.0.1:3000 без кавычек не парсится. Хвост / с URL снимается. Не-200 или тело без dashboardToken — ключ dashboard-pairing сразу revoke.
Что делать: Всегда /dashboard pair "https://host" CODE. Для pair выдайте neoessentials.dashboard.pair (или оставьте OP-bypass включённым).
Два разных «привязать аккаунт»#
/dashboardregister создаёт новый dashboard user из онлайн-игрока (токен 5 мин, username 3–20, пароль ≥ 8). /linkaccount подтверждает владение ником для уже существующего dashboard user (код 8 символов, 5 мин, без пароля; нужен neoessentials.dashboard.linkaccount). Повторный link, пока UUID уже привязан, отвергается — сначала unlink через API. Регистрационный токен при рестарте сервера сгорает (только RAM). Первый запуск HTTP при пустой коллекции пользователей создаёт admin со случайным паролем в лог (Temporary password: …, смена на первом входе) — это не /dashboardregister.
Что делать: Игрок без аккаунта — register. Аккаунт заведён в панели/админом — Settings → код → /linkaccount. Потерянный пароль admin — смотрите boot-лог или сброс через /api/users/{id}/password.
WebSocket может умереть отдельно от REST#
И start, и auto-start ловят Throwable вокруг WebSocket (NoClassDefFoundError из отсутствующего Java-WebSocket не должен ронять сервер). HTTP при этом может быть running, а live-события на websocketPort — нет. status/url показывают только HTTP-URL, не WS.
Что делать: Если REST жив, а панель «не стримит» — смотрите лог WEB_DASHBOARD на Failed to start WebSocket server и что порт 8081 свободен и отличается от HTTP.
Известные проблемы#
Неизвестный role у /apikey create всё равно создаёт ключ ADMIN#
parseRole при мусоре вроде admins шлёт sendFailure «expected ADMIN, OPERATOR, MODERATOR, or VIEWER. Defaulting to ADMIN» и возвращает User.Role.ADMIN. Brigadier после этого всё равно вызывает create — ключ появляется, токен печатается. Failure не откатывает ветку.
Что делать: Сразу /apikey list: если роль ADMIN, а вы хотели VIEWER — /apikey revoke <id> и создайте заново. Не считайте красную строку в чате признаком, что ключа нет.
/apikey нельзя выключить секцией commands#
Соседние dashboard-команды смотрят isCommandEnabled. ApiKeyCommand.register этой проверки не делает: при загруженном моде /apikey в дереве есть всегда, закрыт только узлом neoessentials.dashboard.apikeys (плюс OP-bypass PermissionAPI для игроков и OP 2 для консоли).
Что делать: Уберите узел у не-админов. Выключить команду ключом commands.apikey: false в текущей сборке нельзя.
Права 4#
Подробное руководство#
Раздел ниже — исходная документация проекта (docs/Wiki/WebDashboard.md). Ссылки на другие страницы вики переписаны на этот сайт; текст самих руководств не редактируется, чтобы синк с апстримом не давал конфликтов.
Version: 1.0.5+build.54 · Config: config.json → webDashboard section (dashboard on/off is controlled by both webDashboard.enabled and modules.webDashboardEnabled — either one set to false disables it)
Overview#
NeoEssentials runs an embedded HTTP server (plus a WebSocket server for live updates) exposing a
full REST API for server monitoring and administration. There are now two ways to actually use
it, controlled by webDashboard.mode:
"external" (the shipped default) — the mod serves only /api/*; a separately-hosted
dashboard app (the NeoEssentials-Dashboard Laravel project) is the actual browser UI, talking
to this API from outside. See API System and docs/API.md for the
full REST/WebSocket reference it's built against.
"internal" / "both" — the mod serves its own bundled dashboard UI directly from /,
no separate app to install at all. As of build.13 this internal UI is feature-complete and
covers the same ground as the external app: Overview, Players (with a full per-player control
page), Economy, Warps, Kits, Holograms, Discord, dashboard account management, Backups,
Commands, Logs, Permissions, a public no-login player-lookup page, and (as of build.15) an
account Settings page — see Account Settings & Minecraft Account Linking
below. "both" is just an explicit alias for "internal", useful when you deliberately run the
built-in UI and point an external app at the same API at the same time.
The account system, permission model, and moderation/economy/etc. backing data described below
are shared by both dashboards — they're the same accounts and data either one authenticates
against and reads/writes through the API.
Setup#
- Set
webDashboard.enabled: true and modules.webDashboardEnabled: true in config.json (both default to true)
- Configure
port (default 8080) and websocketPort (default 8081)
- Start the server, then run
/dashboard start (webDashboard.autoStart ships false, so the
API server doesn't come up on its own unless you set autoStart: true)
- Create a credential for whatever's going to call the API:
- An external dashboard backend (recommended path): create an API key in-game —
/apikey create <label> [role] — and give the printed token to that dashboard's server
config. See API System → Authentication for the full picture.
- A human dashboard account: register in-game via /dashboardregister start then
/dashboardregister complete <username> <password> (or /dashboardregister discord if
Simple Discord Link is linked) — or use one of the other paths below.
- Point your external dashboard app at
http://<server-ip>:<port>/api/... (port from step 2)
using the API key or session token as a Bearer token.
Account Registration#
Players register their dashboard account in-game, via the separate /dashboardregister
command (not a subcommand of /dashboard) — they do not need to be online at login time after
registering.
/dashboardregister start
/dashboardregister complete <username> <password>
Or, if Simple Discord Link, Mc2Discord, or DCIntegration is installed and the player has linked their Discord account:
/dashboardregister discord
Requires permission neoessentials.dashboard.access. Registration tokens from start expire
after 5 minutes; passwords must be at least 8 characters. Run /dashboardregister status to
check your current registration state.
Other ways to get dashboard access:
- API key (for an external dashboard backend, not a human) —
/apikey create <label>
[role] in-game, or POST /api/apikeys once a first key exists. Not a login account at all;
see API System and docs/API.md.
- Default admin account — the first time the dashboard starts with no accounts at all, an
admin account is auto-created with a random temporary password, printed once to the
server console/log (Temporary password: ...) and flagged to require a password change on
first login. There is no fixed default password — check the boot log if you've lost it, or
reset it via /api/users/{id}/password (admin session) if you still have another admin
account.
- Minecraft-permission login (self-service, works offline, deprecated) — on the login page,
authenticate with just your Minecraft username (no password). The server checks whether that
player has
neoessentials.dashboard.access and auto-creates an account with role assigned
from neoessentials.dashboard.admin/.moderator/.access. Predates the /dashboardregister
flow above and is marked deprecated in server logs, but still functional.
- Discord OAuth (optional, self-service) — see below. If
allowAutoRegistration: true
(the default), logging in with Discord auto-creates an account on first use.
- Admin-created accounts — an existing admin can create accounts directly via
POST /api/users/create (or whatever user-management screen the external dashboard exposes
for it), or push-sync one from the external dashboard's own user table with
POST /api/users/sync — see docs/API.md.
Discord Auth (Optional)#
If a supported Discord companion mod — Simple Discord Link or Mc2Discord — is installed, players can link
their Discord account, and the dashboard can source their Discord identity and roles from it. The mod is fully
optional — standalone account registration works without it.
Discord-Linked Dashboard Identity#
NeoEssentials does not talk to Discord's API directly — no bot token, no OAuth2 code exchange, no REST calls to
discord.com. All Discord communication is delegated entirely to whichever companion mod is installed
(Simple Discord Link or Mc2Discord); NeoEssentials only reads the account-link data that mod already has.
How It Works#
Player links their account in-game (via SDLink's or Mc2Discord's own commands)
│
▼
ChatIntegrationManager.findLinkedDiscordId(uuid) ── checks whichever companion mod is ready
│
▼
DiscordAuthProvider ── resolves Discord ID + role IDs for that player
│
▼
Dashboard: GET /api/auth/discord?username=<name>
1. Look up the linked Discord account
2. Check blacklist / whitelist roles
3. Map Discord roles → dashboard role
4. Get-or-create dashboard user, create session
There is no "Login with Discord" OAuth2 button — a player must first link their account in-game through
Simple Discord Link's or Mc2Discord's own linking flow.
Companion mods#
| Mod |
Chat relay |
Account link lookup |
Notes |
| Simple Discord Link (SDLink) |
✅ |
✅ |
Real compile-time API (com.hypherionmc.sdlink.api.*), also requires CraterLib |
| Mc2Discord |
✅ |
✅ |
Real compile-time API (fr.denisd3d.mc2discord.core.*) |
| DCIntegration |
— (self-relays) |
✅ |
Real compile-time API (de.erdbeerbaerlp.dcintegration.common.*). Relays chat/join/leave/commands to Discord on its own via mixins — NeoEssentials doesn't push those events to it, only reads account links |
| DiscordSRV |
❌ |
❌ |
Not supported — it's a Bukkit/Paper plugin and cannot run on a NeoForge server |
Detection is purely runtime (ModList.isLoaded(...)) — neither mod is a hard dependency, and NeoEssentials works
fine standalone if neither is installed.
Config (discord_auth.json)#
Located at config/neoessentials/discord_auth.json. Auto-generated on first start.
| Key |
Default |
Description |
enabled |
false |
Enable Discord-linked dashboard identity/login |
requireLinkedAccount |
true |
Require the player's Minecraft account to actually be linked to Discord |
allowAutoRegistration |
true |
Auto-create a dashboard account on first Discord-linked login |
defaultRole |
VIEWER |
Dashboard role given when no Discord role is mapped |
Role mapping
Discord role IDs (not names) are mapped to dashboard roles. Enable Developer Mode in Discord Settings → Advanced, then right-click a role → Copy ID.
"roleMapping": {
"123456789012345678": "ADMIN",
"234567890123456789": "MODERATOR",
"345678901234567890": "VIEWER"
}
Whitelist / Blacklist
"whitelistedRoles": ["123456789012345678"], // only these role IDs can log in (empty = everyone)
"blacklistedUsers": ["987654321098765432"] // these Discord user IDs are always denied
Without a Discord companion mod#
If none of SDLink, Mc2Discord, or DCIntegration is installed, GET /api/auth/discord returns 503 — Discord-linked
login is unavailable entirely (there's no account-link data to read). Standalone username/password login
is unaffected.
Troubleshooting#
| Symptom |
Likely Cause |
GET /api/auth/discord/status reports linkAdapterAvailable: false |
No supported companion mod is installed, or its bot connection isn't ready yet |
| "No Discord account linked" error |
Player hasn't linked their account in-game via the companion mod's own command |
| "does not have a whitelisted role" |
User doesn't hold one of the whitelistedRoles IDs |
Config (config.json → webDashboard)#
| Key |
Default |
Description |
enabled |
true |
Enable the dashboard system |
autoStart |
false |
Start dashboard on server boot. If false (the shipped default), start it manually with /dashboard start |
port |
8080 |
HTTP port |
websocketPort |
8081 |
WebSocket port for live updates |
bindAddress |
"0.0.0.0" |
IP to bind (use 127.0.0.1 for local-only) |
mode |
"external" |
"external" serves only /api/* (default — use with the separate NeoEssentials-Dashboard app). "internal"/"both" also serves the mod's own bundled dashboard UI at / — see Dashboard Connectivity |
userSyncWebhookUrl |
"" (disabled) |
Optional: POST a notification here whenever a dashboard_user is created/updated/deleted, so an external dashboard can mirror the change into its own user table. See docs/API.md |
userSyncWebhookSecret |
"" |
HMAC-SHA256 secret for signing the webhook above (X-NeoEssentials-Signature header) |
securitySettings.requireAuthentication |
true |
Require a Bearer token (session or API key) on dashboard API endpoints |
securitySettings.enableRateLimiting |
true |
Enable per-IP rate limiting on the dashboard API |
securitySettings.maxRequestsPerMinute |
60 |
Max API requests per IP per minute when rate limiting is enabled |
securitySettings.publicModerationLookupEnabled |
true |
Enable the no-login /api/public/moderation/* routes (see below) |
roleSync.enabled |
false |
Opt-in: automatically sync a linked player's dashboard role from their real in-game permission — see Dashboard Security above |
roleSync.intervalSeconds |
300 |
How often the periodic reconciliation sweep runs, in addition to an immediate check on join |
roleSync.adminPermission |
"neoessentials.admin.dashboard" |
A player with this permission node is granted the dashboard ADMIN role |
roleSync.adminGroup |
"admin" |
A player in this permission group is granted the dashboard ADMIN role (checked in addition to, i.e. OR'd with, adminPermission) |
The dashboard's on/off switch is now split across two keys that both have to allow it:
webDashboard.enabled (this section) and modules.webDashboardEnabled (the mod-wide
modules block at the top of config.json, alongside economyEnabled/chatEnabled/etc.).
Either one set to false disables the whole dashboard.
The apiSettings, uiSettings, loggingSettings, enableCORS, and maxThreads keys from
earlier documentation do not exist in the current codebase — the dashboard's security-related
settings live entirely under securitySettings, and there is no config option to disable REST
endpoints or config editing independently.
What the Dashboard Can Do#
Both the internal (bundled) and external (Laravel) dashboards cover the same 13 pages, since both
are built against the same REST API: Overview (/api/stats + /api/server), Players + full
per-player control page (/api/player + /api/moderation), Economy, Warps, Kits, Holograms,
Discord, dashboard account management (/api/users), Backups, Commands/console (/api/commands),
Logs (/api/logging), Permissions (/api/permissions), and a public no-login player-lookup page.
Full endpoint detail in API System → docs/API.md.
Account Settings & Minecraft Account Linking#
Both dashboards have an account Settings/Profile page (the internal one gained this in build.15;
it was previously just a disabled "not yet ported" placeholder) covering:
- Change password — same on both dashboards.
- Link a Minecraft account — new this pass, and the first way to do this without needing
Discord: the Settings page generates a short one-time code, and you type
/linkaccount <code> in-game to confirm ownership. Works for any dashboard account regardless
of how it was created (self-registered, admin-created, or via /dashboardregister). Self-service
unlink is also available. See docs/API.md's /api/auth/link-minecraft/* routes.
- Discord status — read-only on the internal dashboard (resolved via whichever Discord
companion mod is installed — see below); the external
dashboard keeps its existing full OAuth2 "Connect Discord" flow. A genuine browser-initiated
Discord OAuth2 flow for the internal dashboard (so it gets the same "Connect Discord" button) is
a planned follow-up, not built yet — the mod deliberately doesn't perform Discord OAuth2 itself
today (see
DiscordAuthProvider's own doc comment).
- Once linked, the sidebar's user avatar on both dashboards shows your actual Minecraft skin
instead of a generic icon.
Dashboard Security#
/apikey create now prints the generated token as a click-to-copy chat component instead of
plain text.
- The external dashboard's paired auth token (the Bearer token it presents on its outbound
account-sync webhook) is now encrypted at rest in
config.json (AES-256-GCM) instead of stored
in plaintext — existing plaintext values are migrated transparently the next time they're read,
no action needed.
- New opt-in setting,
webDashboard.roleSync (off by default): automatically grants a linked
player's dashboard account the ADMIN role the moment they have a configured in-game permission
node or belong to a configured permission group, and revokes it again the moment they don't — no
more manually re-running /apikey create/the API every time an admin's in-game status changes.
Runs an immediate check on join plus a periodic sweep, so it also catches permission changes made
outside the mod entirely (e.g. a direct LuckPerms edit). Never touches a role that was set
manually — it only ever adjusts a role it granted itself.
Moderation API#
The dashboard's moderation endpoints are backed directly by the same manager classes that power the in-game /ban, /mute, /kick, /warn, /note, and /report commands (see Moderation System) — there is no separate dashboard-only ban store, so actions taken here actually enforce in-game and vice versa. The dashboard's own accounts (dashboard_users, dashboard_registrations) are themselves persisted through the same pluggable backend — see Storage Backend.
| Route |
Method |
Description |
/api/moderation/overview |
GET |
Summary counts across all moderation categories |
/api/moderation/bans/active, /bans, /bans/{uuid} |
GET |
Active bans / all bans / a player's ban history |
/api/moderation/ban |
POST |
Issue a ban |
/api/moderation/ban/{uuid} |
DELETE |
Unban a player |
/api/moderation/ipbans/active, /ipbans |
GET |
Active IP bans / all IP ban history |
/api/moderation/ipban |
POST |
Issue an IP ban |
/api/moderation/ipban/{ip} |
DELETE |
Unban an IP |
/api/moderation/mutes/active, /mutes, /mutes/{name} |
GET |
Active mutes / all mutes / a player's mute history |
/api/moderation/mute |
POST |
Issue a mute |
/api/moderation/mute/{name} |
DELETE |
Unmute a player |
/api/moderation/ipmutes |
GET |
All IP mutes |
/api/moderation/ipmute |
POST |
Issue an IP mute |
/api/moderation/ipmute/{ip} |
DELETE |
Remove an IP mute |
/api/moderation/kicks, /kicks/{name} |
GET |
Kick history (all / one player) |
/api/moderation/warns, /warns/{name} |
GET |
Warnings (all / one player) |
/api/moderation/warn/{id} |
DELETE |
Remove a warning |
/api/moderation/notes/{name} |
GET |
A player's staff notes |
/api/moderation/note |
POST |
Add a staff note |
/api/moderation/note/{id} |
DELETE |
Remove a staff note |
/api/moderation/reports, /reports/all, /reports/{id} |
GET |
Pending / all / one report |
/api/moderation/reports/{id}/review |
POST |
Accept or dismiss a report |
/api/moderation/freeze/list |
GET |
Currently-frozen players |
/api/moderation/freeze |
POST |
Freeze a player |
/api/moderation/freeze/{name} |
DELETE |
Unfreeze a player |
/api/moderation/vanish/list |
GET |
Currently-vanished players |
/api/moderation/vanish |
POST |
Vanish/unvanish a player |
/api/moderation/vanish/{name} |
DELETE |
Force a player visible |
/api/moderation/jails, /jail-locations |
GET |
Jailed players / configured jail cell locations |
/api/moderation/jail, /jail-location |
POST |
Jail a player / define a jail cell location |
/api/moderation/jail/{name}, /jail-location/{name} |
DELETE |
Release a player / remove a jail cell location |
All routes above require the standard dashboard Bearer-token authentication (session or API key); mutating routes (POST/DELETE) additionally require the ADMIN role specifically — a MODERATOR-role credential can read but not act.
Public Moderation Lookup (no login required)#
A separate, unauthenticated set of routes — matching ban-management plugins' public
transparency page, where anyone can look up a player's punishment history without an account:
| Route |
Method |
Description |
/api/public/moderation/lookup/{name} |
GET |
Bans, mutes, kicks, and warns for one player, by name |
/api/public/moderation/recent |
GET |
Recent active bans + mutes across all players, newest first |
These deliberately never expose IP bans, IP mutes, staff notes, or player reports (privacy —
notes/reports contain staff commentary and a reporter's identity). Still CORS/rate-limited the
same as every other dashboard route, just without the Bearer-token check. Gated by
webDashboard.securitySettings.publicModerationLookupEnabled (default true) — set to false
to disable public lookup entirely.
In-Chat "View Profile" Link#
Player names in chat show a small clickable ↗ icon that opens that player's public lookup
page in a browser. By default this points at whichever NeoEssentials dashboard is actually
reachable — the paired external (Laravel) dashboard if you've run /dashboard pair, else the
mod's own bundled UI via webDashboard.publicUrl.
If you have your own website instead (a stats page, forum profile, custom fan site), set
webDashboard.customProfileUrlTemplate to point the link there instead — it takes priority over
both of the above when set:
"customProfileUrlTemplate": "https://myserver.com/players/{player}"
Supports {player} (URL-encoded username) and {uuid} placeholders. Leave empty (the default)
to keep using one of the two dashboards.
Commands#
All /dashboard subcommands (including the bare /dashboard) require neoessentials.admin.dashboard
— this is checked on the dashboard literal itself, so pair/unpair need it in addition to
neoessentials.dashboard.pair listed below (brigadier requires every node from the root down to
pass, not just the leaf). Account registration is a separate command tree, /dashboardregister,
gated by neoessentials.dashboard.access.
| Command |
Permission |
Description |
/dashboard |
neoessentials.admin.dashboard |
Show the REST API + WebSocket server's status |
/dashboard start |
neoessentials.admin.dashboard |
Start the API server if stopped |
/dashboard stop |
neoessentials.admin.dashboard |
Stop the API server |
/dashboard restart |
neoessentials.admin.dashboard |
Restart the API server |
/dashboard status |
neoessentials.admin.dashboard |
Show the API server's status |
/dashboard url |
neoessentials.admin.dashboard |
Show the API base URL |
/dashboard pair "<dashboardUrl>" <code> |
neoessentials.dashboard.pair |
Complete the pairing handshake with an external dashboard — see API System → Pairing |
/dashboard unpair |
neoessentials.dashboard.pair |
Clear the paired connection and revoke its API key |
/dashboardregister |
neoessentials.dashboard.access |
Show registration help |
/dashboardregister start |
neoessentials.dashboard.access |
Begin manual registration (issues a 5-minute token) |
/dashboardregister complete <username> <password> |
neoessentials.dashboard.access |
Finish manual registration |
/dashboardregister discord |
neoessentials.dashboard.access |
Register instantly using a linked Discord account (via SDLink, Mc2Discord, or DCIntegration) |
/dashboardregister status |
neoessentials.dashboard.access |
Check your registration status |
/apikey create <label> [role] |
neoessentials.dashboard.apikeys |
Create an API key for an external dashboard backend — prints the token once, as a click-to-copy chat component |
/apikey list |
neoessentials.dashboard.apikeys |
List keys (label/role/enabled/last-used — never the secret) |
/apikey revoke <id> |
neoessentials.dashboard.apikeys |
Revoke a key immediately |
/linkaccount <code> |
none — open to everyone |
Finish linking your Minecraft account to a dashboard account, using the code shown on that account's Settings page |
/apikey is a separate command tree from /dashboard//dashboardregister — see
API System → Authentication for the full picture of what these
keys are for and how they differ from a human dashboard account. /linkaccount is the reverse
direction of /dashboardregister — it links an MC account to an existing dashboard account
(started from the dashboard's own Settings page), rather than creating a brand-new dashboard
account starting from an in-game player.
Permissions#
| Node |
Default |
Description |
neoessentials.dashboard.access |
🔒 |
Register an account and log in to the dashboard (/dashboardregister) |
neoessentials.dashboard.view |
🔒 |
View dashboard (read-only) |
neoessentials.dashboard.manage |
🔒 |
Access console and management tools |
neoessentials.dashboard.moderator |
🔒 |
Moderator-level dashboard access |
neoessentials.dashboard.admin |
🔒 |
Full admin dashboard access |
neoessentials.admin.dashboard |
🔒 |
Start/stop/manage the API server (/dashboard) |
neoessentials.dashboard.apikeys |
🔒 |
Create/list/revoke API keys for external dashboard integrations (/apikey) |
neoessentials.dashboard.pair |
🔒 |
Pair/unpair this server with an external dashboard (/dashboard pair, /dashboard unpair) |
Unlike most permission nodes documented on the Permission System page,
the dashboard nodes above (other than neoessentials.dashboard.apikeys/.pair, which are
registered) are not pre-registered in PermissionRegistry — they're checked ad hoc, so grant
them explicitly to non-OP groups rather than relying on a documented default.
As of build.16, /help <command> shows each command's real permission node (this table
included) instead of guessing neoessentials.<commandname> — that guess used to be wrong for
/apikey specifically (it showed neoessentials.apikey instead of the real
neoessentials.dashboard.apikeys), and for roughly 160 other commands mod-wide.
Back to Wiki Home