Self-hosted Discord stack

One beacon for gamers, music, stats and safe diagnostics.

NetherBeacon keeps Alpha on server operations, public commands and Palworld REST, while Bravo runs Muse in an isolated Docker Compose service with its own credentials.

Designed for a small live server

The bot is intentionally cautious. It creates missing managed resources, reuses known Discord IDs, and reports ambiguous duplicates instead of deleting or guessing.

Safe server sync

Alpha reuses managed IDs, creates missing resources without deleting channels or roles, and enforces the declared managed permissions exactly.

Music under one roof

Bravo runs upstream Muse in its own service with a dedicated credential environment and the historical Docker volume mounted at /data.

Public fun commands

Pokédex commands use autocomplete, local JSON caching, request deduplication and cached Pokémon artwork.

Community channels

Dedicated public spaces keep Palworld and Pokémon GO conversations easy to find without mixing them into the main chat.

Palworld metrics

Alpha reads server metrics on demand and posts public snapshots with a global cooldown.

Palworld announcements

Staff can post a Discord announcement and relay the same message in game without exposing REST credentials.

Safe diagnostics

Admin-only diagnostics expose runtime health, command hashes and cache metadata without printing secrets or file contents.

Commands

Admin commands stay locked down. Palworld metrics and Pokédex commands are public, rate-limited and safe by default.

/status
Show Alpha, Bravo, runtime and cache status.
/audit
Compare desired server structure without changing anything.
/resync
Create missing resources and enforce managed Discord permissions.
/stats-refresh
Force the Stats voice channels to refresh.
/diag
Show safe Alpha, Bravo, stats and command diagnostics.
/cache-status
Report local cache size and age without file contents.
/metrics-palworld
Show filtered Gaylemon Palworld status with a global 4-minute cooldown.
/announce-palworld message:...
Let admins and moderators post to Discord and relay the announcement in game.
/pokemon name:charizard
Return an autocomplete-backed Pokédex card with artwork.
/weakness pokemon:charizard
Show weaknesses, resistances and immunities.
/move name:flamethrower
Look up a move.
/ability name:intimidate
Look up an ability and sample Pokémon.
/type name:fire
Show offensive and defensive type matchups.
/random-pokemon
Pull a random Pokémon.

Quick start

Prepare secrets locally.
Copy .env.example to .env and fill Discord, YouTube and Spotify values. Never commit .env.
Capture Discord IDs.
Run npm run capture:ids so managed resources are reused by ID.
Enable Palworld REST.
Public metrics use the filtered Gaylemon JSON by default. Set the Palworld REST admin variables only for staff in-game announcements.
Build and restart with notice.
Run .\scripts\rebuild-restart.ps1. Alpha posts an orange maintenance message first.