A warm, unified dashboard for managing your home game servers.
KitsuneDen treats your servers like living things, each one with its own personality, its own logs, its own place in the Den. It's built for the kind of person who runs a Minecraft server for their friends, a 7 Days to Die world for the weekend, and wants one clean interface to watch over all of it.
- Multi-server switcher: manage multiple game servers from one dashboard, with live status indicators
- Add servers from the UI: no more editing config files by hand; add, edit, and remove servers with a native folder picker
- Live console: real-time log streaming with command input and history
- Server controls: start, stop, restart from the top bar with one click
- Player management: whitelist, op, ban, and kick controls
- Mod & modpack management: upload, organize, and activate mod sets
- Config editor: structured editing with friendly widgets (like the day/night cycle slider for 7D2D)
- World & backup views: browse worlds, trigger and manage backups
- Connection info: LAN and public IP display with click-to-copy
| Game | Type | Status |
|---|---|---|
| Minecraft (Fabric) | minecraft |
β Full support |
| Minecraft (NeoForge) | minecraft |
β Full support |
| Minecraft (Vanilla/other) | minecraft |
β Full support |
| 7 Days to Die | 7d2d |
β Full support |
| Hytale | hytale |
β Full support |
| Palworld | palworld |
β Full support |
| Enshrouded | enshrouded |
β Full support |
| Others | - | π§ Add your own adapter |
Adding a new game type means writing one adapter class. See Adding a new game.
- Node.js 18+
- Your game server(s) installed and runnable
git clone https://github.com/Kitsune-Den/KitsuneDen.git
cd KitsuneDen
npm installYou can add servers directly from the dashboard UI. Click Add Server on the Servers page, pick your game type, browse to the install directory, and fill in the connection details.
Or if you prefer, copy the example config and edit it manually:
cp servers.example.json servers.jsonSee Configuration for field details.
KitsuneDen ships with a shared-password gate. Before you can boot it, set two environment variables:
cp .env.example .env
# then edit .env and put real values in| Variable | What it is |
|---|---|
KITSUNEDEN_PASSWORD |
The shared password. Everyone you let into the Den knows this one. |
KITSUNEDEN_SESSION_SECRET |
HMAC key for signing session cookies. 32+ random chars. Generate with openssl rand -base64 48. |
If either is missing, the login page renders a setup-required banner instead of a password prompt, and API calls return 503. The session lasts 7 days; rotating KITSUNEDEN_SESSION_SECRET invalidates every active session (forces a re-login), which is what you want when a password leaks.
Trade-off: shared password means no per-user audit trail and rotation means telling everyone the new password. Fine for a small home dashboard; if you ever need per-user accounts, the gate is structured to swap in without breaking the cookie shape.
npm run dev # development
npm run build # production build
npm run start # production startOpen http://localhost:3000 (or whatever port you set in servers.json).
servers.json is your Den's map. It tells KitsuneDen where your servers live and how to talk to them. You can edit it through the dashboard UI or by hand.
{
"servers": [
{
"id": "fabric",
"name": "Fabric",
"type": "minecraft",
"dir": "C:\\GameServers\\fabric-server",
"loader": "Fabric",
"version": "1.21.4",
"jar": "fabric-server-launch.jar",
"launchMode": "jar",
"gamePort": 25565,
"rconPort": 25575,
"rconPassword": "your-rcon-password"
}
],
"dashboard": {
"port": 3000
}
}See servers.example.json for full examples including NeoForge (argfile launch), Hytale, 7 Days to Die, and Palworld.
minecraft: Fabric, NeoForge, Vanilla, and most other loaders
| Field | Required | Description |
|---|---|---|
dir |
β | Path to server directory |
jar |
For jar mode | Server jar filename |
launchMode |
β | "jar" or "argfile" |
argFiles |
For argfile mode | JVM arg files (NeoForge) |
javaPath |
Optional | Full path to java executable |
gamePort |
β | Port players connect to |
rconPort |
Optional | RCON port for commands |
rconPassword |
Optional | RCON password |
7d2d: 7 Days to Die
| Field | Required | Description |
|---|---|---|
dir |
β | Path to server directory |
configFile |
Optional | Config XML filename |
telnetPort |
Optional | Telnet port |
telnetPassword |
Optional | Telnet password |
modsDir |
Optional | Mods directory name |
hytale: Hytale
| Field | Required | Description |
|---|---|---|
dir |
β | Path to server directory |
startScript |
Optional | Startup bat/script |
backupScript |
Optional | Backup script path |
processFilter |
Optional | Process name filter |
gamePort |
β | Port players connect to |
palworld: Palworld
| Field | Required | Description |
|---|---|---|
dir |
β | Path to server directory |
steamCmdPath |
Optional | Path to steamcmd.exe for updates |
gamePort |
Optional | Game port (default 8211) |
rconPort |
Optional | RCON port |
rconPassword |
Optional | RCON password |
restApiPort |
Optional | REST API port (default 8212) |
restApiPassword |
Optional | REST API password |
enshrouded: Enshrouded
| Field | Required | Description |
|---|---|---|
dir |
β | Path to server directory |
startScript |
Optional | Startup bat (falls back to enshrouded_server.exe) |
configFile |
Optional | Config filename (default enshrouded_server.json) |
steamCmdPath |
Optional | Path to steamcmd.exe for updates (Steam app id 2278520) |
gamePort |
Optional | UDP game port (default 15637) |
queryPort |
Optional | UDP Steam query port (default 15638) |
Enshrouded ships no RCON or REST API, so live commands are unavailable; player presence is best-effort scraped from connect/disconnect log lines.
KitsuneDen uses an adapter pattern. Every game type is an adapter class that implements the ServerAdapter interface.
- Create
src/lib/adapters/your-game-adapter.ts - Implement the
ServerAdapterinterface fromtypes.ts - Register it in
adapter-registry.ts - Add the type to
ServerDefinitionintypes.ts
The interface covers lifecycle (start/stop/restart), logs, stats, config, and players. Implement what your game supports; capabilities flags tell the UI what to show.
export const capabilities: ServerCapabilities = {
hasRcon: false,
hasMods: true,
hasModPacks: false,
hasBackups: true,
hasWorlds: true,
hasWarps: false,
hasServerProperties: false,
hasJsonConfig: true,
};KitsuneDen runs best as a scheduled task rather than a startup script (antivirus software tends to block .bat files in shell startup).
- Open Task Scheduler
- Create a new task:
- Trigger: At startup (with 30s delay)
- Action:
nodewith argumentsserver.js, start in your KitsuneDen directory - Run with highest privileges
- Restart on failure
- Test it manually before trusting it to run unattended
KitsuneDen is built with a philosophy: your servers aren't cold infrastructure, they're creatures worth tending. Dashboards are companions. Logs are journals. Ports are doorways.
The Operator's Manual covers everything about the Den's architecture, spirits, and care, written to be understood, maintained, and enjoyed.
- Next.js: App Router, TypeScript
- Tailwind CSS: utility-first styling
- Lucide: icons
Pull requests welcome. If you've written an adapter for a new game, please share it. The Den grows when more spirits join.
MIT


