the hub is the control plane — one server the whole bot fleet registers with. it grew out of the scriptable bot and the websocket board's live line. this is how it actually works under the wire
registration and ready
each bot connects and registers. when a bot is ready, the hub answers. it keeps a per-bot set of enabled services, and on ready it sends a start for each one. the viewer answers with its registry — built from the ALCHEMY_LUAU_SERVICE env var (as name service) plus a bot-services.json that maps names to absolute script paths. so a name the hub knows still needs a path the viewer knows
the surface
the viewer answers bot.services, bot.services_reload, and bot.service off that registry. a service is a .luau module returning start() and stop(), run in the persistent bindings vm with full client.* access. from a bare env var, to a file the viewer loads, to a name the hub can start and stop — that's the whole spine of the wire
协议 is protocol. the hub and the clients agree on the messages, and the whole fleet runs on that agreement — the live line from the kanban board, grown into a control plane