gentle-simple is a single-page todo application. One person opens one page, writes down what needs doing, sees the list of what remains, marks items complete, and removes items they no longer want. The product intent is deliberately narrow: a calm, unhurried, low-stakes working sheet rather than a productivity cockpit. There is no collaboration, no dashboard, no prioritisation scheme, and no second surface — the page itself is the product.
The audience is a single anonymous user managing their own tasks. The design register the project name asks for — gentle, simple — is treated as a functional requirement of the interface: the empty list is a designed state, each added task is the one calm object on the page, and the interface stays quiet at every viewport.
gentle-simple is delivered as a React frontend, a shared FastAPI backend process, and a MariaDB database for application-owned persistent data. The frontend renders the single Todo page; the backend exposes the todo item APIs and persists items in MariaDB so the list survives reloads and return visits.
Actors:
Accepted behavior in scope: adding a todo item, viewing the list of todo items, marking a todo item complete, and deleting a todo item, all on one page.
Narrow exclusions: no accounts, no multi-user sharing, no categories, priorities, due dates, reminders, or notifications, no additional pages or routes, no reporting or analytics surface.
Removed from scope
The whole product is one page. Access is anonymous and public: the Todo page is the entry point and the complete working surface, and no identity, account, or session is required to use it. Because the product is single-user and anonymous, there is no per-user private state to protect and no differentiated permissions or role-based visibility anywhere in the product.
Durability is application-owned: todo items are stored by the backend in MariaDB so that the list a user sees reflects what they previously added, completed, or deleted, including after a page reload. This is the only state continuity the product provides; it is not an account, and it does not identify the user.
Everything described in this document is current. No future-horizon capabilities are accepted.
The single page of the product, and the complete working surface. Anonymous public entry; no sign-in gate.
Information and state
gentle-simple (32px desktop / 24px mobile, light weight, wide tracking), flush-left in the column.#FBF8F2 rectangle with a 1px #DAD3C6 hairline border, 2px maximum radius, no shadow.3 remaining), with the numeral in the light wordmark weight.Primary actions
+ at left, a 1px underline that grows left-to-right in #B4703C on focus, and a muted uppercase add label at right that turns ink when the field has text. Submitting adds the item to the list; no modal, no second surface.#B4703C and receives a thin ink check in 200ms; the task text fades to #8C867A and gains a 1px strike that stops short of the last word.Supporting actions and controls
Domain entities
Component responsibilities
#F4F0E8, centered single column max-width 560px, minimum 96px above the wordmark at desktop and 40px at mobile, flush-left composition inside the centered measure.+ glyph, add label, focus underline animation.States
FR-1 — Add a todo item (explicit) As a Todo user I should be able to add a new todo item from the input row on the Todo page so that it appears in my list.
add label).FR-2 — View the list of todo items (explicit) As a Todo user I should be able to see my list of todo items on the Todo page so that I know what still needs doing.
FR-3 — Mark a todo item complete (explicit) As a Todo user I should be able to mark a todo item complete so that I can see it is done.
#B4703C and receives a thin ink check over 200ms; the task text fades to #8C867A and gains a 1px strike stopping short of the last word; the remaining count decreases.FR-4 — Delete a todo item (explicit) As a Todo user I should be able to delete a todo item so that it no longer appears in my list.
FR-5 — Single-page delivery (explicit) As a Todo user I should experience the entire product on one page so that adding, viewing, completing, and deleting never requires navigating away.
FR-6 — Durable todo state (required_inference) As a Todo user I should find my todo items still present when I return to the page so that the list reflects what I previously added, completed, or deleted.
Product context. One person, working alone, on one page. They arrive with a small set of things on their mind and want to put them down somewhere quiet and see them clearly. There is no team, no manager, no shared board, and no account — the page is theirs by virtue of being the only page.
Primary goal. A clear, up-to-date view of what still needs doing, reached with as little ceremony as possible.
Distinct accepted responsibilities.
Relevant inputs and decisions. The text of each task; whether a task is done; whether a task should be removed. The user makes every decision on this page — nothing is decided for them and nothing is scheduled, categorised, or prioritised by the product.
Interactions with other participants. None. The Todo user is the only human actor; the backend and database act only in service of the user's own actions.
Observable success. The list on screen matches what the user intends: new items appear immediately, completed items read as done at a glance, deleted items are gone, and the remaining count is correct. On return, the list is as they left it.
What makes this role distinct. The work is entirely self-directed and stateless with respect to identity: there is no handoff, no approval, no counterparty, and no permission boundary. The only thing that must persist is the list itself.
#B4703C over 160ms.add label at the right turns ink.add. The frontend sends the new item to the shared backend, which stores it in MariaDB.#B4703C and receives a thin ink check over 200ms; the task text fades to #8C867A and gains a 1px strike stopping short of the last word; the remaining count decreases.The muse is Kenya Hara, and the headline is "Emptiness as content — a todo list that breathes." The register is paper and morning light, not software.
Colour tokens (light mode)
| Role | Hex | Use |
|---|---|---|
| Background | #F4F0E8 | Unbleached paper ground for the whole page |
| Surface | #FBF8F2 | The task sheet, barely lifted |
| Border | #DAD3C6 | 1px hairline on the sheet and row rules |
| Text / Primary | #2B2A26 | All type and the single primary action |
| Accent | #B4703C | Warm wood/clay, 2–3% of the screen: completion tick, focused input underline, count numeral |
| Muted | #8C867A | Metadata, micro-labels, completed-task text |
No second accent, no colour-coded categories, no gradients, no blue or indigo anywhere including focus rings. Focus is clay with a 1px offset outline in ink.
Typography
add, done): 11px uppercase, 0.16em tracking, muted.Shape language. Square proportions and thin rules. The sheet is a flat rectangle with at most 2px radius and a 1px #DAD3C6 hairline border — no soft cards, no pills, no blobs, no drop shadows. Completion is a hand-drawn-feeling 18px circle outline that fills with #B4703C and a thin ink check. Delete is a whisper-thin × at 1px, 40% opacity, reaching full ink only on hover or keyboard focus. Section rules stop 24px short of the sheet's right edge, like a margin line on washi paper.
Spacing rhythm. Centered single column, max-width 560px, flush-left composition inside the measure. Minimum 96px above the wordmark at desktop and 40px at mobile. Everything is one column at 375, 768, and 1280; the sheet simply gains margin as the viewport widens. Readable text and controls stay whole inside the viewport and their container at all three widths, wrapping or scaling (for example clamp() with its mobile size) to fit, and nothing covers them.
Imagery. No photography, no illustration, no icons beyond the thin circle, plus, and × glyphs. The only "image" is the paper texture implied by the ground colour and the hairline rules; the interface itself is the still life.
The first screen is the working sheet, treated as a still life in emptiness. The top of the viewport is dominated by empty paper #F4F0E8, with a tiny uppercase date label at the top-left margin. Ninety-six pixels below it, flush-left in the 560px column, sits the 32px light wordmark gentle-simple with wide tracking, then a 24px greeting line in ink. Immediately beneath, the task sheet begins with its underline-only input as the first ruled row — a thin + at left, a 1px underline, and a muted uppercase add at right.
The dominant element is the negative space itself. The single clay accent appears only as the focused input underline and the count numeral. Nothing is centered except the empty-state line: a centered 14px muted line with 0.16em tracking floating in the middle of the sheet while the input row stays active above it — no illustration, no "get started" card. The composition is flush-left, quiet, and unmistakably not a SaaS hero.
Interaction Model: Static (direction) Motion Tempo: still Hero Dimensionality: flat
Landing Hero Motion Brief
#B4703C over 160ms and the add label turns ink → on commit the new row fades in over 240ms as one calm object on the page, and the remaining count updates.prefers-reduced-motion, all transitions drop to instant state changes; the composition is unchanged and every control remains fully usable.prefers-reduced-motion collapses all transitions to instant state changes without altering the composition.frontend, backend, and database services; the backend is extended with todo routes rather than adding a new service.#FBF8F2 rectangle with a hairline border that holds the input row and the task rows.
Good morning. A quiet page, and one thing at a time.
3remaining

Good morning. A quiet page, and one thing at a time.
3remaining
No comments yet. Be the first!