## Inspiration
I know what I should do. I just can't start — and when I finally do, my phone pulls me somewhere else and half an hour is gone. Those are three ADHD traits with names: procrastination, distraction, and time blindness. Every task app I tried made all three worse: a long list to choose from, due dates to feel bad about, and the task itself hidden behind an app icon the moment I switched away.
The one place on an iPhone that stays in sight no matter which app you're in is the Dynamic Island. So the question became: what is the smallest task manager that fits in there? One task. Started now. That's the name — **D**o **I**t **N**ow + **O**ne task.
## What it does
- **Exactly one active task.** No list to rank, no due dates, no priorities. Type a task, press Start.
- **It stays until you're done.** The running task and its elapsed time live in the Dynamic Island, as a Live Activity on the Lock Screen, and in the Apple Watch Smart Stack. Pause, complete, or skip a break from there without opening the app.
- **Three timer modes:** stopwatch, countdown timer, and Pomodoro with automatic work/break cycles.
- **Focus Guard (Dino Pro):** while a task is running, the apps you picked are shielded by Screen Time. The shield drops automatically on pause, break, or completion.
- **No guilt on off days.** Only finished tasks are recorded. A broken streak costs nothing. Daily wins and a weekly contribution graph quietly stack up the proof.
- Repeat-task templates, iCloud sync across devices, Japanese and English.
- Version 1.1 (shipped September 6): a 3-screen welcome tour, notification permission asked only when your first task starts, a gentle next-morning nudge, and a Focus Guard offer right after your first completion.
## How we built it
- **SwiftUI + SwiftData**, with CloudKit sync switched on at the container level so devices share tasks and history without a server of ours.
- **ActivityKit** drives the Dynamic Island and Lock Screen. The controls are `LiveActivityIntent`s (pause, complete, skip break) that ship in a `Shared/` module compiled into both the app and the widget extension, because those intents execute in the *app* process, not the extension.
- **Focus Guard** is FamilyControls + ManagedSettings. The shield is applied by the app process on start/resume/next-cycle and cleared on pause/break/complete/switch; the settings that the Live Activity intents need are shared through an App Group. On every return to the foreground the app re-derives the shield from the real task state, as insurance.
- **Apple Watch** without a separate watch app: the Live Activity declares `supplementalActivityFamilies([.small])`, so the same card is mirrored into the Smart Stack — and it had to be squeezed into a ~72pt height budget.
- **Monetization with RevenueCat:** a single `pro` entitlement gates Focus Guard, RevenueCat's paywall UI is remote-configured, and Debug builds use the Test Store key while Release builds refuse any `test_` key. The upsell banner only exists when a paywall can actually be reached, so a free user never hits a dead end.
- **TelemetryDeck** with five standard events (1.1), String Catalogs for ja/en, iOS 26 only.
## Challenges we ran into
- **Four App Review rounds.** "Purchase succeeded but Pro didn't unlock" turned out to be a RevenueCat entitlement with no products attached — diagnosed from the public SDK key via the `product_entitlement_mapping` endpoint and fixed in the dashboard without a new binary. Then a Test Store key that had leaked into a review build, then a missing EULA link next to the subscription, and finally a build number lower than the approved one, which flips a fresh submission to `INVALID_BINARY` minutes after upload. The app code was fine every time; the plumbing wasn't.
- **The intent ran in the wrong place.** A stale duplicate of `CompleteTaskIntent` left in the app target silently took precedence over the shared one, so finishing a task from the Live Activity never cleared the shield or recorded elapsed time. It only surfaced as a "multiple commands produce" build error once the shared copy moved.
- **`ManagedSettingsStore` is per process.** Clearing settings from the extension does nothing to a shield the app applied. Everything shield-related now happens in the app process.
- **Live Activity layout crashes.** In intermediate layouts the system can propose a non-finite width; a `GeometryReader` passed `NaN` into `.position()` and the widget extension died with `EXC_BREAKPOINT` in `LayoutSubview.place`. Guarding `isFinite`, replacing `.fixedSize()` with `minimumScaleFactor`, and fitting the expanded island into its ~160pt cap fixed it.
- **Family Controls needs Apple's distribution approval** before an App Store build can even be signed, and archiving on a macOS 27 beta host meant building with Xcode 26.6 and patching `BuildMachineOSBuild` before export.
## What we learned
- Put the task where the eyes already are. Once it lived in the Dynamic Island, the app itself became almost optional — which is the point.
- The feature is 20% of shipping. Entitlements, EULA links, build numbers, and intent process boundaries took longer than the Live Activity did.
- Design for the failure case first. "Nothing happens when you miss a day" is the feature ADHD users thank us for.
## What's next
- Switch the shield during background Pomodoro transitions with DeviceActivity, not just on foreground events.
- Use the 1.1 telemetry to tune the first 30 seconds and the Focus Guard offer.
- A real watchOS app for starting tasks from the wrist.
Log in or sign up for Devpost to join the conversation.