snake-game is a classic Snake game delivered as a single, self-contained browser experience. The product intent is narrow and complete: a person opens the game, starts a run, steers a snake around a grid, eats food to grow longer and score points, and sees the run end when the snake collides with a wall or with itself. The player can then start a new run and try to beat their previous score.
The audience is anyone who wants a five-minute arcade classic — people who remember Snake on a Nokia phone or grew up on modern browser games. The register is playful, nostalgic, and unpretentious: a game you open in a tab, play for a few minutes, and smile at. It must feel instantly legible (you know what is food, what is the snake, what is the score) and warmly crafted rather than slick or corporate.
There is no account, no sign-in, no backend service, and no marketing page. The game itself is the first and only screen.
snake-game is a single-page, client-side browser game. The entire product is one playable surface — the Game page — which is also the public entry surface. The player lands directly on the game board, presses START, and plays.
The game runs entirely in the browser. The snake advances in discrete grid steps on a fixed square board; the player changes the snake's direction with the arrow keys (or the on-screen arrow legend on touch devices); eating the coral apple grows the snake by one tile and increments the score; the run ends on collision with a wall or with the snake's own body. The score and the best score achieved in the session are shown in a compact status bar above the board.
Delivery ownership. The product is a first-party, browser-delivered game with no server-side component and no external provider. All game logic, rendering, input handling, and score tracking happen in the client. There is no headless delivery, no provider-owned surface, and no external destination.
Access ownership. The Game page is publicly reachable with no identity requirement. There is no account, no login, no session continuity across visits, and no persisted profile. The high score is a session-scoped value shown in the status bar; it is not bound to any identity and does not require one.
Current vs. future boundary. Everything described in this document is current. No future capabilities have been accepted by the source. There is no leaderboard, no multiplayer, no level editor, no sound system, no difficulty selector, and no persistence layer in the current scope.
Exclusions. The following are explicitly out of scope for the current product: any blue or indigo in the palette; rounded corners, soft shadows, or glassmorphism; gradient blobs, glowing effects, or particle fields behind the board; photography or 3D renders; bouncy or springy easing; and a marketing landing page above the game.
The Game page is the single page of the product and the public entry surface. It is a single-column, centred composition on a warm paper ground. The game board is the hero; the title, status bar, controls, and legend support it.
Information and state
SCORE 0000 with leading zeros preserved, in tabular Space Mono Bold.HIGH 0000 with leading zeros preserved, in tabular Space Mono Bold.Primary actions
Supporting actions
Domain entities
min(80vw, 80vh) capped at 640px.Component responsibilities
SNAKE in Press Start 2P, uppercase, ink black, centred, with a 4px coral underline spanning exactly the width of the word.States
FR-1 — Start a new run (explicit) As a Player, I should be able to start a new run so that I can begin playing.
FR-2 — Control the snake's direction (explicit) As a Player, I should be able to control the snake's direction so that I can steer it around the board.
FR-3 — Eat food and grow (explicit) As a Player, I should be able to eat food so that the snake grows longer and my score increases.
FR-4 — See the score (explicit) As a Player, I should be able to see my score so that I know how well I am doing in the current run.
SCORE 0000 with leading zeros preserved, in tabular Space Mono Bold, with a coral flash on each point scored.FR-5 — See the high score (explicit) As a Player, I should be able to see the high score so that I know the best result of my session.
HIGH 0000 with leading zeros preserved, updated to the new best value.FR-6 — End the run on collision (explicit) As a Player, I should have the run end when the snake collides so that the game has a clear outcome.
FR-7 — Pause and resume (required_inference) As a Player, I should be able to pause and resume so that I can step away without losing my run.
FR-8 — Restart a run (required_inference) As a Player, I should be able to restart so that I can begin a fresh run after a game over or mid-run.
Product context. The Player is the single active human role in snake-game. They arrive at the game directly — there is no sign-in, no onboarding, and no marketing page between them and the board. They may be on a desktop with a keyboard or on a touch device, and they expect to understand the game within seconds of it loading.
Primary goal. To steer the snake, eat food, grow longer, and achieve a high score in a run — then start a new run to try to beat it.
Distinct accepted responsibilities.
Relevant inputs or decisions.
Interactions with other accepted participants. None. The Player is the only accepted human participant; there is no opponent, no spectator, and no external service in the loop.
Observable success. The Player completes a run, sees a final score on the game-over overlay, and can immediately restart to try to beat their session high score.
What makes this role distinct. The Player's work is entirely reactive and continuous: they do not configure, submit, or manage anything — they steer a moving object in real time and respond to the consequences of their own prior inputs. Their success is measured by a single number that they are trying to beat.
SNAKE sits above a pixel-art divider, the status bar reads SCORE 0000 and HIGH 0000, and the board shows an empty grid. Owner: Game page.Failure and recovery. If the Player makes a wrong turn and collides, the run ends cleanly with the game-over overlay and a restart action — no state is lost beyond the current run's score, and the session high score is preserved.
Continuation. The Player can restart repeatedly within the same session, each time trying to beat the high score shown in the status bar.
Failure and recovery. If the Player presses PAUSE while the game is idle or over, nothing happens; the control is unavailable in those states.
Continuation. The run continues from exactly where it was paused.
Failure and recovery. Not applicable; restart is always available during a run.
Continuation. The high score is retained, and the Player continues playing the new run.
The creative direction is authoritative for this section. The muse is Susan Kare, and the headline is "Charming clarity, one pixel at a time — a snake game with the warmth of the original Macintosh." The direction is translated into concrete tokens below.
| Role | Hex | Usage |
|---|---|---|
| Background | #F4F1E8 | Warm off-white paper ground filling the viewport |
| Surface | #FFFFFF | Game board and status-bar panels |
| Text | #1A1A1A | All text and the snake's body |
| Primary | #3B6E3B | The snake, the START button, active UI states |
| Accent | #E85D3A | The food apple, score highlights, game-over flash |
| Muted | #8A8678 | Secondary labels and disabled states |
No blue anywhere. Colours are flat and unshaded, like a 1-bit palette extended by exactly two hues.
Hard pixel edges everywhere — no border-radius. The game board is a strict square grid. Buttons are chunky rectangles with a 2px ink border and a 3px offset shadow (like a pressed key). Panels are white rectangles with 2px ink borders. The only softness is the warm off-white ground. Pixel icons are drawn on an 8×8 or 16×16 grid: apple, snake head, trophy, arrow keys.
Single-column, centred composition on a warm paper ground. The game board is the hero: a large square (min(80vw, 80vh) capped at 640px) centred on the page, with a 2px ink border and a 3px offset shadow. Above it, a compact status bar: score on the left (label in small caps, number in tabular mono), high score on the right, both in white panels with ink borders. Below it, a row of chunky pixel buttons: START / PAUSE / RESTART, plus a small arrow-key legend.
Pixel icons and simple pictograms only — no photography, no illustration for its own sake. The snake is a chain of 16×16 pixel tiles with a distinct head (two eyes, a tongue). The food is a single 16×16 pixel apple in coral. The trophy for high score is a 16×16 pixel cup. Decorative elements are limited to a small pixel-art divider (a row of alternating ink and coral squares) between sections. The game board itself is the primary visual.
The board is the hero. The first screen is the game itself, not a marketing page. A warm off-white ground (#F4F1E8) fills the viewport. At the top, the game title SNAKE is set in Press Start 2P at 64px mobile → 96px desktop, ink black, uppercase, centred, with a 4px coral underline that spans exactly the width of the word. Directly below, a thin ink rule and a pixel-art divider — a row of alternating ink and coral squares — separate the title from the game area.
The game board — a large white square with a 2px ink border and a 3px offset shadow — dominates the centre, showing the snake (green tiles), the food (coral apple), and an empty grid ready to play. Above the board, a compact status bar with two white panels: SCORE 0000 on the left, HIGH 0000 on the right, both in Space Mono with small-caps labels. Below the board, three chunky pixel buttons (START, PAUSE, RESTART) in a row, each with a 2px ink border and 3px offset shadow. To the right of the status bar, a small pixel-art legend shows the arrow keys.
The composition is centred, symmetrical, and feels like a beautifully crafted little machine — not a SaaS hero. The signature moves are: the board as hero; pixel-art snake and food drawn on the same grid as the play area; chunky pressed-key buttons whose offset shadow collapses and which shift 3px down-right on press; score as ornament with leading zeros preserved and a coral flash on every point; and the pixel-art divider echoing the original Macintosh's love of small, legible symbols.
Interaction Model: Static Motion Tempo: restrained Hero Dimensionality: flat
Focal subject. The game board itself — a large white square with a 2px ink border and a 3px offset shadow, centred on the warm paper ground, showing the snake (green tiles), the food (coral apple), and an empty grid ready to play.
Input → transformation → outcome thesis. The player presses START → the board places a snake and a coral apple and the snake begins advancing in discrete grid steps → the player steers, eats food, grows, and scores until a collision ends the run and the game-over overlay appears. The hero is not an animation; it is the playable board, and its motion is the game's motion.
Motion vocabulary. Frame-by-frame, mechanical, no easing theatrics. The snake moves in discrete grid steps (a tick every ~120ms, accelerating as it grows). Eating food triggers a two-frame pixel pop on the food icon and a brief score-number flash. Game over is a four-frame blink of the board border in coral, then the overlay appears. Buttons have a press-down effect: the offset shadow collapses to 0 and the button shifts 3px down-right. No fades, no springs, no particles.
Composed first frame. The viewport is filled with #F4F1E8. The title SNAKE sits centred at the top in Press Start 2P with a 4px coral underline. A thin ink rule and a pixel-art divider separate it from the game area. The board — white, 2px ink border, 3px offset shadow — dominates the centre with an empty grid. The status bar reads SCORE 0000 and HIGH 0000. The START, PAUSE, and RESTART buttons sit below the board, and the arrow-key legend sits to the right of the status bar.
Reduced-motion state. With prefers-reduced-motion, the border blink and score flash are removed; only the discrete grid movement remains. The board, status bar, buttons, and legend are unchanged and fully usable.
NFR-1 — Client-side delivery (explicit) The game runs entirely in the browser with no server-side component, no backend service, and no external provider. All game logic, rendering, input handling, and score tracking happen in the client.
NFR-2 — Public access (explicit) The Game page is publicly reachable with no identity requirement. There is no account, no login, and no session continuity across visits.
NFR-3 — Responsive legibility (explicit)
Readable text and controls stay whole at every viewport. Headlines, wordmarks, labels, numbers, and controls stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling (for example font-size: clamp(...) with its mobile size) to fit, and no other element covers any part of them.
NFR-4 — Reduced motion (explicit)
With prefers-reduced-motion, the border blink and score flash are removed, keeping only the discrete grid movement. A usable static arrangement is provided.
NFR-5 — Palette constraint (explicit) No blue or indigo anywhere in the palette. The palette is green and coral on warm paper.
NFR-6 — Shape constraint (explicit) No rounded corners, soft shadows, or glassmorphism. Everything is hard-edged and flat.
NFR-7 — Typography constraint (explicit) No Inter, Roboto, Arial, Helvetica, or system-ui. The pixel and mono faces are the voice.
NFR-8 — Imagery constraint (explicit) No photography or 3D renders. The imagery is pixel icons only.
NFR-9 — Motion constraint (explicit) No bouncy or springy easing. Motion is discrete and mechanical.
NFR-10 — No marketing page (explicit) There is no marketing landing page above the game. The game is the first screen.
Assumptions
Constraints
HIGH 0000.SCORE 0000.No completed page designs yet.
Completed design pages will appear here when they are ready to preview.
No completed page designs yet.
Completed design pages will appear here when they are ready to preview.
No comments yet. Be the first!