Farmstead Mods
EN

Веб-панель

Установка, вход, привязка аккаунта через Discord и внешний режим размещения.

На этой странице

Команды 4#

КомандаСинтаксисАлиасыПравоОписание
/apikey/apikey <create <label> [role] | list | revoke <id>>—neoessentials.dashboard.apikeysManage long-lived API keys for external dashboard integrationsКорень требует neoessentials.dashboard.apikeys (validatePermission). Голый /apikey неполный — .executes на корне нет. <label> и <id> — word. [role] по умолчанию ADMIN; автодополнение: ADMIN, OPERATOR, MODERATOR, VIEWER. Полный токен печатается один раз (копируемый компонент) и больше не хранится открытым. list показывает id/label/role/enabled/last used, не секрет. В отличие от /dashboard, isCommandEnabled("apikey") не проверяется — команда регистрируется всегда.
/dashboard/dashboard [start | stop | restart | status | url | pair <dashboardUrl> <code> | unpair]—neoessentials.admin.dashboardStart/stop/status/URL for the web dashboardКорень закрыт neoessentials.admin.dashboard через validateAdminPermission (консоль и OP уровня 2 проходят всегда). Голый /dashboard равен status. pair/unpair дополнительно требуют neoessentials.dashboard.pair (validatePermission, без admin-bypass). <dashboardUrl> — StringArgumentType.string(): URL с : и / нужно брать в кавычки, иначе Brigadier разрежет токен. start смотрит webDashboard.enabled и modules.webDashboardEnabled; autoStart в поставке false — HTTP сам не поднимается. Команда регистрируется, только если commands.dashboard включён.
/dashboardregister/dashboardregister [start | complete <username> <password> | discord | status]—neoessentials.dashboard.accessRegister a web dashboard accountИгроку нужен neoessentials.dashboard.access; консоль допускается при OP 2, но все ветки кроме справки отвечают players_only. Голый вызов печатает help. <password> — greedy (можно с пробелами), минимум 8 символов; <username> — word длиной 3–20. Токен start живёт 5 минут в памяти и не пишется в DataStore. discord требует готовый SDLink / Mc2Discord / DCIntegration и уже связанный Discord.
/linkaccount/linkaccount <code>—neoessentials.dashboard.linkaccountLink your Minecraft account to an existing dashboard accountБез neoessentials.dashboard.linkaccount команда не в дереве. Консоль проходит .requires, но execute отвечает players_only. Код из POST /api/auth/link-minecraft/start, 8 символов из ABCDEFGHJKLMNPQRSTUVWXYZ23456789, TTL 5 минут; ввод приводится toUpperCase. Это обратное направление к /dashboardregister: привязать уже существующий dashboard-аккаунт к нику, а не создать новый.

Примеры#

Поднять 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#

УзелВ реестреЧто даёт
neoessentials.dashboard.accessреестр: нетRegister a web dashboard account (/dashboardregister)
neoessentials.dashboard.apikeysреестр: нетCreate/list/revoke API keys for external dashboard integrations (/apikey)
neoessentials.dashboard.linkaccountреестр: нетLink Minecraft account to an existing dashboard user (/linkaccount)
neoessentials.dashboard.pairреестр: нетPair/unpair this server with an external dashboard (/dashboard pair, /dashboard unpair)

Подробное руководство#

Раздел ниже — исходная документация проекта (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#

  1. Set webDashboard.enabled: true and modules.webDashboardEnabled: true in config.json (both default to true)
  2. Configure port (default 8080) and websocketPort (default 8081)
  3. 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)
  4. 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.
  5. 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:

  1. 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.
  2. 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.
  3. 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.
  4. Discord OAuth (optional, self-service) — see below. If allowAutoRegistration: true (the default), logging in with Discord auto-creates an account on first use.
  5. 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.

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