The Solstice panel
The panel is ours, not a stock install
Most hosts hand you stock Pterodactyl with a logo dropped in the corner. Solstice is a fork. The foundations are the same, and we say so plainly below, but two things sitting on top of them don’t exist upstream: game slots, and hostnames that configure themselves.
01
Several games on one server
Stock Pterodactyl gives you one server running one game. Change your mind and you wipe it and start again. A Solstice server holds several installs at once, with exactly one of them active.
Each install gets its own slot and its own directory. Switching between them keeps every file in every other slot exactly where you left it, so you can run a modpack this month, move to something else, and move back without losing the first world.
How the switch is made safe
“One active at a time” is enforced at the database level, not hidden in the interface, so there is no state where two slots believe they own the server. The move itself runs as a checkpointed state machine: interrupt it and it resumes from the last checkpoint, and if it genuinely cannot finish, it rolls back. Underneath, Wings performs atomic bulk renames into per-slot directories, so files are never left half-copied between two places.
02
Give players a hostname, not an IP and a port
play.solmc.net, rather than an address and a port number your players have to copy correctly. You type the hostname you want. The panel works out the rest.
Solstice integrates Cloudflare directly, and decides how to route rather than asking you a question you shouldn’t have to answer. A four-step probe hits the allocation’s actual address and works out what is listening on that port.
- A website Routed through a reverse proxy, so the hostname resolves without a port on the end of it.
- A Minecraft server Gets an SRV record, which is what lets players connect on the bare hostname with no port at all.
- Anything else Gets a plain record with the port attached, which still works even though it isn’t as tidy.
It always produces something that works
If the probe can’t classify a port confidently, it still emits a working record rather than refusing and leaving you with nothing. A slightly less elegant hostname beats a blocked one.
Websites and certificates
Hostnames that resolve to a website are served by a reverse-proxy agent running on each node, written in Bun. It terminates TLS and issues Let’s Encrypt certificates for you. The panel drives it over an authenticated control API and reports status back per hostname, so you can see which of your hostnames are live and which are still coming up.
03
Built for the day it goes wrong
Anything that moves files between directories can be interrupted. The interesting question is what happens next.
A
It heals itself first
If a slot switch is left stranded — a node restart at the wrong moment, a dropped connection — the panel detects it on the next page load and finishes or reverses the job without anyone filing a ticket.
B
And you get an escape hatch
If it still can’t recover, the server owner has a control that clears the dead lock and restores an active slot. It changes the record of which slot is live. It does not touch your files. That distinction is the whole point: the worst case is a server you have to start again, never a server whose data has been rearranged underneath you.
C
The complexity stays on our side
There is a lot of machinery in the paragraphs above: DNS propagation, ACME challenges, proxy configuration, state machines. You should never have to learn any of it. The panel says Waiting for DNS… and then it says the hostname is ready.
04
What it’s built on
We didn’t write a control panel from scratch, and it would be dishonest to imply we did.
- Kept from upstream Laravel, Wings, the Fractal API, and the repository and service layers. If you already know Pterodactyl, you know where things live and the API you’d automate against is the one you expect.
- Rebuilt on top The client area is React and the admin is a re-skinned AdminLTE, both driven by semantic design tokens exposed as RGB-triplet CSS variables, with a neutral ramp that flips between light and dark and a muted slate dark palette.
- Added by us Game slots and managed Cloudflare networking. Neither has an equivalent in stock Pterodactyl.