copper-todo is a simple todo application delivered as a single page design. The product intent is narrow and deliberate: one page where a single everyday user captures tasks, sees them all in one place, and ticks them off. There is no navigation, no multi-screen flow, and no account ceremony — the page is the product.
The audience is one person using the app for themselves: someone who opens a lightweight utility many times a day to jot a task down and clear it. The experience should feel like a piece of gear — labelled, tagged, honestly utilitarian — rather than a soft productivity poster. The visual direction (Section 6–8) carries that attitude through industrial labels, quotation marks and construction-tape accents while keeping the checklist itself completely legible.
This document is the System Requirements Document for copper-todo, prepared for Diya Trivedi.
copper-todo is a single-page web application. The page is anonymously reachable and requires no identity, sign-in, or account of any kind. It owns the complete todo lifecycle for the user: adding a task, viewing the list, and marking a task complete.
Actors
Current delivery
Ownership
Narrow exclusions
Removed from scope
The user asked for a simple single page design of a todo application. That is read literally: exactly one page, and that page is the whole product. Everything the user does — typing a task, reading the list, ticking a box — happens on that one page with no navigation away from it.
Access ownership. The page is public and anonymous. The source establishes no identity requirement, and the accepted lifecycle (capture a task, see it, complete it) does not create a durable relationship, obligation, entitlement, or value transfer that must be bound to a named participant. Application-owned identity is therefore not introduced. The todo list is application-owned state persisted by the backend so the user's list is still there when they return to the page; this is state continuity for the page, not an account.
Current vs. future. Current scope is exactly the single Todo page and its add / view / complete lifecycle. Anything beyond that — accounts, sharing, scheduling, multiple lists — is out of scope and is not represented in the page, the requirements, or the flows.
Delivery shape. Custom first-party UI (React) over a shared FastAPI backend with MariaDB storage, run as the provisioned frontend, backend, and database services.
The single page of the application. Anonymous, publicly reachable, and the sole owner of adding, viewing, and completing todo items.
Information and state
Primary actions
Supporting actions
Domain entities
Component responsibilities
prefers-reduced-motion.States
FR-1 — Add a todo item (explicit) As a Todo user I should type a task into the add-task input and submit it, so that the task appears in my list.
FR-2 — View the todo list (explicit) As a Todo user I should see all my tasks in one place on the page, so that I know what remains to be done.
FR-3 — Mark a todo item complete (explicit) As a Todo user I should tick a task's checkbox, so that it is recorded as done and the list reflects what remains.
FR-4 — Reopen a completed todo item (required_inference) As a Todo user I should untick a completed task's checkbox, so that a task marked done by mistake returns to the open list.
FR-5 — Filter the list by status (required_inference) As a Todo user I should switch the filter between "ALL", "OPEN", and "DONE", so that I can focus on what is left or review what I finished.
FR-6 — Persist todo items across reloads (required_inference) As a Todo user I should find my tasks still present when I return to the page, so that the list is a reliable record rather than a scratchpad.
Product context. One person using copper-todo for themselves, many times a day, on a single page. They are not managing a team, a project, or a schedule — they are capturing small things and clearing them. They like their utilities with attitude: labelled, tagged, a little streetwise, but never at the cost of legibility.
Primary goal. Get a task out of their head and onto the page in seconds, then see at a glance what is still open and tick things off as they finish.
Distinct responsibilities.
Inputs and decisions. The task text they type; whether a task is done or open; which filter they want. They decide when a task is finished and when a mis-tick should be reversed.
Interactions with other participants. None — the Todo user is the only human actor. The backend and database serve them silently.
Observable success. The new task appears immediately, the remaining-count matches the open tasks, completed rows read "DONE" with a struck-through text, and the list is still there on the next visit.
What makes this role different. There is exactly one human role, and its work is defined by speed and honesty of state: every action must produce an immediate, visible change on the same page, with no navigation and no confirmation dialogs.
Muse and headline. Virgil Abloh — the 3% approach applied to the most familiar object in software. Headline: Remixed familiarity: a todo list with quotation marks around it.
Mode. Light mode only.
Colour tokens (exact hex, by role)
| Role | Hex | Use |
|---|---|---|
| Background (concrete ground) | #F2F0EB | Page ground, with 4% concrete-noise texture |
| Surface | #FFFFFF | Task panels, input slab, task rows |
| Text / primary | #111111 | Type, 1px rules, 2px outlines, primary button |
| Accent | #FF4D00 | Exactly three uses: active filter underline, checkbox fill on completion, hazard-stripe band |
| Muted | #8A8781 | Metadata, counters, completed-task strikethrough |
No blue, indigo, or violet anywhere, including links and focus rings. No gradients.
Typography
clamp(56px, 11vw, 148px) / 40 / 28 / 20 / 17 / 14 / 11.Shape language. Hard 0px corners on every panel, input, and button. 1px black rules divide rows; 2px black outlines on the input and the ADD button. Checkboxes are 22px squares with a 1.5px black border, filled solid #FF4D00 with a black check when done. Construction-tape hazard stripes (repeating 45° black/orange) appear as a 10px band under the header and as the left edge marker on the focused row. Labels sit in small black outlined boxes, like garment tags.
Layout. Single page, three stacked zones on a 12-column grid with 24px gutters and a max width of 1200px.
At 375px the headline stacks to two lines, the count numeral moves under it at 40px, the row collapses to [checkbox | text] with the tag and time wrapping beneath the text, and every element stays inside the viewport.
Imagery. No photography and no illustration. The imagery is the interface itself: hazard-stripe tape, outlined labels, a concrete-noise texture at 4% opacity on the ground, and a single halftone-dotted black arrow pointing from the headline to the input. Iconography is thick-line, 2px, black — plus, check, trash — drawn on a 24px grid.
Readability rule. Headlines, labels, numbers, task text, and controls stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling to fit. Decoration (the cropped quotation mark, the ticker, the halftone arrow) may bleed off edges; readable text and controls never do.
The poster that is the app. The first screen is not a SaaS hero — it is a printed poster that happens to be interactive. The words "THINGS TO DO" are set in Archivo Black caps at clamp(56px, 11vw, 148px), flush-left, stacked on two lines spanning columns 1–8 and bleeding to the left edge of the grid. A black quotation-mark glyph at 1.4× the headline size sits half-cropped off the top-left corner as pure decoration — the "quotation marks around it" made literal.
To its right, columns 9–12 hold the remaining-count as a 148px tabular numeral in safety orange over a small black-outlined quoted label "REMAINING". Beneath, a full-bleed 10px hazard-stripe ticker separates the headline from the white input slab. Ground is concrete #F2F0EB; no gradient, no centred stack, no blue button.
The signature move repeats down the page: every task row is a tagged garment — a black 1px boxed label in wide-tracked caps ("OPEN" / "DONE") at the row's right, task text in 17px sentence case, a tabular timestamp. Completion fills the hard 22px square with #FF4D00 and wipes a black strikethrough across the text in 180ms — the only animation in the list.
This concept only recomposes accepted content and controls: the headline, the count, the input, the ADD button, the filter strip, and the task rows. It adds no behavior and no destination.
Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: flat
Landing Hero Motion Brief
prefers-reduced-motion, the ticker freezes to a static stripe, the slide-in and strikethrough wipe resolve instantly, and the checkbox fill applies without transition. The layout remains fully usable and every item stays readable.prefers-reduced-motion is honoured as described in Section 8.frontend, backend, and database. No additional services are required for the current scope.required_inference.
"WRITE IT DOWN. TICK IT OFF."
Press ADD or Enter to file the task
Send the invoice for March
OPENReply to Diya about the label spec
OPENPick up the risograph proofs
OPENOrder more black gaffer tape
DONE
"WRITE IT DOWN. TICK IT OFF."
Press ADD or Enter to file the task
Send the invoice for March
OPENReply to Diya about the label spec
OPENPick up the risograph proofs
OPENOrder more black gaffer tape
DONE
No comments yet. Be the first!