Seventeen comments opened with a tag naming the tool that wrote them. The tag goes and each comment keeps its reasoning, now starting as a plain sentence. None of the reasoning changes. The AGENTS.md note in .gitignore drops the story of how the file got into the tree and keeps the one fact a reader needs: its advice to run go fmt is destructive on this CRLF working tree. Comments only; no code, build or test changes.
Lobby image (Paper + felis-paper)
The always-on lobby hub. felis setup provisions it as a system service
(DesiredState=Running, reaper-exempt) when [velocity] lobby_image is set in
felis.toml.
Code-only. Not built by the Go CI. It compiles the
plugins/paper/menuface and bundles it onto a Paper server.
Topology & the one invariant
connect → login (limbo auth gate) → lobby (/menu hub) → target backend
The lobby is reached only when the login gate transfers an authenticated player onward. It is never a fallback or waiting-park target — routing a fresh connection to the lobby would drop the player past authentication. Felis enforces this at every layer:
- the login system service has no fallback (refuse if down);
- the lobby and every user server fall back to login, never to the lobby;
buildSystemServerrefuses to construct any service whose fallback islobby;felis setupprints the off-cluster Velocity wiring: default landing and waiting-park both point atlogin.
Build
docker build -f deploy/lobby/Dockerfile \
--build-arg PAPER_JAR_URL=https://<mirror>/paper-1.21.x-<build>.jar \
--build-arg PAPER_JAR_SHA256=<sha256 of that jar> \
-t felis-lobby:demo .
docker save felis-lobby:demo | sudo k3s ctr images import -
# felis.toml → [velocity] lobby_image = "felis-lobby:demo"
sudo felis setup
Configure (deployer's responsibility)
- Game port must be
25565(the CRDGamePort). - Align
online-mode/ player forwarding with the off-cluster Velocity proxy. - The lobby speaks only the
felis:controlplugin-message channel; it holds no felis-api token by design (spec §12).