Tasks now carry a tick box rather than being read-only rows. Ticking strikes the title through and leaves the item in place, so a day still reads as a record of what was asked rather than only what is left. New in designs/Checkbox.dart: - TickBox the square box itself, animating between empty and filled - TickRow box + struck-through title + caller-supplied detail and trailing - addTaskAffordance the centred "Add new task" control beneath a day's list Applied to the home plan, the overdue queue and the goal task list. Each screen holds a set of optimistically ticked ids so the tick lands immediately and rolls back if the call fails; the set is reconciled whenever fresh data arrives. A tick completes the item outright, whatever its proof requirement. The proof flow is still reachable from the Complete button in the overdue queue, so tasks that need an artefact have a route that asks for one — but the tick itself no longer enforces it. Late completes stay visually distinct: the row keeps a Late pill and the warning accent, and the user is told the window had already closed. flutter analyze lib/ reports no errors. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mfu2gQLSFN21YRBcU2NrTt
Grounded
A to-do app that doesn't believe you.
Most to-do apps are neutral ledgers — they record intent and never object when you ignore it. Grounded is an enforcement layer: it holds a model of what you committed to, notices when reality diverges, and imposes escalating consequences you agreed to in advance.
Design axiom: the checkbox is the enemy. Every feature exists because self-reported completion is worthless to someone trying to stop lying to themselves.
Repository
frontend/ Flutter app (Android · iOS · Web · Windows)
See frontend/CLAUDE.md for the architecture and
conventions, and frontend/design.md for the design
language.
The model
Three primitives; everything else is derived.
| Primitive | Meaning |
|---|---|
| Commitment | Something you said you'd do. Has a due window, a class, and a proof requirement. |
| Debt | The weight of what you've missed — a decaying, weighted score rather than a count. |
| Standing | Good → Warned → Grounded → Lockdown. Derived from debt; decides what the app lets you do. |
Streaks reward perfection and collapse permanently on one miss. Debt is continuous, forgiving in shape, hard to ignore, and gives you a way back.
Goals contain commitments — "Workout" holds "Monday shoulders". A goal never carries debt; the tasks inside it do.
What makes it different
- Due windows, not due dates.
Mon 06:00–08:00can actually close. A miss is a permanent event, never a silent rollover to today. - Capacity blocking. Chronic overdue is usually overcommitment misdiagnosed as laziness. The app plans against what you historically complete, learns your per-category estimation multiplier, and refuses plans that don't fit.
- Excuses get clustered. "'Too tired' has appeared 14 times this month, 11 of them on gym days, 9 of them after 7pm. Consider moving gym to morning."
- Proof of completion. Honour · Photo · Timer · Location · Health · Witness. Completing outside the window records as late complete — distinct in history, and it never reduces debt to zero.
- A live runner. Starting a task takes over the screen, keeps time from wall-clock so screen-off can't cheat it, and pauses when you leave the app.
- Plyometrics is where it stops you. Weekly ground-contact ceilings and enforced recovery gaps — connective tissue doesn't recover on a motivation schedule.
And what keeps it usable
An app built on guilt has an obvious failure mode: the people who need it most delete it during their worst week. So — rationed amnesty tokens, sick and travel mode that pauses debt entirely, a tone slider hard-capped so no copy ever attacks the person rather than the behaviour, and distress detection that drops the strict persona completely when debt spikes while engagement and readiness fall. Strictness is never the response to someone who is actually struggling.
Running it
cd frontend
cp .env.example .env # then point it at your backend
flutter pub get
flutter run
Requires Flutter with Dart ^3.6.2.
Status
Frontend scaffold complete: the full architecture, the debt/standing/capacity/
integrity engines, and every screen in the MVP cut. The backend is not in this
repository yet — CommsDirections.dart defines the contract it needs to
satisfy.