retro-games is a browser-delivered SaaS application that hosts a collection of different retro games and lets people play them with proper controls. The product intent is narrow and deliberate: a multi-user, web-delivered arcade where a visitor can arrive, browse a catalogue of distinct retro titles, launch one, and immediately operate it through controls that are legible, tactile, and obviously operable — an on-screen control deck plus matching keyboard input.
The audience is broad and casual: people who grew up with 8-bit and 16-bit machines, and people who romanticise them. They are not expected to read instructions before playing. The product must therefore make the controls self-evident at first glance and let the game canvas be the only loud thing on the page.
The emotional register is nostalgic delight, not corporate productivity. The application should feel like a well-kept cabinet of playable artefacts.
retro-games is a single first-party web application with three current destinations: a public Landing page, a Games catalogue, and a Game Play session surface. All three are anonymously reachable; no account, sign-in, or identity establishment is required or accepted for the current product.
The only accepted active human actor is the Player. The Player browses the catalogue, selects a title, launches it, and operates it through the on-screen control deck and the physical keyboard. The application itself owns game hosting, catalogue presentation, the playable session surface, and the control mapping between on-screen controls, keyboard keys, and the running game.
Current accepted behavior is limited to: hosting multiple different retro games, presenting them for selection, and making each one playable with proper controls. There is no accepted account system, no accepted social or multiplayer capability, no accepted payment or subscription flow, no accepted leaderboard persistence, and no accepted administrative or moderation surface. Where the shell displays score and high-score presentation, that presentation is part of the play surface's visual language, not a separate accepted competitive or persistence feature.
Delivery ownership. retro-games is a first-party, browser-delivered SaaS application. The application owns the Landing page, the Games catalogue, and the Game Play session surface, including the on-screen control deck, the keyboard legend, and the mapping of both to the running game. The application is the sole owner of every accepted human-facing interaction in the current product.
Access ownership. All three current destinations are anonymously reachable. The Player is never asked to create an account, sign in, or establish identity in order to browse or play. This is a deliberate boundary, not an omission: nothing in the accepted behavior requires durable actor-specific state, a commitment bound to a particular participant, an entitlement, or a value transfer that would need to survive across sessions under a verified identity. Consequently no identity establishment, verification, invitation, provisioning, or account-management capability is part of the current product.
Current versus future. Current scope is exactly: multiple different retro games, a catalogue to browse and select from, and a playable session with proper controls. Anything beyond that — accounts, saved progress, competitive ranking, social features, commerce — is out of current scope and is not implemented, not implied by any page, and not required by any acceptance criterion in this document.
Explicit exclusions. The product does not include user accounts or authentication, does not include payments or subscriptions, does not include multiplayer or social interaction, does not include an administrative or content-management surface, and does not include any capability whose only justification is that similar products conventionally have it.
Purpose. Anonymous first impression: explain what retro-games is, who it is for, and what it does, before the Player enters the catalogue.
Information and state.
PLAY THE CLASSICS. set in Press Start 2P, left-aligned, spanning two stacked lines at 1280px and wrapping whole at 375px.#141414 border.Primary actions.
PLAY NOW — a single #E5482F button cut into the bottom edge of the demo panel, carrying a hard 3px #141414 offset shadow. Navigates to Game Play for the featured title.Supporting actions.
PLAY NOW, and marquee tiles.Domain entities. Game (title, pixel icon, year, one-line blurb, cover frame), Featured Game (the title used for the looping demo).
Component responsibilities.
HeroTypeBlock — renders the headline and supporting copy; enforces the two-line maximum for Press Start 2P.DemoPanel — hosts the looping 8-second demo, the adjacent pixel D-pad affordance, and the PLAY NOW tab.GameTileMarquee — renders the full-bleed scrolling strip of game tiles; crosses the viewport edge by design.PixelIcon — 16×16 / 24×24 / 48×48 Kare-grid icons used as section markers and tile art.DottedRule / PixelCornerBracket — 1px dotted rules and pixel-corner brackets framing sections.States.
PLAY NOW is disabled.PLAY NOW is active.Purpose. The catalogue: browse the available retro games and select one to play.
Information and state.
PLAY tab in #E5482F cut into the bottom edge of each card, physically overlapping the card border.Primary actions.
PLAY on any card — launches that title's Game Play session.PLAY.Supporting actions.
#E5482F focus ring.Domain entities. Game (title, year, blurb, pixel icon, cover frame, control scheme).
Component responsibilities.
GameTileGrid — responsive 12-column grid, 24px gutter at 1280px, single column at 375px.GameCard — 2px #141414 border, 3px hard offset shadow, 4px/8px radius only; presses (translates 2px down, shadow shrinks to 1px) rather than lifts.PlayTab — the #E5482F tab overlapping the card's bottom border.PixelIcon — per-title icon on the Kare grid.CoverFrame — 16:9 pixel-art frame, never photographic.States.
PLAY tab fully inside their containers at 375px, 768px, and 1280px.TRY AGAIN control that re-requests the catalogue.Purpose. The playable session: the selected retro game is launched and operated through its proper controls.
Information and state.
#141414 border.Primary actions.
Supporting actions.
Domain entities. Game (title, year, control scheme), Session (running instance of a title), ControlBinding (on-screen control ↔ keyboard key ↔ game input), Score (current), HighScore (best recorded for the title in this session context).
Component responsibilities.
GameCanvasPanel — white panel, 2px #141414 border, hosts the running game; the only saturated element on the page.ControlDeck — plus-shaped D-pad and two beveled circular action buttons, each with a 2px #141414 border and a 3px hard offset shadow that shrinks to 1px when pressed.KeycapLegend — persistent strip mapping each on-screen control to its physical key; highlights the matching key as it is pressed.ScoreReadout — tabular numerals; digits tick over one frame at a time like a mechanical counter.HighScoreTable — tabular numerals with dotted 2px row rules.SessionControls — restart and exit.States.
#E5482F; the score updates.TRY AGAIN plus a link back to Games.TRY AGAIN re-launches the same title in place; Restart resets the current session; Exit returns to Games with the catalogue state preserved.FR-1 — Host multiple different retro games (explicit) As a Player, I should find more than one distinct retro game available in the application, so that the product is a collection rather than a single title.
FR-2 — Browse the catalogue of retro games (explicit) As a Player, I should browse the available retro games in a catalogue, so that I can see what is on offer before choosing.
PLAY tab cut into the bottom edge.TRY AGAIN re-fetches the catalogue.FR-3 — Select a game to play (explicit) As a Player, I should select a specific retro game from the catalogue, so that the application launches that title.
PLAY tab or the card body, by pointer or keyboard.TRY AGAIN and a link back to Games.FR-4 — Play a retro game with proper on-screen controls (explicit) As a Player, I should operate the selected retro game through an on-screen control deck, so that I can actually play it.
#E5482F.TRY AGAIN; the control deck remains visible and inert until the game is ready.FR-5 — Play a retro game with proper keyboard controls (explicit) As a Player, I should operate the selected retro game with the physical keyboard, so that I can play with the input method I prefer.
FR-6 — See the control mapping at all times during play (explicit) As a Player, I should see which physical key corresponds to each on-screen control while I play, so that I can learn the controls without leaving the game.
FR-7 — See the current score and the best score during play (explicit) As a Player, I should see my current score and the best score for the title I am playing, so that I can judge how I am doing.
FR-8 — Restart or exit a play session (explicit) As a Player, I should be able to restart the current game or leave it and return to the catalogue, so that I am never stuck in a session.
Restart or Exit on the Game Play page.Restart resets the current session in place; Exit returns to Games with the catalogue state preserved.Restart fails to re-launch, the panel shows the pixel alert state with TRY AGAIN; Exit remains operable.FR-9 — Understand what the product is before playing (explicit) As a Player, I should understand what retro-games is and what it does on arrival, so that I can decide to start playing.
PLAY THE CLASSICS. headline, a short supporting line, a looping 8-second demo of the first game, and a PLAY NOW button are all visible and fully inside the viewport at 375px, 768px, and 1280px.PLAY NOW or browses the catalogue.Product context. The Player is the sole accepted active human actor in retro-games. They arrive at a browser-delivered arcade of classic games, most often casually and without prior instruction, expecting to be playing within seconds. They may be returning to titles they grew up with, or encountering 8-bit and 16-bit games for the first time. They are not a power user of the product's chrome; they are a player of its games.
Primary goal. To browse the available retro games, launch one, and play it with controls that work immediately and are obviously operable.
Distinct accepted responsibilities.
Relevant inputs and decisions.
Interactions with other accepted participants. None. The Player is the only accepted active human actor; there is no counterparty, recipient, or co-participant in any accepted capability. The application itself is the only other actor, and it acts as the host and input-mapping system.
Observable success. The Player can open the application, reach the catalogue, launch any listed retro game, and operate it with working, appropriate controls — on-screen and via keyboard — with the control mapping visible at all times and the score readable during play.
Constraints carried from source. No account, sign-in, or identity establishment is required at any point. All three destinations are anonymously reachable.
PLAY THE CLASSICS. headline, the short supporting line, and the looping 8-second demo of the first game running inside its white panel.PLAY NOW button cut into the panel's bottom edge with its hard 3px shadow.PLAY NOW to launch the featured title, selects a tile in the marquee, or follows the catalogue link to browse everything.#E5482F PLAY tab overlapping the card's bottom border.PLAY tab or its card body, by pointer or by keyboard traversal with the visible #E5482F focus ring.TRY AGAIN control that re-fetches the catalogue in place. If the catalogue is genuinely empty, a pixel empty-state icon with "No games in the cabinet yet." and a link back to Landing is shown.#141414 border, the title and year above it, and the control deck below it — plus-shaped D-pad on the left, two beveled circular action buttons on the right at 1280px and 768px, stacked into two rows at 375px.#E5482F.TRY AGAIN plus a link back to Games. The control deck remains visible and inert until the game is ready.Restart or Exit.Restart fails to re-launch the title, the panel shows the pixel alert state with TRY AGAIN; Exit remains operable so the Player is never stuck.Muse and headline. Susan Kare — Charming clarity, pixel-perfect: the original Macintosh icon voice, rebuilt for a retro arcade SaaS. The shell is warm paper, near-black, and one alert-orange; the games are the only saturated thing on screen.
| Role | Hex | Usage |
|---|---|---|
| Background | #F4F1EA | Warm paper ground, like a Macintosh case |
| Surface | #FFFFFF | Game cards, panels, the canvas panel |
| Text | #141414 | Type, 1px pixel borders, hard offset shadows |
| Primary | #141414 | Primary structural colour; borders, shadows, headline |
| Accent | #E5482F | Primary CTA, active control key, focus ring — never a background wash |
| Muted | #8A8578 | Metadata, scores, key hints |
Game canvases are permitted their own colours. The shell stays monochrome plus one accent.
clamp(28px, 6vw, 56px) with 0.02em tracking. Section labels 11–13px with 0.18em letterspacing. Never more than two lines of it in a row.Grid-honest and chunky. 4px and 8px radii only — nothing pill-shaped, nothing soft-focus. Cards, control pads, and buttons carry a 2px solid #141414 border with a 3px hard offset shadow in #141414 (a printed-pixel drop, not a blur). Icons are drawn on a 16×16 or 24×24 pixel grid with 1px strokes and no anti-aliased curves. The D-pad is a true plus shape; buttons are circles with a visible keycap bevel. Rules are 1px solid #141414 or dotted 2px for score table rows. No gradients, no glass, no blur.
12-column grid with a 24px gutter at 1280px, collapsing to a single column at 375px.
PLAY button cut into the bottom edge.Every control, label, and score stays entirely inside its container at all three widths. Only the filmstrip and marquee may cross an edge, and both become scrollable with whole items under prefers-reduced-motion.
Pixel icons and pictograms drawn on the Kare grid — joystick, cartridge, floppy, coin, alien, paddle, ghost, high-score star — each 24×24 or 48×48 with 1px strokes and a two-colour maximum. Game covers are rendered as 16:9 pixel-art frames inside the card border, never photographic. Decorative 1px dotted rules and small pixel-corner brackets frame sections. No stock photography, no 3D renders, no illustration that is not on the pixel grid.
The cabinet, not the dashboard.
The public entry is composed as a physical arcade cabinet face rather than a SaaS hero. On the warm #F4F1EA paper ground, an oversized PLAY THE CLASSICS. headline in Press Start 2P sits left-aligned and spans two stacked lines at 1280px, wrapping whole at 375px. To its right at 1280px — below it at 375px — sits one large white panel with a 2px #141414 border containing a live, playable 8-second demo of the first game running on a loop. A pixel D-pad is drawn beside the demo, and a single #E5482F PLAY NOW button is cut into the bottom edge of the panel, its hard 3px shadow visible.
Beneath both, a full-width marquee of game tiles scrolls left-to-right across the viewport, crossing the edge by design and stopping and wrapping to whole items under reduced motion.
The signature moves that carry the concept through the product:
#141414 border and a 3px hard offset shadow that shrinks to 1px when pressed, plus a live keycap legend that highlights the matching physical key as it is pressed.#E5482F PLAY tab that physically overlaps the card border, like a sticker slapped on a cartridge.prefers-reduced-motion, stops and wraps into whole rows.No centred stack, no gradient, no floating cards, no blue.
Interaction Model: Static Motion Tempo: restrained Hero Dimensionality: flat
Focal subject. The live, looping 8-second demo of the first game running inside its white bordered panel, with the pixel D-pad drawn beside it and the #E5482F PLAY NOW tab cut into the panel's bottom edge.
Input → transformation → outcome thesis. The Player arrives on the warm paper ground and the demo is already running — no input is required to see the product working. The Player's first input is either activating PLAY NOW (which launches the featured title's Game Play session) or selecting a tile in the marquee (which launches that title). The transformation is from spectator to player: the demo panel is the promise, and the PLAY NOW tab is the door.
Motion vocabulary. Frame-based and mechanical, never eased theatrically. Menu tiles step in on a 6-step stagger with no fade. The cursor is a 1px pixel arrow. Buttons depress by translating 2px down as their hard shadow shrinks from 3px to 1px. Score digits tick over one frame at a time like a mechanical counter. The marquee strip scrolls continuously at 40px/s. No parallax, no float, no bounce, no particles.
Composed first frame. At 1280px: the PLAY THE CLASSICS. headline occupies the left of the viewport in two stacked lines of Press Start 2P at #141414; the white demo panel with its 2px border sits to the right, the demo already running, the pixel D-pad beside it, the #E5482F PLAY NOW tab overlapping the panel's bottom edge with its 3px hard shadow visible. Beneath both, the marquee of game tiles is mid-scroll, crossing the viewport edge. At 375px: the headline wraps whole above the demo panel, which sits full-width below it; the marquee remains full-bleed and scrollable.
Reduced-motion state. Under prefers-reduced-motion, the marquee stops entirely and wraps into whole rows so every tile is fully readable without scrolling motion. The demo panel holds a static first frame rather than looping. Tile stagger, button depression, and score ticking are suppressed; all controls remain fully operable and all content remains whole and inside its container.
NFR-1 — Responsive integrity at three widths (explicit, from the creative direction)
Every headline, wordmark, label, number, item image, card, and control stays entirely inside the viewport and its container at 375px, 768px, and 1280px, wrapping or scaling (for example font-size: clamp(...) with its mobile size) to fit. No other element covers any part of them. Crops, bleeds, and off-edge placement are reserved for decoration only — shapes, textures, rules, and background art. The one exception is moving content: marquees, tickers, carousels, and horizontally scrollable rows may cross the viewport or container edge by design, judged by whether they actually move or scroll and whether every item becomes fully readable as it passes.
NFR-2 — Reduced-motion compliance (explicit, from the creative direction)
Under prefers-reduced-motion, the marquee stops and shows whole items, wrapping into rows or sitting in a horizontally scrollable row (overflow-x: auto) whose further items are reached by scrolling. Tile stagger, button depression animation, and score ticking are suppressed. All content remains whole and all controls remain operable.
NFR-3 — Control legibility and operability (explicit, from "proper controls")
The on-screen control deck and the keyboard legend must be legible and operable at all three target widths. The D-pad is a true plus shape; action buttons are circles with a visible keycap bevel. Every control carries a 2px #141414 border and a 3px hard offset shadow that shrinks to 1px when pressed. The active control key is highlighted in #E5482F.
NFR-4 — Focus visibility (explicit, from the creative direction)
Keyboard focus is indicated by an #E5482F focus ring on every interactive element, including catalogue cards, the PLAY tabs, the control deck, and the session controls.
NFR-5 — Anonymous access (explicit, from the planning scope access contract) All three current destinations — Landing, Games, and Game Play — are anonymously reachable. No account creation, sign-in, or identity verification is required or offered.
NFR-6 — No forbidden visual patterns (explicit, from the creative direction)
The shell uses no Bootstrap blue or indigo primaries (#0057FF, #2563EB, #6366F1) on white, no Inter, Roboto, Arial, Helvetica, Poppins, or system-ui for headings or body, no gradient-blob heroes, no glassmorphism, no frosted panels, no soft blurred shadows, no uniform grid of identical hover-lift cards, no rounded pill buttons, and no radii above 8px. No photographic or 3D-rendered imagery appears inside the shell; every graphic is on the pixel grid.
NFR-7 — Score and timer numerals (explicit, from the creative direction) Scores, timers, and high-score tables use Work Sans tabular numerals so digits do not shift horizontally as values change.
#F4F1EA ground, #FFFFFF surfaces, #141414 text/borders/shadows, #E5482F accent, #8A8578 muted; Press Start 2P for headings, Work Sans for body; 4px and 8px radii only; 2px borders with 3px hard offset shadows.Kubernetes is not required: the deployment shape is a single web application with a small catalogue API, with no accepted requirement for horizontal scale, multi-region distribution, or orchestrated workloads.
Assumptions.
Constraints.
Out of current scope. User accounts and authentication; payments and subscriptions; multiplayer and social features; administrative and content-management surfaces; cross-session progress persistence; leaderboards shared between players.
#141414 shadow with no blur, which shrinks to 1px when the element is pressed.
Browser arcade · 1978–1980
retro-games is a browser arcade of classic games, playable with proper controls.
Browse the catalogue[ THE SHELF ]
4 titles in cabinet

Browser arcade · 1978–1980
retro-games is a browser arcade of classic games, playable with proper controls.
Browse the catalogue[ THE SHELF ]
4 titles in cabinet
No comments yet. Be the first!