on-demand control plane

Start the server. Pause the show. From Discord.

Reveille turns self-hosted game servers on and off — and now pauses, skips and rewinds the show on the home machine — with named slash commands, from any device, with nothing to install but a bot. Palworld, Satisfactory, and VLC. A human decides when; that's the whole policy.

Try the dashboard → See the flow

— reveille · the bugle call that wakes the troops

3
targets · 2 games + VLC
~2s
to pause or rewind · from a phone
0
auth — by design
0
new ports · media is local
The whole experience

Name a server. No terminal, no admin console.

Either player types /start satisfactory from a phone; a moment later the bot posts again to say it's actually up, and they join. /stop satisfactory saves the world and shuts it down. And when someone runs to the store mid-episode, /pause holds the show and /play picks it back up — one tap, no argument. When somebody talks over a line, /back jumps back thirty seconds — or /back 90 if it needs longer — and /forward goes the other way. When the episode ends, /next moves on to whatever was queued up, and /previous goes back one. /next 3 skips three at once, and a negative goes the other way. The replies say what's playing and how far in — Reveille reads that from the player as it acts, tells you, and forgets it. It never remembers what was on, and it never picks what plays: that stays yours. Nobody has to get up. /status says what's happening across every target — and /help lists exactly the commands that work in this server, so nobody has to be told. That list is generated from the commands themselves, not written down beside them, so it cannot drift out of date.

  • A stop never loses the world. If the save can't complete, the server stays up and says so — it will not force-kill to satisfy a stop.
  • It tells you when it's really up. The first reply says "launching"; a second message follows when the control API confirms it's running — or honestly that it couldn't. Never a claim it can't back.
  • Every command names its server. One game's command never touches another, and nothing ever stops on its own — every shutdown is a human command.
# the-crew private · trusted
K
Kayla today · 21:04
/start satisfactory
reveille bot
reveille APP today · 21:04
Starting the server — launch issued. I'll post again when it's up.
That means launched, not verified — if it doesn't come up, the follow-up will say it couldn't be confirmed.
reveille bot
reveille APP today · 21:04
Satisfactory is up — try joining.
J
Jonah today · 21:06
/status
reveille bot
reveille APP
Palworld — stopped
Satisfactory — running
VLC — playing
K
Kayla today · 21:12 · at the store
/pause
reveille bot
reveille APP today · 21:12
Paused. The show holds where it is — /play picks it back up.
Three components

Each welded to something.

Ask "what is it welded to?" and every placement question answers itself. The orchestrator is the only component that ever relocates; actuators multiply instead. They talk over a network API — always, even while sharing a box.

×1 · exactly one

Orchestrator

Decides when. Takes the named Discord command, routes it to the right server, and serializes it to one clean winner.

welded to → nothing
runs → wherever is always-on
1 per target · Palworld, Satisfactory, VLC

Agent

Knows how. One adapter per target behind a fixed interface — a game or a media player, each with its own verbs; only the adapter knows which target it is. Owns the save-before-exit guarantee.

welded to → a controllable target on a host
runs → on that target's machine
1 per LAN

Emitter

Wakes sleeping machines. Deferred today, but the seat is already drawn so it needs no rewrite later.

welded to → a network
runs → anywhere on it
growth →

More rows, never new components. Satisfactory joined Palworld as a pure row — one more adapter, one more address, no new kind of thing. VLC went one notch further: pausing playback isn't a server lifecycle, so it earned its own adapter kind and its own verbs — but it is still one agent at one more address, reusing the whole seam. No new component was needed. Skipping and rewinding were narrower still — four more commands on that same kind, at that same address: a column, not a row, and not a new kind of anything. And a private guild is a row too: each Discord server the bot serves is a tenant, scoped to its own targets and isolated from every other — one bot, many groups, none able to see or touch another's. If a capability ever needs a fourth kind of component rather than another row, something was drawn wrong.

Interactive demo

The right verbs, for each target.

A simulation running entirely in your browser — nothing is connected to a real host. Switch targets, and each holds its own state: the games take /start·/stop, VLC takes /pause·/play. The demo covers those; the live bot also takes /next, /previous, /forward and /back on the media target. The refusals below are the real spec (FR-008, FR-017, FR-021, SC-002).

Palworld dedicated
host · watson · 8211/udp
STOPPED
Uptime
Connected players
not tracked — by design
agent bound to 127.0.0.1 · 1 inbound port · 0 auth
orchestrator.log — tail -f