( 01 — The brief )
Prove the idea before the product.
Every project tool stores a due date; almost none will tell you what it costs. The client wanted a tool where cadence is the primary object: break the work into uniform tiles, divide the days you actually have by the tiles you actually have, and say the answer out loud — comfortable, steady, tight, or unrealistic. No story points, no velocity guessing — in the project’s own words, “estimation is the feature that makes Jira miserable.” The hero line wrote itself: “You set the deadline. We set the pace.”
The rarest part of the brief was restraint. This is a validation experiment, not the product — no accounts, no database, no billing. A real page, a clickable demo and a local-first app, put in front of ten real Monday and Asana users before anything bigger gets built. The rule is written into the repo: “Do not build this yet. Ask the ten.”
— The client, in every case on these pages, was us. This brief was mostly about what not to build.
( 02 — The craft )
The palette is the arithmetic.
PaceTile’s four pace states each own a colour — teal, blue, amber, red — and that spectrum is the entire brand palette, because it’s the product’s own logic. The meter under the number is drawn as four hard bands, never a gradient: a blend would drift through muddy in-between colours that signal no state at all. The band seams are derived from the thresholds themselves, so the state pill is always exactly the colour under the dot. Pace figures are set in a monospace face so the numbers read as computed, not claimed.
The deepest decision is about counting. Calendar days flattered the pace by roughly thirty per cent for anyone who takes weekends — eighteen tiles over three calendar weeks reads steady, when the honest answer over the working days is tight. So PaceTile counts working days by default and the readout carries the unit. For a tool whose whole personality is honest arithmetic, that was the one error it could not be allowed to make.
And when the pace goes red there’s no shame badge. The tool names the only three real options — cut the scope, move the line, or hit the date. The first two are buttons that genuinely resolve it. The third deliberately has no button, because it isn’t something a tool can do for you — it’s just the cost.
It’s a mirror, never a whip.
( 03 — The engine )
One number, computed once.
The pace is computed in exactly one place — a single derivation the demo and the app both import — and every screen is a view over it, so two surfaces can never disagree about the number. The lanes work the same way: Now, Next and Later are derived from list position, never stored, so clearing a tile surfaces the next one on its own. The mechanic is the data structure, not bookkeeping laid over it.
The app is local-first: no account, your data stays in your browser, in a versioned store whose reducer is proven pure by tests that deep-freeze the input on every action. A corrupt store degrades to an empty list rather than a blank screen, and a full one simply keeps working from memory — and because browser storage can be evicted, export-and-import backup is the trust story, not an afterthought. The mechanic’s tests assert against the written spec rather than the implementation — including the edge states, so the day the work hits zero it says nothing left instead of promising infinity tiles a day.
( 04 — Foundations )
Even the analytics tell the truth.
The early-access signup runs on a tiny dependency-free service with honest failure copy: if saving fails, the page says nothing was saved and invites a retry — it never fakes success. There’s a no-JavaScript fallback, and quiet spam defences that answer bots with a polite pretend-yes while keeping them off the list.
The conversion numbers come from the server’s own logs — no third-party analytics, no cookies, no client-side script, nothing extra for a visitor to load. Within minutes of going live, scanners were posing as visitors; so a visitor only counts after fetching the page and something the page references, and everything stripped is reported as ignored rather than silently dropped. Sign-ups are counted from the service’s own journal, never the web logs, because a spam catch answers exactly like the real thing. Uniques come from salted hashes that are never stored — and the one known bias runs toward under-counting.
Under-counting is the safe direction — for a number you intend to trust.
( In brief )
- Mechanic
- Days ÷ work
- Pace states
- Four, hard-edged
- Accounts & cookies
- None
- Story points
- None, on purpose