# 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`](frontend/CLAUDE.md) for the architecture and conventions, and [`frontend/design.md`](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:00` can 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 ```bash 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.