Mirrors Factorio's world feature for the SE server. The SE docker image always
loads the flat config/World dir and its entrypoint rewrites <LoadWorld> on every
start, so repointing the cfg is useless. Instead inactive worlds live in a
sibling config/Worlds library (not mounted) and switching is an instant mv-swap;
the active world name is tracked in .gsm-worldname and files are chowned to
1000:1000. New worlds are created from the image's built-in CustomWorlds
templates or by cloning the active world. Switch/clone require a stopped server.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Three compounding causes made the dashboard and detail pages slow:
- Detail page fetched the WHOLE fleet (every SSH/Prometheus/RCON call for
all servers) just to show one. Switch ServerDetail to GET /servers/:id
(add api.getServer) so it costs one server's worth of work, not N.
- No server-side caching: every 10s poll, from every open tab, recomputed
everything. Add a shared 5s-TTL per-server cache + in-flight dedup behind
both GET / and GET /:id; invalidate on start/stop/restart so power
actions still reflect immediately.
- Prometheus fetch had no timeout, so a slow/restarting Prometheus hung the
whole aggregation indefinitely (the .catch can't catch a hang). Add
AbortSignal.timeout to queryPrometheus/queryPrometheusRange.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The 15m access token only refreshed on a 401, but the dashboard uses optionalAuth and returns 200 even with an expired token, so the live page never noticed expiry until a manual reload.
Backend: ACCESS_TOKEN_TTL 15m -> 1h. Frontend: export refreshAccessToken; App.jsx schedules a refresh ~1min before the token expires (and on tab focus/return), and logs out cleanly (redirect to /login) if the refresh token is gone — no reload needed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
config.json, discordBot.js, serverUpdates.js and ServerCard.jsx updated from Biohazard to FTB StoneBlock 4. Docs (infrastructure/gsm/CLAUDE) updated and docs/minecraft-modpack-install.md added. No Discord update notification is triggered (minecraft supportsUpdate=false).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The mmmaxwwwell SE image calls steamcmd with +login before +force_install_dir,
which Steam rejects ("Please use force_install_dir before logon!"), so container
restarts never actually update the game. The new handler runs SteamCMD in a
sibling one-shot container with the correct argument order, mounting the same
volumes as the live container, then leaves the server stopped for the operator
to start. The version cache is invalidated after a successful update so the UI
shows the new build immediately.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Reads the SteamCMD appmanifest_298740.acf via SSH and exposes
buildid + LastUpdated through a new /api/servers/:id/version endpoint.
The overview tab now renders a "Server Version" card and surfaces a
pending update hint when TargetBuildID differs from the installed build.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bisher: 7d JWT im localStorage. Jeder 403 loggte den User aus — auch "Insufficient
permissions"-Responses fuer Background-Requests — wodurch User sich effektiv taeglich
neu einloggen mussten.
Backend:
- Neue refresh_tokens Tabelle (SHA256-gehasht, mit Rotation + Revoke)
- /auth/refresh tauscht Refresh-Token gegen frischen Access-Token (rotiert beide)
- /auth/logout revoked den Refresh-Token
- Access-Token-TTL auf 15m; Guest-Refresh 7d, Discord-Refresh 90d
- Daily cleanup-Job fuer abgelaufene/revoked Tokens
Frontend:
- api.js refreshed bei 401 automatisch (single-flight) und retryt die Anfrage
- 403 wird nicht mehr als Session-Ablauf behandelt
- Discord-Callback + Guest-Login liefern beide Tokens
- App.jsx synced React-State per gsm_token_refreshed CustomEvent
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Unreachable cards now show a disabled 'Starten' button so moderator cards
stay the same height as reachable ones
- Dashboard hides unreachable servers by default; a toggle button (bottom
of header area, only visible when unreachable count > 0) flips the view
and persists the preference in localStorage
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Integrates Space Engineers dedicated server (docker+wine on 192.168.2.78) into GSM:
- config.json entry with docker runtime and log-based player detection
- getSpaceEngineersPlayers() parses docker logs for connect/disconnect events
- Extends type-check sites in rcon, autoshutdown, discordBot, servers routes
- Frontend ServerCard/ServerDetail logo + address wiring
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Switched Minecraft server from All the Mods 10 to Biohazard: Project Genesis
(Beta 0.4.5, MC 1.20.1 + Forge 47.4.0). Updated server name, Discord bot
display, frontend modpack link, and documentation.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Create generic SteamCMD handler factory for reusable update logic
- Check build IDs via appmanifest files and Steam API
- Support V Rising (1829350), Palworld (2394010), Zomboid (380870), tModLoader (1281930)
- Show update button for all supported server types in UI
- Minecraft, OpenTTD, Hytale marked as manual-update-only
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Superadmins can now send custom update messages to Discord directly from
the Dashboard via a new modal with server type selection, title template,
description, and color picker.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace regex-based tokenization with character-by-character parsing
to completely avoid issues with numbers in CSS class names.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add missing "hytale" entry to SERVER_JOBS in prometheus.js
- Fix config editor regex bug that was corrupting CSS class names (e.g. text-cyan-400 becoming text-cyan-<span>400</span>)
- Use placeholder tokens to prevent numbers regex from matching inside already-replaced spans
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Node Exporter target for Hytale server (10.0.30.204:9100)
- Add Hytale config read/write functions to ssh.js
- Add GET/PUT /hytale/config API routes
- Create HytaleConfigEditor.jsx with JSON syntax highlighting
- Add Hytale config tab to ServerDetail.jsx
- Add stopCmd and port to Hytale server config
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add tmux runtime support to ssh.js (status, start, stop, logs, uptime)
- Add Hytale server configuration to config.json
- Add Hytale server info and logo to frontend (ServerCard, ServerDetail)
- Add Hytale emoji to Discord notification mapping
- Update documentation with Hytale server details
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Changed logs state initialization from empty string to null to properly
distinguish between "not yet loaded" and "loaded but empty" states.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The number regex was applied after the boolean regex, causing it to
match "400" in CSS class names like "text-orange-400" and corrupt
the HTML output. Now uses placeholder tokens to mark numbers before
adding any HTML tags.
Affected editors: Palworld, Zomboid, OpenTTD
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add ConfirmModal component for stop/restart confirmations
- Add start/stop/restart buttons to ServerCard (moderator/admin only)
- Add confirmation dialogs to ServerDetail for stop/restart actions
- Add btn-sm CSS class for smaller buttons
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add isGuest flag to UserContext
- Block guests from navigating to /server/:id route
- Make ServerCards non-clickable for guests
- Add rejectGuest middleware to backend
- Protect server detail endpoints (/:id, /metrics/history, /whitelist)
Guests can now only view the dashboard overview without accessing
individual server details.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Gray out unreachable servers with 50% opacity
- Disable click interaction for unreachable servers
- Show "Nicht erreichbar" badge
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add OpenTTD server integration (config editor, server card, API)
- Add Terraria server integration (config editor, API)
- Add legends to all config editors for syntax highlighting
- Simplify UserManagement: remove edit/delete buttons, add Discord avatars
- Add auto-logout on 401/403 API errors
- Update save button styling with visible borders
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Store map generation settings in DB when creating new worlds
- Add info button to view settings for each saved world
- Show legacy warning for worlds created before this feature
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add gsm-frontend to repository (React + Vite + TailwindCSS)
- New "Worlds" tab for Factorio server with:
- List saved worlds with Start/Delete actions
- Create new world with full map generation parameters
- Preset selection (Default, Rich Resources, Rail World, etc.)
- Save custom configurations as templates
- Show which save will be loaded in Overview tab
- Lock world management while server is running
- Backend changes deployed to server separately
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>