← All updates

Tonight: one day, one list, auto-reset at midnight

A daily task app that ends every night. PRD locked, premium UI refresh, fastlane upload and marketing site all shipped the same evening. Tonight 1.0.0 went to App Review by midnight.

Most productivity apps fight you with projects, tags, nested lists, contexts, priorities, smart filters. Tonight does none of that. There is one list. It belongs to today. At midnight it resets. That's the entire product.

The premise is for people who already tried Things, Todoist, TickTick and bounced — not because those apps are bad but because they're too much app for "what am I doing today." Tonight ships in iOS-only, en-US-only, free configuration on day one. The narrower the launch the louder the signal.

The mechanic worth talking about

The interesting design problem in a daily-reset app is what happens when you miss a day. A pure-reset app punishes you and you uninstall it inside a week. A "carry forward unfinished" app turns into Todoist again. Tonight uses two ideas instead:

  • Grace. If you open the app between midnight and 10am and yesterday has exactly one unfinished task, that task carries to today as a "grace carry" and the streak survives. Real life is messy, you forgot to tick the gym off, the streak doesn't deserve to die over it.
  • Skip tokens. One per week (two on Pro, when Pro lands). Burned automatically on a missed day. You don't decide to use one — the system applies it for you. The point is the streak stays meaningful but a sick day or a flight day doesn't reset months of work.

The two together let the streak mean something without making the user feel watched. Most habit apps lose this — they either gate the streak so hard nobody keeps one, or hand them out so freely the number is meaningless.

What it ships with

  • One Today list. Three tasks free, unlimited later when Pro arrives.
  • Streak with grace + skip-token preservation, anchored to local midnight.
  • History calendar — closed / grace-carried / skip-protected / missed, color-coded.
  • Reminders, with sensible defaults and a single helper string per row.
  • PDF export of history. The app is yours, the data is yours, you can leave.
  • Encrypted Hive storage (AES + Keychain-held key). No login, no cloud, no account.
  • English at launch. Russian and Spanish are written, just not in the store listing yet.

The same-day shipping pipeline

Tonight 1.0.0 went from "PRD locked" to "uploaded to App Review" in one evening. That only worked because every load-bearing piece of infrastructure came from previous apps:

  • Fastlane. fastlane ios release_binary built and uploaded the IPA to TestFlight in 93 seconds. fastlane ios metadata uploaded name, subtitle, description, keywords, promo text, privacy/support/marketing URLs and five framed screenshots in 32. Both lanes were one-line edits of QRSnap's Fastfile.
  • Screenshot capture pipeline. A simctl + dart-define seed harness that boots the iPhone 16 Pro Max simulator, drops a deterministic Hive dataset for each frame, and writes 1320×2868 PNGs into screenshots/v2/. Then a Python framing script lays each one on a peach atelier background with a soft-shadow titanium bezel and a two-line caption. The five framed screenshots form a single continuous panorama when laid out left-to-right in the store grid.
  • App Store Preview screencast. An in-app demo mode driven from initState — focuses the input, types the three canonical tasks at a fast-typist cadence, holds with the populated list, taps each row closed, rides the third toggle into the celebration overlay. simctl io recordVideo captures, ffmpeg trims to exactly 10.0 seconds at 30 fps CFR. We tried integration_test first — it works, but LiveTestWidgetsFlutterBinding renders a synthetic pointer crosshair on every tap that there's no public API to disable. Moving the automation inside the app removed that.
  • Marketing landing. codeensis.com/tonight built from the Pawpress template — hero, promise band, six feature cards, three-step "how it works", framed screenshots, FAQ, final CTA. The "Coming soon" store buttons stay until App Review approves the listing.

Reusing the QRSnap pipeline cut Tonight's launch overhead by about an order of magnitude. The actual app code is small; everything around it is what eats time, and now it doesn't.

What we deliberately deferred

  • Android. The audience for "daily-reset task app" skews iPhone — habit-builders, minimalists, Todoist refugees. The Android port can follow once iOS funnel data exists.
  • Russian and Spanish store listings. The app already runs in those languages. Multi-locale ASO is its own craft, adds review risk, and doesn't help day-one install velocity in the markets we're optimizing for.
  • Pro tier. isProProvider is hardcoded to true for v1.0.0. The paywall surfaces exist but are stubbed. Launching free maximizes activation. Monetization comes after we see what retains, not before.

What I'm watching

The metric that matters in week one is whether anyone opens Tonight on a second consecutive day. Everything else — install velocity, screenshot CTR, store rank — is downstream of that single question. For a daily-reset app you either come back tomorrow or you don't, and the product has nothing else to lean on.

Available soon

Tonight 1.0.0 is in App Review. The store listing will go live once Apple approves the build.