Architecture · How Open Arcade Is Built
One site, one tree.
This page is the written structure of Open Arcade: one folder that is the whole site, one Cloudflare Pages project it deploys to, the game list kept as data and baked in at build time, and proof by eye before anything is called done. It exists so the site can never quietly split into two copies that overwrite each other.
The One Rule
One source of truth. Open Arcade lives in exactly one folder (~/workspace/openarcade). That folder, and only that folder, is deployed to the Pages project named openarcade. If a file is not in that folder, it is not on the site. No second tree, no shadow copy, no exceptions.
Rule 1
One tree
Pages, covers, logo files and the small print files all live in the single deploy tree. Working folders elsewhere are tools and inputs, never deploy sources, and are named below.
Rule 2
The game list is data
The builder reads the GameBoat catalogs and bakes the list into the homepage at build time. Counts, categories and order change in the data, never by editing numbers into a page.
Rule 3
One builder
build_openarcade.py builds the homepage, /brand/, /template/ and this page in one run. Every page has exactly one way it gets made, so the written system cannot drift from the site it describes.
Rule 4
Hosting follows the game
Games stay on their own hosts and play inside the player only after a header check proves they can be framed; anything that blocks framing stays out. Covers are copied into /img/, never hotlinked from another site.
Rule 5
One deploy pipe
Deploys upload the whole audited tree in one run. Before upload: file count, total size, and every expected path present and non-zero.
Rule 6
Proof by eye
A deploy is done only when the live page is read back and checked by title and content, including a page below the homepage. A status code alone never counts.
The Folder Map
What lives where.
img/<id>.webp). Every image the site shows is served from this site, never borrowed from another domain.Ownership
Who writes what.
| Page or data | Builder or owner | Notes |
|---|---|---|
| / (the app) | build_openarcade.py | One builder for the whole site. Games come from the catalogs, never from a list pasted into the page. |
| /brand/ /template/ /architecture/ | build_openarcade.py | The written system is built in the same run as the site, so it cannot drift from what it describes. |
| Game data | GameBoat catalogs | Curation and the embed check happen before a game joins the catalog pull. |
| Progress | openarcade-api Worker | Code and deploy script live in ~/workspace/openarcade-auth/. No secrets in this Worker. |
| Login | e2-auth Worker | The shared Discord login. Open Arcade never stores passwords; it holds a session token. |
| www redirect | openarcade-www-redirect Worker | One route (www.openarcade.lol/*), one job: send www to the apex. |
Not Deploy Trees
Three nearby folders serve the site but are never deployed: ~/workspace/gameboat-catalog/ (the source data the builder reads), ~/workspace/openarcade-auth/ (Worker code and deploy scripts), and ~/workspace/openarcade-assets-raw/ (raw logo art before it is sized into /img/). The GameBoat tree is a different site entirely that feeds the catalog. Confusing any of these with the deploy tree is how double trees are born, so they are written down here.
The Domain
openarcade.lol is registered at Porkbun and its DNS zone lives on Cloudflare, on the assigned nameservers diana.ns.cloudflare.com and lex.ns.cloudflare.com. The apex attaches to the single Pages project as a custom domain, www 301-redirects to the apex through the redirect Worker, and openarcade-epu.pages.dev stays as the permanent mirror address. One project, one tree, one front door.