Sleep that follows your shifts.
Inspiration. Every sleep app assumes one bedtime. A nurse on 3×12s, a paramedic on 24/48, a factory worker on a rotating block has three. The question they ask at 3 AM is not "how did I sleep" — it is "when do I sleep next, and when is my last coffee". Vessa answers that from the shifts you actually work.
What it does. Enter your shifts — by hand, from a template (3×12, fixed nights, 24/48 and more), or by photographing your roster — and Vessa turns the next 72 hours into a plan: main sleep, recovery sleep, pre-shift naps, off-day sleep, wind-down and caffeine cutoff. Every sleep is a switch. When a shift changes, the plan re-plans itself, and it tells you three days before your schedule runs out. Core planning is free: unlimited shift entry, the whole plan, every planned wake-up time, and your first roster import.
Premium does three things. It reads your roster from a photo every cycle — on the device, nothing uploaded. It sets the wake-up alarm for every planned sleep as a real iPhone alarm (AlarmKit) and moves it when your shift moves. And it keeps a sleep ledger: what you planned next to what you slept, read from Apple Health, day by day and by sleep type.
How we built it. Native Swift, SwiftUI and SwiftData on iOS 26.1+. The planner is a pure-Swift domain package with a Python measurement harness that runs every placement rule against 13 shift templates and 600 synthetic rosters before it ships — more than one rule was reversed the same day it was written because the harness showed what it actually produced. Roster import is Vision plus a table heuristic, entirely on device, measured against a synthetic corpus of 18 roster layouts with ground truth. Alarms are AlarmKit on a 7-day rolling window, soaked for days on a real phone across an iOS update. Sleep data is HealthKit, read-only. The backend is FastAPI and PostgreSQL for Sign in with Apple, cross-device sync, account deletion and RevenueCat webhook reconciliation. RevenueCat runs offerings, purchase, restore and entitlement state; the app reduces RevenueCat's evidence and the backend's into one decision, so a purchase works the moment it completes and reconciles safely afterwards.
Challenges. Representing shift work without making the user learn cycles and anchors. Apple Health writes a night's sleep as 15–35 fragments with no notion of a session — matching them to a planned block took a field study before it took code. A wake-up alarm that has to survive a schedule change, an app deletion and an OS update. And a free/paid boundary that never degrades the free plan: we moved things out of Premium — transition planning, repeating-pattern maintenance — when we saw they would make the free product worse rather than the paid one better.
What we learned. The valuable output is not a score; it is the next honest action. Speed claims we could not measure came out of the copy. And a paywall earns its place only at the moment of a repeated task the user would rather not do again.
Vessa is a planning and self-care tool. It does not provide medical advice, diagnosis or treatment.
Built With
- docker
- fastapi
- firebase
- healthkit
- postgresql
- python
- revenuecat
- sentry
- swift
- tenjin
Log in or sign up for Devpost to join the conversation.