tiktoe-game is a small, self-contained Tic-Tac-Toe game delivered as HTML code that a person opens in a browser and plays immediately. The product intent is deliberately narrow: one page, one board, nine squares, two marks, and the pleasure of a well-drawn X and an O. There is no account, no server, no data collection, and no business surface — the game is the whole product.
The audience is a single person or a pair of people sharing one phone or laptop. They already know how to play Tic-Tac-Toe; the product's job is to get out of the way, present a crisp, legible 3×3 board, alternate turns correctly, announce the result clearly, and let them start another match without friction. The visual and tonal register is warm, nostalgic, and instantly legible, drawn from early personal-computer iconography: chunky outlined tiles, pixel-drawn marks, a paper-white ground, and one crisp signal red.
The product is delivered as HTML code — a single HTML page the user can open and play. That delivery constraint is explicit and binding.
tiktoe-game is a single-page, client-side browser game. The entire experience lives on one page, Game, which is also the public entry surface: opening the HTML file or URL puts the player directly in front of the board. There is no navigation bar, no marketing hero, no login, and no separate settings or results screen.
Actors. The only accepted human actor is the Player — the person playing on a single device in the browser. Because two people may share one device, the same Player persona occupies both sides of the match: the player who places X and the player who places O alternate on the same board, and the status strip names whose turn it is. There are no system, provider, or external actors that a human interacts with; all game logic runs locally in the browser.
Accepted behavior. The Game page introduces Tic-Tac-Toe, presents a 3×3 board of nine chunky outlined tiles, supports alternating turns placing X and O, detects and displays the win or draw outcome, tracks a running score of X wins / draws / O wins, and allows another match via a new-match control and a score reset control.
Ownership. All accepted human-facing behavior is owned by the single first-party page, Game. No provider surface, external destination, or headless delivery is involved. No identity, session, or account continuity is required: the game is public and ephemeral, and a fresh open starts a fresh board.
Exclusions. This document does not introduce online multiplayer, matchmaking, opponent AI, accounts, profiles, persistent leaderboards, chat, monetization, analytics, or any second page. The game is local, single-device, and self-contained.
The authoritative request is to create a Tic-Tac-Toe game and to write the code in HTML. Both are current commitments. The delivery boundary is therefore a single HTML page that runs entirely in the browser with no backend dependency: the player opens it and plays.
Access is public and requires no identity. Nothing in the accepted behavior creates a durable relationship, obligation, entitlement, or value transfer that must remain bound to a particular person, so no account establishment, sign-in, or session continuity is introduced. The running score is a convenience of the current session on the current page, not a persisted per-person record.
Everything described in this document is current. No future-horizon features are accepted, and none are specified here.
Not applicable. No reference directive in this project declares a content_source, so no source content inventory is produced.
The Game page is the public entry surface and the only page. It is a single centred column, max-width 560px, on a warm paper ground, reading as one printed sheet rather than an application shell.
Information and state
TIKTOE in VT323, uppercase, with a pixel X in ink black and a pixel O in signal red sitting as a pair of icons to its right.Primary actions
NEW MATCH clears the board and begins a fresh match while preserving the running score.RESET SCORE returns the X wins / draws / O wins counters to zero.Supporting actions and affordances
Domain entities
Component responsibilities
NEW MATCH and RESET SCORE, built as the same tile shape, slightly shorter, with a 2px bottom edge that depresses 2px on :active.States
NEW MATCH.NEW MATCH clears the board, keeps the running score, and returns the status strip to X's turn. RESET SCORE zeroes the counters at any time without disturbing the board.FR-1 — Open and play the game from HTML As a Player, I should open the delivered HTML and immediately see a playable Tic-Tac-Toe board, so that I can start a match without any setup.
FR-2 — Alternate turns placing X and O As a Player, I should place my mark on a legal empty cell and then hand the device to the other player, so that we alternate turns correctly on one device.
FR-3 — See the win outcome As a Player, I should see clearly when a player has won, so that the match ends unambiguously.
NEW MATCH to play again, or RESET SCORE to zero the counters.FR-4 — See the draw outcome As a Player, I should see clearly when the match is a draw, so that a full board with no line is not left ambiguous.
NEW MATCH to play again, or RESET SCORE to zero the counters.FR-5 — Track the running score As a Player, I should see a running score of X wins, draws, and O wins, so that a series of matches on one device has a visible tally.
RESET SCORE is pressed.FR-6 — Start a new match As a Player, I should be able to start a new match without reloading the page, so that playing again is frictionless.
NEW MATCH.FR-7 — Reset the score As a Player, I should be able to zero the running score, so that a new series can begin cleanly.
RESET SCORE.FR-8 — Deliver the game as HTML code As a Player, I should receive the game as HTML code I can open and play, so that the delivery matches the explicit request.
Product context. The Player is the person playing Tic-Tac-Toe on a single device in a browser. They may be one person playing both sides for fun, or two people passing a phone or laptop between them. They arrive with no account, no onboarding, and no expectation of anything beyond a board and a result. The device may be a 375px phone or a 1280px laptop, and the game must read as one clean sheet at every width.
Primary goal. Complete a full match of Tic-Tac-Toe and know the result — win, loss, or draw — without any friction before, during, or after play.
Distinct accepted responsibilities.
Relevant inputs and decisions. Which empty cell to select on their turn; whether to start a new match after a result; whether to reset the score. The Player's inputs are cell selections and two control presses — nothing else.
Interactions with other accepted participants. There is no other accepted human persona. The Player interacts with the second player only physically, by passing the device; the product supports that handoff through the status strip naming the current turn and the live pixel X or O icon that flips colour as turns pass. The Player also interacts with the board itself, which teaches the next move through the faint ghost mark shown on hover over a legal cell.
Observable success. The Player sees their mark appear in the chosen cell, sees the turn indicator flip to the other mark, sees a clear win line and result line or a clear draw announcement, sees the score increment, and can start another match with one press.
What makes this role distinct. The Player is simultaneously the initiator and the recipient of every state change: they place the mark, and they are the one who must read the resulting turn, outcome, and score. There is no separate operator, administrator, or observer role, and no permission boundary — the whole product is one public surface with one kind of participant.
TIKTOE wordmark in VT323 with a pixel X in ink black and a pixel O in signal red beside it, the body line "Two players. One device. Nine squares.", the status strip, and a 3×3 board of nine empty chunky outlined tiles on the warm paper ground.NEW MATCH.NEW MATCH. The board clears to nine empty tiles, the win line and result line are removed, the status strip returns to X's turn, and the running score is preserved. Play resumes at Flow 1 step 2.NEW MATCH to clear the board and preserve the score, or presses RESET SCORE to return X wins, draws, and O wins to zero before starting again.RESET SCORE.NEW MATCH to begin a fresh series with a clean tally.The creative direction is authoritative for this section. The muse is Susan Kare, and the headline idea is "Charming clarity: the Macintosh icon grid, played as a game." The translation into concrete tokens follows.
Color tokens — light mode (default)
| Role | Hex | Use |
|---|---|---|
| Background | #F4F1E8 | Warm paper-white ground for the whole page |
| Surface | #FFFFFF | Pure white board tiles, so the board reads as a sheet of paper with nine lifted chips |
| Text | #1A1A1A | Ink black: the X mark, all type, and the chunky 2px outlines |
| Primary | #1A1A1A | Ink black as the primary action and structural colour |
| Accent | #E8542F | Macintosh-era signal red: the O mark, the active-turn indicator, and the single hot button — roughly 8% of the surface |
| Muted | #8A8578 | Warm grey for labels, grid coordinates, and secondary copy |
| Focus ring | #3A6EA5 | Secondary blue, used only as a 1px focus ring, never as a fill |
A dark variant may exist but must keep the same ink/red logic; the paper-white ground is the default and the point.
Typography
clamp(40px, 12vw, 96px) in VT323.clamp(28px, 7vw, 44px) in VT323.clamp(44px, 14vw, 88px).Shape language. Chunky 12px-radius square tiles with 2px ink outlines, like system-UI buttons you can almost press. The board is a 3×3 grid of these tiles with 10px gutters. The win line is a thick 6px ink rule drawn across the three winning cells. Buttons are the same tile shape, slightly shorter, with a 2px bottom edge that reads as a physical key. No blobs, no pills, and no soft shadows beyond a 2px offset ink shadow.
Spacing rhythm. A single centred column, max-width 560px, on the warm paper ground. Everything stacks cleanly at 375px with the board filling the width minus 24px of margin; at 768px and 1280px the column stays narrow and centred so the board never becomes a giant empty square.
Imagery style. The imagery is the interface itself: hand-tuned pixel X and O glyphs, a tiny pixel-art trophy for a win, and a pixel handshake for a draw, drawn as inline SVG on a 16-unit grid with hard edges and no anti-aliasing tricks. An optional faint 1px dot-grid texture on the paper ground at 8px spacing and 4% opacity makes the ground feel like graph paper without becoming decoration.
Explicitly avoided. No blue–indigo primary or accent on white; no glassmorphism, frosted panels, or soft multicolour gradient blobs behind the board; no grid of identical hover-lift cards; no Inter, Roboto, Arial, Helvetica, Open Sans, Lato, Poppins, or system-ui for headings or body; no rounded-pill buttons or blob shapes; no bouncy springy micro-interactions; no marketing hero above the game; no dark mode by default. The generic indigo/blue-on-white SaaS template is forbidden for this project.
The board is the first thing you see, and it teaches itself.
The public entry is not a marketing hero — it is the game. A warm paper ground (#F4F1E8) carries a faint 8px dot grid at 4% opacity. At the top-left of the centred column sits the wordmark TIKTOE in VT323 at clamp(40px, 12vw, 96px), with a pixel X in ink black and a pixel O in signal red sitting as a pair of icons to its right — the two marks introduced before a single square is played. Directly beneath, one rule of Space Grotesk body copy: "Two players. One device. Nine squares."
Then the status strip, then the board as the dominant element: a white sheet of nine chunky outlined tiles, each empty cell showing a faint 20%-opacity ghost of the mark that would go there on hover. The composition is vertical, centred, and reads as a single printed sheet — no nav bar, no gradient, no floating cards, no blue button.
The signature moves that carry the concept:
#1A1A1A), the O in Macintosh signal red (#E8542F), sized clamp(44px, 14vw, 88px) so the marks are the loudest thing on the page.NEW MATCH and RESET SCORE — built as the same tile shape with a 2px bottom edge that depresses 2px on :active, like a real key.This concept recomposes only accepted content, states, and controls. It introduces no new behavior, page, or destination.
Interaction Model: Static (direction) Motion Tempo: restrained Hero Dimensionality: flat
The direction specifies a restrained tempo with frame-by-frame, stepped motion and a flat hero dimensionality. The interaction model is therefore static in the sense that there is no scroll-linked depth, no parallax, and no dimensional scene; the motion that exists is small, stepped, and state-driven.
Landing Hero Motion Brief
TIKTOE wordmark and its pixel X/O pair above it.TIKTOE wordmark in VT323 with the ink X and signal-red O beside it; the body line "Two players. One device. Nine squares."; the status strip naming X's turn with the live pixel X icon and the score at zero; and the empty 3×3 board, dominant and square, with no mark placed and no ghost visible until hover.prefers-reduced-motion, every motion becomes an instant state change: marks appear immediately with no scale keyframe, the hover lift and ghost are replaced by an immediate outline change, the win line appears fully drawn with no 220ms draw, and the result line appears with no transition.NFR-1 — HTML delivery The game must be delivered as HTML code: a single HTML page the user can open and play, with no build step, no server, and no external service dependency. Provenance: explicit. Rationale: the authoritative request states "write code in html," and the planning constraint records "Implementation must be written in HTML."
NFR-2 — Client-side execution All game logic — turn alternation, win and draw detection, score tracking, and new-match and score-reset behavior — must run locally in the browser. Provenance: required_inference. Rationale: the accepted behavior is a single-device browser game with no server, account, or persistence requirement.
NFR-3 — Responsive legibility
Readable text and controls must stay whole at every viewport: the wordmark, labels, numbers, and both controls must 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, with no other element covering any part of them. Provenance: explicit (creative direction). Rationale: the direction's readable-text-and-controls rule is binding and takes precedence over any cropping gesture.
NFR-4 — Reduced motion
With prefers-reduced-motion, all motion must become an instant state change. Provenance: explicit (creative direction).
NFR-5 — No identity or persistence The game must not require an account, sign-in, or session continuity, and must not persist the running score beyond the current page session. Provenance: required_inference. Rationale: no accepted behavior creates a durable relationship, obligation, entitlement, or value transfer bound to a particular person.
NFR-6 — No external dependencies for play Playing the game must not depend on any network call, third-party service, or remote asset. Provenance: required_inference. Rationale: the delivery is a self-contained HTML page opened and played directly.
NEW MATCH, and RESET SCORE.No backend, database, container, or orchestration technology is required, because the accepted delivery is a single self-contained HTML page.
Constraints
Assumptions
NEW MATCH is pressed, so the result stays readable.Out of scope
#1A1A1A) or O (Macintosh signal red #E8542F).NEW MATCH control, which clears the board and begins a fresh match while preserving the running score.RESET SCORE control, which returns the X wins, draws, and O wins counters to zero without disturbing the board.
Two players. One device. Nine squares.

Two players. One device. Nine squares.
No comments yet. Be the first!