-
-
The Summit map on Day 12. Each lamp is a day walked. The painting is one of 72, animated in SpriteKit from layered depth plates.
-
Why it exists: my wife lost her streak for resting after a night up with our sick kids. The painting is the app's Summit scene.
-
Chosen before Day 1, offered on the bad day. The sheet leads with the policy you picked, and a missed day is never shown in red.
-
Summit at night, New York in the rain. The sun and moon follow your real clock and location, and the weather comes from WeatherKit.
-
Today and the widget read the same on-device store. A run Apple Health saw is offered as a check-in, never ticked for you.
-
Melonie listens on device with Apple's speech transcriber, and Apple's on-device Foundation Models turn your words into missions.
-
After the free week with no plan, the trail pauses. No card was asked for, nothing converts to a charge, no day counts against you.
-
One paywall, two stages. RevenueCat Targeting on a stage attribute serves 3 months on Day 12 and a one-time $9.99 pass on Day 62.
-
Share a postcard of your own trail, rendered on your phone. On Day 75 every lamp is lit and the fireworks go up over Antigua.
-
The app icon: the trail, the moon, and one amber day that didn't happen.
-
Unframed: the missed day's sheet, leading with the policy chosen before Day 1.
-
Unframed: the Summit map on Day 12.
Inspiration
My wife was doing a seventy-five-day challenge. Then our kids got sick, and we were both up with them all night.
By morning it didn't make sense for her to work out on no sleep, so she didn't. She rested, which was the right thing to do, and the challenge said she had failed. It had one solution for a missed day, and it didn't care why the day was missed. She lost her streak for taking care of her family and herself.
A challenge teaches you something on a night like that, and it teaches the wrong thing. Most people who hear it don't become more disciplined. They stop. I didn't want her to stop. I wanted her to be kind to herself, so I built her a challenge with empathy built in. I wrote the whole story on the blog: The night the kids were sick.
What it does
75 Kind is a seventy-five-day challenge for iPhone that assumes you will miss a day. Before Day 1 it asks what a missed day should cost, and you pick one:
- Grace day. Skip it and keep going. Three across the whole challenge.
- Streak freeze. Pause the count for a day. One a week.
- Reset to Monday. Start this week over. Your first ten days stay.
The next time the kids get sick, there's nothing to decide. You already answered, so you can go to the people who need you, and in the morning you're still on your way.
You decide the missions: workouts, water, reading, whatever you choose. They're as hard as you make them. The app is kind about one thing only, the day that goes wrong.
Your progress is a trail through an interactive canvas: a summit, New York or Antigua. The sky over the painting matches your real sky, with the sun and moon where they actually are and your local weather. Each day you finish lights a lamp on the trail. There are home-screen widgets, workouts from Apple Health are offered as check-ins (never ticked for you), and milestones become postcards you can share.
How I built it
I built it in about three weeks: the first commit was on 7 September, and it first went to App Review on 20 September. It went live on the App Store on 1 October.
- SwiftUI, Swift 6 with strict concurrency, and SwiftData, targeting iOS 26. It's local-first: no account, no server, and no tracking. The app's privacy manifest declares no tracking, and the only analytics are on the website.
- An onboarding guide, Melonie, talks you through setup. She speaks, listens on device with Apple's speech transcriber, and uses Apple's on-device Foundation Models to turn what you say ("I want to walk every morning and stop drinking soda") into structured missions.
- The painted map is a SpriteKit scene built from layered depth plates, with parallax, glows, water and weather. There are seventy-two paintings in all, covering each scene, theme, light or dark appearance and time of day. They're delivered as Apple-hosted asset packs, so the install stays small.
- WeatherKit and HealthKit feed the sky and the workout check-ins.
- RevenueCat is the app's only third-party dependency, and it powers every purchase. I kept my own native paywall and let RevenueCat decide what goes on it:
- Placements for each surface that can show a plan: the day-7 moment, the Me tab and the scene picker.
- Coarse, non-identifying attributes, so Targeting can serve an offering that fits the moment: the stage of the challenge (first week, middle or last twenty days), whether the free week has been spent, and the chosen scene.
- Three offerings: three months for $24.99 by default, since that fits a seventy-five-day challenge; a one-time See it through pass in the last twenty days; and a lower second-go price for someone starting a new challenge.
- Experiments can test price and copy for each stage without a release, and the app falls back to the design's prices when it's offline.
I wrote a spec for each feature before building it (thirty-two in all) and paired with Claude Code on the implementation.
Challenges
Charging money without breaking the promise. The hardest problem wasn't technical. How do you sell an app whose whole premise is not punishing people? I set rules and held to them everywhere:
- There is never a price on the screen at the moment you miss a day.
- Extra grace days are offered only after you've spent one, never before you start.
- The free week is a local record, not a store trial. There's no card and nothing converts to a charge.
- When the free week ends and you haven't picked a plan, the trail waits at day seven for as long as you need. No day passes against you while it waits.
A missed day is never an alarm. No red, no orange, in any theme. That's easy to say and easy to break, so it's a test. Any "missed" colour with a red-orange hue and high saturation fails a test, and every day state also has a non-colour mark so it survives greyscale.
Time is harder than it looks. Days turn over at midnight, the days the trail waited don't count, and plenty of people are already partway through a challenge in another app. So you can start from the day you're really on and fill in the days you've already done, with photos.
Seventy-two paintings are heavy. Shipping them in the app binary was a non-starter. Managed asset packs download the scene you chose with the install and fetch the others in the background when you need them.
What I learned
- A rule about kindness has to hold on every screen or it doesn't hold at all. One cheerful "You broke your streak!" undoes everything else.
- Asking before it's needed changes the decision. The same person makes a kinder choice on a calm afternoon than at 4 a.m. with a feverish child.
- Price should follow where someone is in the challenge. Day 7, day 60 and a second attempt are different moments, and RevenueCat's Placements and Targeting let the paywall treat them that way without an app update.
What's next
- Gifting, before Black Friday, so you can give a friend their seventy-five days for the new year.
- Challenge with a friend. Invites are built and waiting behind a flag for version 2.
Built With
- elevenlabs
- healthkit
- revenuecat
- sprite-kit
- swift
- swiftdata
- swiftui
- weatherkit
Log in or sign up for Devpost to join the conversation.