Open Arcade Template
The one canonical layout for Open Arcade pages. Every page is built from this template, in this same tree, by the same builder (build_openarcade.py). One tree, one builder, no copies drifting apart.
Anatomy of the watch page
▶
Header, 60px:logo · search · gray Shuffle · Discord login (top right)Chips row: All · Worlds · Multiplayer · Platformers · Arcade · Puzzles · Cozy
Player, 16:9, the game loads here
Under the player: game title, maker row, actions (Favorite, Full screen, Open game, Share), then the description box with how to play and your progress line.
Up next sidebar, 402px
Below: the browse grid of every game, then the footer.
House rules
- One tree. The whole site (home, brand, template) builds from
~/workspace/openarcade/with one builder. Never fork a second tree. - Games load in the player. A game joins only after a header check proves it can be framed, and a click-through proves it plays. Anything that blocks framing stays out.
- Covers are ours. 16:9 WebP in
img/, named by game id. No hotlinked images, ever. - Honest labels. Multiplayer means real people or a shared keyboard, exactly as badged. Credits name the maker on every game.
- Login is Discord. The button rides the shared E2 login (e2-auth) and lands back here. Progress saves through openarcade-api to the player's own account.
- Plain words. No em dashes anywhere on the site. Short sentences. The link ships in the same message as the announcement.
Adding a game
Add one entry to the games list in the builder (id, title, play URL, maker, genre, category, description, how to play, multiplayer flag when it truly applies), drop its cover at img/<id>.webp, rebuild, deploy, and verify live by title, cover, and a click in the player.