A local-first front end for running Archipelago multiworlds on Windows: keep the roster on your own machine, generate from it with no network involved, and host the resulting seed locally or publish it to archipelago.gg.
Standard library only - no pip install, no virtualenv. If you have Python and an Archipelago install, you have everything.
Most tooling around a multiworld treats a remote lobby as the source of truth. That means every generation re-scrapes someone else's server, the roster evaporates between runs, and nothing works offline. Here the local lobby owns the roster; a remote room is one way to put configs into it, not the thing that defines it.
Generation touches the network exactly never.
- A durable lobby. Player configs live in
lobby/, with a manifest, content history for superseded versions, and per-player include / sit-out so a roster survives between seeds instead of being rebuilt each time. - Import from anywhere. An Ionium lobby room, a folder, a zip, or individual
.yamlfiles. Re-importing an unchanged config is a no-op; a changed one updates in place and keeps the previous version. - Preflight that tells you the truth. Every player's game is resolved against
the
.apworldfiles actually installed, so you learn about a missing world before generating, not after. Worlds that ship a client are flagged: every player needs the byte-identical file. - Dropped settings are a failure, not a footnote. When a config asks for an option the installed world does not have, Archipelago drops it silently and generates a seed that looks fine while a player quietly does not get the game they configured. That exits non-zero here unless you waive it.
- A run lock. Every generation records what it was built from - world files, hashes, versions, sources - beside the seed, so a run stays explicable months later.
- Where to get things. Two upstreams matter per game and they are
different questions: the
.apworldthe generator needs, and the client or mod the player installs to actually play. Both are tracked as links with the evidence they were read from, the games in your lobby are checked before the rest of the catalogue, and nothing is ever downloaded automatically - GitHub release layouts vary too much per project for that to be safe. - One chosen seed, visibly. The seed being hosted or published is picked from a list of every run on disk, shown by name, date and size, and both destinations use that one choice rather than each resolving its own idea of "the latest".
- A tracker, launched for you. The local tracker bridge can be started against the seed being hosted, with its slots read from that run's lock rather than typed - so it cannot end up watching a slot the running room does not contain. Worlds whose compiled modules target a different Python are reported before launch, because the dashboard would otherwise just show an empty reachability panel.
- Edit any game's settings as a form. Archipelago generates a documented template for every installed world, so the app reads that and builds the editor from it - toggles, ranges with their real bounds, and lists to pick from, with each option's own documentation. No game is special-cased, which matters when 84 of them are installed.
- Local hosting. Start the Archipelago server on this machine against the selected seed, with the server console right there. Nothing is uploaded.
- Publishing, when you want it. Uploading to archipelago.gg is a separate, deliberate step that hands back the links rather than opening a room for you.
- Light and dark. Follows the Windows setting by default, with its own window icon so it is findable in a crowded taskbar.
- Windows (the app shells out to
ArchipelagoGenerate.exeandArchipelagoServer.exe, and usesos.startfile) - Python 3.10 or newer, with tkinter - the standard python.org installer has it
- An Archipelago install, by default
C:\ProgramData\Archipelago
Make a desktop shortcut with the app's own icon, then launch it from there:
python make_shortcut.py --start-menu
Or run the window directly:
python aplobby_gui.py
The shortcut runs aplobby.pyw under pythonw.exe, so there is no console
window behind it. That also means a startup failure has nowhere to print, so
the launcher writes one to crash.log and shows it in a dialog rather than
vanishing.
Or drive it from the command line:
python aplobby.py import folder path\to\configs add configs to the lobby
python aplobby.py list show the roster
python aplobby.py generate build a seed, no network
python aplobby.py seeds list seeds you can host
python aplobby.py host host a seed on this machine
python links.py --lobby-first upstreams, your games first
python links.py --missing clients nobody has investigated
python links.py --resources base ROMs you supply yourself
generate exits 0 on success, 1 if preflight failed, 2 if generation failed,
3 if an import source was unreachable, and 4 if the seed generated but a config
had settings silently dropped.
python aplobby.py host --port 38281
The server binds every interface, so other machines on your network can join at the address it prints. Patch files are not served: a player on another machine still needs their own file out of the seed zip.
Stopping is a clean /exit rather than a kill, because that is what flushes the
save file.
Six suites, all offline except the one that deliberately hosts on loopback:
python selftest_lobby.py the store: identity, history, crash recovery
python selftest_sources.py the importers, with the network stubbed
python selftest_gui.py drives the real window with nobody watching
python selftest_serve.py really starts a server, really connects to it
python selftest_links.py the upstream pointers and their four-state client map
python selftest_options.py option templates, the settings form, config rewriting
They assert rather than print, so a silent pass is a real pass.
lobby/, runs/, every .yaml and every seed are gitignored. Player configs
carry real names; spoilers are the whole playthrough. Nothing in this repository
contains either.
Changes are welcome as pull requests. Please read LICENSE first: this is source-available rather than open source, and it asks that modifications come back here instead of being published as a separate version. Fork, branch, open a PR - that path is explicitly permitted.
If a change you need is not accepted, ask; a narrower permission can be granted in writing.
See LICENSE. In short: run it freely for Archipelago multiworlds, share it unmodified, send changes back as pull requests. Not affiliated with or endorsed by the Archipelago project.