Skip to content
All work
Side project · Jul – Aug 2026
Morningpass logo

Morningpass

iOS alarm that rings until you finish chained wake-up challenges

Role
Solo: design, iOS, backend
When
Jul – Aug 2026
Status
Built for iOS 26, pre-release
Highlight
~37K lines of Swift, solo

Demo · recorded in the iOS Simulator

0:00 / 0:53

Overview

What it is

Morningpass is a native iOS 26 alarm app. It schedules real system alarms with AlarmKit, then asks you to finish an ordered chain of wake-up challenges before the wake session counts as done. The code defines 24 challenge kinds, 2 of them for accountability, from math and shake to push-ups, Stroop games and AI-checked photos.

I built all of it alone: the design, the SwiftUI app, the widget and Screen Time extensions, two Supabase Edge Functions, a marketing site and the Xcode Cloud setup. Around it sit a Screen Time based Morning Block that shields distracting apps after the alarm, sleep and energy insights, and a subscription flow.

Why it’s interesting

  • AlarmKit always shows Apple's slide-to-stop UI, so Stop runs an App Intent that hands off to the app, which opens the challenge chain.
  • The chain, mission payload and progress are persisted, and nudge alarms are scheduled if you idle, so killing the app cannot skip the challenges.
  • Screen Time support spans four targets: the app, a DeviceActivity monitor and two Shield extensions, sharing config through an app-group store.
  • Challenges use Vision, CoreMotion, the pedometer, GPS and barcode scanning, and photo challenges are verified by Gemini behind a Supabase Edge Function.
  • Sleep is inferred on device from phone stillness, with a step-history fallback and HealthKit when granted, so no wearable is needed.
24
wake-up challenge kinds
~37K
lines of Swift, written solo
4
app extensions: a widget and 3 for Screen Time

Architecture

How it fits together

SwiftUI appSwift 6, SwiftDataAlarmKitsystem alarmsStop App Intentpending handoffChallenge chainresumable sessionWake storesUserDefaultsApp-group storeMorning Block configScreen Timemonitor, shieldsSupabaseEdge Functions, PostgresGeminiphoto checkscheduleStopopen apppersistnudge re-ringwrite configread configphoto
Stop on the system alarm hands off through an App Intent to a persisted challenge chain that schedules nudge alarms and verifies photos in Supabase, while Screen Time extensions read the shared config the app writes. data external sync call async / webhookhover a box to trace it

Screens

A closer look

Marketing site. The static landing page I built in the same repo.

1 / 1

Tap a screenshot to enlarge it.

Launch screen. A pulse-ring launch screen settling on a parchment field.
Onboarding cost reveal. A lost-hours figure computed from the answers given earlier in the onboarding funnel.
Alarm list. A wake streak card, then alarms showing their schedule and how many challenges are chained.
Challenge picker. Challenges grouped by outcome, with a trending list at the top.
Alarm editor chain. Step two of the alarm wizard: an ordered chain of math, shake and photo challenges.
Math challenge detail. Each challenge sheet has an animated explainer, a difficulty setting and a quantity.
Stroop ink color. Tap the color of the ink and ignore the word. The chain timeline sits above.
Wake success. After the last step: streak, week view and a summary of the completed mission.
Sleep insights. Last night's sleep and an estimated energy curve with the wind-down window marked.
Morning Block setup. Apps chosen for the post-alarm shield, listed in app-owned rows. A fake picker stands in here.
Paywall. The native fallback paywall with yearly and monthly plans. The Superwall paywall is remote and was off.

Features

Everything it does

Alarms

  • System alarms — Scheduled, cancelled and observed through AlarmKit, with a streak card on the alarm list.
  • Alarm wizard — Time, challenges, schedule with weekday chips or one-time, then a review step.
  • Alarm protection — Lock changes in the last hour, keep ringing during challenges, force-stop exit lock.
  • Idle re-ring — A stalled challenge re-rings after a configurable timeout.
  • Accountability buddy — Deadlines and friend approval, processed by a cron-triggered Supabase function.

Challenges

  • Basics — Math at three difficulties, shake, steps, and QR or barcode scanning with a printable QR.
  • Get out of bed — GPS distance walk, step outside and a mirror selfie.
  • Move your body — Push-ups, squats and jumping jacks tracked with Vision and motion data.
  • Wake your brain — Stroop ink color, reaction speed, color switch and rule switch.
  • Routine photos — Made bed, shower, water, teeth and more, verified by Gemini.
  • Animated explainers — Every challenge has a detail sheet with its own animation.

Morning Block

  • Shielded apps — Choose apps, categories and websites to shield for a set time after the alarm.
  • Shield actions — Tapping a shield only closes the blocked app.
  • Commitment Mode — Blocks app deletion while a wake challenge is active.
  • Pre-alarm lock — Blocks deleting the app in the hours before an alarm.

Insights

  • Sleep and energy — Sleep summary, estimated energy curve and wind-down window.
  • Sleep debt and need — Debt, need, tonight's plan and a consistency ribbon.
  • Data sources — Phone stillness, step history, and read-only HealthKit when granted.
  • Morning recap — A sleep recap sheet and recommendations after waking.

Onboarding and billing

  • Onboarding funnel — Wake goal, diagnosis questions, cost reveal, plan chart, hold-to-commit, permissions.
  • Subscriptions — Superwall paywall with a native fallback, plus a gate for expired subscribers.
  • Cancellation flow — A retention flow with a grace period.
  • Widget — A Tomorrow widget showing wake time and streak, opening Morning Review.

Tech stack

What it's built with, and why

App

Swift 6 and SwiftUI
The whole app, with strict concurrency checking, targeting iOS 26.1.
SwiftData
Stores alarms and their challenge chains.
App Intents
The Stop action that hands off from the system alarm to the app.

System frameworks

AlarmKit
Schedules, cancels and observes real system alarms.
FamilyControls, DeviceActivity, ManagedSettings
Morning Block and Commitment Mode across four targets.
Vision, CoreMotion, CoreLocation, AVFoundation
Push-up, shake and step tracking, GPS walks and barcode scanning.
HealthKit and WidgetKit
Read-only sleep data and the Tomorrow widget.

Backend

Supabase Edge Functions
Two Deno functions, 465 lines: photo verification and accountability deadlines.
Postgres migrations
Three SQL migrations, including the accountability cron.

AI

Gemini
Checks resized photos for routine challenges; routed via OpenRouter per a code comment.

Payments & analytics

Superwall
Remote paywall, with a native fallback view in the app.
PostHog
Product analytics from the iOS app.

Tooling

XcodeGen and Xcode Cloud
A post-clone script generates the project and resolves packages in CI.
XCTest
46 unit test files and 7 UI test files driven by launch-argument seeds.