Skip to content
Ryder Lee Smith
All work

ReSkateManager

One program that starts ReSkate dedicated servers, keeps them updated and gives staff a web panel to run them from a PC or a phone.

Role
Author and maintainer
Years
2026 - Present
Stack
Go, SvelteKit, Tailwind, Lua on WebAssembly, Docker, GitHub Actions
Links
The ReSkateManager dashboard listing six servers with their players, maps and uptime.

The problem

ReSkate adds multiplayer and dedicated servers to EA’s skate., but its server has no admin API. Running several of them meant remote desktop sessions, hand-edited JSON and restarting crashed servers by hand.

What I built

A single Go program for Windows, Linux or Docker that manages several servers side by side, each in its own folder with its own ports. Staff run everything from a SvelteKit panel:

  • a live console with command history and tab completion, plus searchable logs
  • players, bans and admins, scheduled restarts with in-game warnings, and crash recovery with backoff
  • CPU, memory, player and network charts for each server, and a view of the host machine
  • a Thunderstore mod browser, mods shared across servers, and updates verified against SHA-256 hashes
  • users and roles, an audit log, daily backups and Discord alerts

How it works

  • The console is the API. Each server runs with redirected stdin and stdout. The manager parses every output line into typed events (joins, chat, votes, anti-cheat) and sends commands one at a time, matching each reply to the command that produced it.
  • Config changes that can’t collide. The server rewrites its own config after every setting command, so the manager never writes that file while the server runs. Settings with no command go through a stop, write and start cycle instead.
  • Sandboxed plugins. Plugins are Lua 5.4 scripts running in a copy of Lua compiled to WebAssembly, run by wazero on their own goroutine. No cgo, capped memory, and a plugin reaches nothing the manager doesn’t hand it.
  • Small downloads. To list a mod’s maps, the manager reads only the zip’s directory with HTTP range requests, usually a few hundred KB instead of the whole mod.

Shipping it

CI runs on every push, goreleaser builds the Windows and Linux releases, and each tag publishes a Docker image to GHCR. A third workflow watches ReSkate itself for new releases. It’s at v1.6.3 after 15 tagged releases, and runs community game servers in production.

A server's performance tab, with CPU, memory and player charts over 24 hours. A server's mods tab, with shared map mods and a notice that a newer version is on Thunderstore. Next case study xT plugins