Initial StartOS package for Station Master (v0.5.1)

Built from source via a git submodule pinned to a tag, not a published image
— the Dockerfile, main.ts, and manifest should never need to change for an
ordinary version bump, only the submodule pin (see UPDATING.md). One volume,
one interface serving the browser client + lobby/intent API + SSE stream
from a single origin, no dependencies. The server-wide join secret (D14) is
seeded on install, exposed via the Get Join Secret action, and blocks start
behind a critical task until retrieved — the same first-set/rotation pattern
as actual-budget-startos's admin password.

Verified on phoenix.local: installs, the critical task correctly blocks an
ordinary start, force-starting confirms the daemon binds its port and serves
the client, and store.json correctly holds the install-seeded join secret.
Not verified: the Get Join Secret action's execution end-to-end — start-cli's
`package action run` fails with a client-side deserialization error that
reproduces identically against actual-budget's already-shipped equivalent
action, so this looks like a start-cli issue rather than a defect here.

icon.svg is still the scaffold's hello-world placeholder — no real Station
Master icon exists yet to ship in its place.
This commit is contained in:
Jesse
2026-08-21 08:44:07 -04:00
commit de28b30eea
40 changed files with 2540 additions and 0 deletions
+41
View File
@@ -0,0 +1,41 @@
export const short = {
en_US: 'Railroad operations board game — solitaire or multiplayer',
es_ES: 'Juego de mesa de operaciones ferroviarias: solitario o multijugador',
de_DE: 'Eisenbahn-Betriebs-Brettspiel — Solitär oder Mehrspieler',
pl_PL: 'Gra planszowa o zarządzaniu koleją — pasjans lub tryb wieloosobowy',
fr_FR: 'Jeu de plateau de gestion ferroviaire — solo ou multijoueur',
}
export const long = {
en_US:
'Station Master is a railroad operations game: switch cars, load and unload freight, and ' +
'dispatch trains through a shared Division. This package runs the authoritative multiplayer ' +
'server — 2 to 4 players connect from their browsers and play a competitive or cooperative ' +
'game together. Solitaire needs no server at all; it runs entirely in the browser from the ' +
'static client this server also hosts.',
es_ES:
'Station Master es un juego de operaciones ferroviarias: maniobra vagones, carga y descarga ' +
'mercancías, y despacha trenes por una División compartida. Este paquete ejecuta el servidor ' +
'multijugador autoritativo — de 2 a 4 jugadores se conectan desde sus navegadores y juegan una ' +
'partida competitiva o cooperativa. El modo solitario no necesita servidor: se ejecuta ' +
'enteramente en el navegador desde el mismo cliente estático que este servidor aloja.',
de_DE:
'Station Master ist ein Eisenbahn-Betriebsspiel: Waggons rangieren, Fracht laden und löschen ' +
'und Züge durch eine gemeinsame Division disponieren. Dieses Paket betreibt den ' +
'autoritativen Mehrspieler-Server — 2 bis 4 Spieler verbinden sich über den Browser und ' +
'spielen gemeinsam kompetitiv oder kooperativ. Solitär benötigt keinen Server; es läuft ' +
'vollständig im Browser über denselben statischen Client, den dieser Server ebenfalls hostet.',
pl_PL:
'Station Master to gra o zarządzaniu koleją: manewruj wagonami, załaduj i rozładuj towar oraz ' +
'dysponuj pociągami we wspólnej Dywizji. Ten pakiet uruchamia autorytatywny serwer trybu ' +
'wieloosobowego — od 2 do 4 graczy łączy się z przeglądarek i rozgrywa partię rywalizacyjną ' +
'lub kooperacyjną. Pasjans nie wymaga serwera — działa w całości w przeglądarce, z tego ' +
'samego statycznego klienta, który hostuje ten serwer.',
fr_FR:
"Station Master est un jeu de gestion ferroviaire : manœuvrez des wagons, chargez et " +
"déchargez du fret, et dispatchez des trains à travers une Division partagée. Ce paquet " +
"exécute le serveur multijoueur faisant autorité — 2 à 4 joueurs se connectent depuis leur " +
"navigateur pour une partie compétitive ou coopérative. Le mode solitaire ne nécessite aucun " +
"serveur : il tourne entièrement dans le navigateur, à partir du même client statique que ce " +
"serveur héberge.",
}
+29
View File
@@ -0,0 +1,29 @@
import { setupManifest } from '@start9labs/start-sdk'
import { long, short } from './i18n'
export const manifest = setupManifest({
id: 'station-master',
title: 'Station Master',
// Not open source — Jesse's own project, packaged for his own StartOS box.
license: 'UNLICENSED',
packageRepo: 'https://draco.local:53871/Jesse.Markowitz/station-master-startos',
upstreamRepo: 'https://draco.local:53871/Jesse.Markowitz/station-master',
// No separate marketing site — the repo IS where there is more to learn.
marketingUrl: 'https://draco.local:53871/Jesse.Markowitz/station-master',
donationUrl: null,
description: { short, long },
// Everything the server persists — game.json/index.json per game, turn timings,
// and this package's own store.json (the join secret) — lives on one volume.
volumes: ['data'],
images: {
// Built from source, not a published image: `main` here is the arbitrary
// image id, matched in main.ts's SubContainer.of({ imageId: 'main' }).
// The Dockerfile COPYs the pinned `station-master` git submodule — see
// UPDATING.md for how that pin is bumped.
main: {
source: { dockerBuild: { workdir: '.', dockerfile: './Dockerfile' } },
arch: ['x86_64', 'aarch64'],
},
},
dependencies: {},
})