The live product, since v1.0
This repository was handed over on 2026-08-23 and frozen. The product built from it went live at tendd.co and kept changing by the founder's decisions. On 2026-09-30 every page here was brought level with it. This is the account of that sync.
How it was done
The running product was the reference, not its source code read in isolation. The
product's own development server was walked by a script as eleven people built for it in
its development database, one per shape of data the design draws: a list typed by hand,
the free bank scan held for seven days, the same scan after the hold ended, Tendd Pro with a
live bank, Pro cancelled but not ended, Pro with a failing renewal, a bank that needs a new
sign-in, an empty list, one subscription, a short list, and a cancellation reported. Every
route was captured as rendered markup and as screenshots at 390 and 1440, and every page in
design/ was compared with the capture of its state.
What travelled whole, copied rather than rewritten: design/system/
(byte for byte the product's system/), voice/docs/microcopy.md,
docs/decisions.md (with a mirror header), docs/gaps.md (new here),
docs/bank-connection.md, handoff/docs/behaviour.md and the fourteen
merchant marks in design/visuals/logos/. The landing's motion is the product's
own script, bundled into design/landing.js, with the command that rebuilds it in
its banner.
The one rule every page was brought level by. What the product DECIDED changes the page: a structure, a class, a string or a state that moved because of a decision with an id. What the product has simply not built yet stays as the design's intent, because a gap in a running product is not a verdict on the design. Every changed page says which it was in its own top comment, with the decision ids.
Was, became, and why
| Where | Was at v1.0 | Became | Why |
|---|---|---|---|
| Welcome | D-Hero: a round window of fourteen merchants gathering into the list | Light 2. The fourteen float beside the promise, a whirlpool eats them, the list forms and three are cancelled while the total steps 192.90 to 144.92. White in both themes; WebGL with a still fallback | P16, the founder's choice of six explorations |
| Sign in, Path Choice | Two screens of their own, wordy | Panels: Google first, email one step in, a sent step; Get started is two pictured doors. On the landing both open as a dialog over the page | P17, P11 |
| Home, and three branches | One Emma: on Free, with Chase read and every name visible, which D-Gate made the Pro shape | Home is Emma on Free after the free scan: three names across three categories, then one block, "You have 11 more subscriptions", Get Tendd Pro or Add them yourself. Beside it, as states of the same screens, Free typed by hand and Tendd Pro: Home, the reveal, Connections, Settings and the cancel guide | D-Gate, P31 to P34; the founder's decision of 2026-09-30 |
| Guided reveal | Step 2 named everything | Step 2 names three and says the rest in the same block, without the amount | D-Gate, D1, P31 |
| Connections (two new states) | A bank was connected or not | A free scan's connection is held seven days unread, then stops; a stopped bank still names what it found | P20, P32, G52 |
| Connect bank (new state) | - | After paying past the hold: one line of why, no step counter | P32 |
| Upgrade | $7.99 a month, one row of plans | $9.99 a month, $69 a year, each plan card with its own button, the year in the middle; a cancelled plan can be kept (new state) | D4 amended 2026-09-30, P24, P26, P27 |
| Trends, Pro view | A drawn view of what Pro would show | What moved lists only what moved, per range, and the category sentence agrees with its own rows | P25 |
| Subscription detail, Connections, Data and privacy | The way back in the bar at every width | Past 760 the way back is the first line of the page, so the rail never moves; the detail keeps the tab bar | P26 |
| Cancel guide, Alerts | Pro promised screenshots per step, a link that "skips the retention screens", unusual-charge alerts | Pro is a direct link to the service's own cancel page; the promises nothing could keep are gone | P30, G56 |
| Settings | Four notification switches | A fifth, "A charge is coming up", Pro and off by default, because Tendd now writes letters | P29 |
| Terms, Privacy, Help, About, Contact (new) | Links that pointed nowhere; "Careers" in the footer | Five public documents in the product's own lines; "Careers" became "Help" | P12, P35, P36 |
| The design system | 70 components | 75: six new (landing type, landing button, locked list, landing benefits, stats, and the auth panel), the orbit removed; pill and go buttons, a drawn checkbox, two new roles | P16, P17, P26, P34 |
| Microcopy | 1318 lines | 2064 lines: every string the product added, with its rewrite log | The product owns the file now |
Kept on purpose, although the product does not show it
Each of these is a gap in the running product and not a decision against the design, so each stays on the pages as intent. The product's own list of them is docs/gaps.md, 28 rows open of 55.
| What | Why the product lacks it |
|---|---|
| "Hi, Emma" and the plan chip in the app bar | The product stores no names yet |
| The "not opened in a while" nudge on Home | No usage data exists to drive it |
| "Last checked today, 9:14 AM" on the trust line | No published form for a time that is not today (G4) |
| Loading and error screens | The product renders each view whole on the server and draws none |
| Share snapshot | Not built |
| The failed renewal as its own dated screen | Being built in the product as this sync ran (its next decision), so it is not in this sync |
For the founder to decide
| Question | Why it is open |
|---|---|
| Answered 2026-09-30: which Emma is canonical | The founder: three states, "полностью фри без подключения банка, фри с подключенным банком и платный про". The etalon is Free after the scan, as the site draws it. D3 in CLAUDE.md says it: one product, a plan is a state of a screen, and where plan and source change a screen it has three |
| Answered with it: the Pro edition of the cancel guide | Drawn, cancel-guide-pro, as one of the three branches |
| The shared screens and their source lines | Subscription detail and Alerts are drawn once, with the v1.0 data: every name, from Chase, and a Free offer of Pro. Under the three branches that is exactly true on no branch. Aligning them (one source line per branch, or three states of each) is the next pass if you want it |
| Petrol on the locked block | The block spends petrol on its count and its front tile beside its primary button, which the One Voice Rule of D-Concept forbids and which P26 refused for a price. It is the product's choice (P34), mirrored as it is |
| Settings still says "unlimited bank connections" | D-Gate made it false; the product prints it too, so the mirror does |
| The wireframes | The grey was not redrawn. It is the structure contract as handed over, and a page the product changed or added has no grey twin |
What was checked, and with what
Every changed page was swept at seven widths (360, 390, 760, 780, 900, 1000, 1440) in both themes by the agent that changed it: no sideways scroll, no failed request, no console error, and screenshots compared with the product's. Then the repository's own instruments ran over the whole tree; their results are in the section below.
| Instrument | What it asked | Result, 2026-09-30 |
|---|---|---|
rollout12.cjs | No style of its own on 73 screens; every link resolves | 0 violations, 0 classes the system does not define, 0 dead links. 15 pages have no grey original, which the mirror expects |
quality13.cjs | Six questions of every screen at two widths and two themes | The two flush-text pairs it has always accepted, and three small targets on the public pages, filed for the product |
route13.cjs | Every link in every page and document, and the click depth | 3754 links in html and 57 in markdown, 0 dead; the route holds |
width12.cjs, edges13.cjs, pages13.cjs | Reading measures, right edges at 1920, and 135 non-screen pages at 320 to 390 | All ok; 0 split families; 0 pages scrolling sideways |
a11y13.cjs, aria13.cjs | Landmarks, headings, 200% zoom; names and busy states | 0 pages without a single main, 0 sideways at 200%; 0 ARIA findings on 126 pages |
plans13.cjs | One product, not two | 0 findings. Free on 16 pages, Pro on 10, the plan named in the screen on 25 pages |
design13.cjs | DESIGN.md against tokens.css | 0 disagreements |
Three instruments were taught, not silenced. The old landing had no
main and was never swept; the new public pages have one, and 265 findings arrived,
none of them a line of text crossing its frame. quality13.cjs now skips pictures
marked aria-hidden, boxes with a deliberate negative margin, and boxes the public page places
by transform, and counts a wrap by lines rather than by rects. rollout12.cjs reads
every head of a nested rule and treats a query as a query. plans13.cjs compares
the two corpora only where both have the page and the three branches did not move its plan. Each change is dated at its line.