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

Share this project:

Updates

posted an update

The rota goes up at the start of the month, and you type twenty shifts into your phone one at a time. Then the month ends and you do it again.

Here's what we're building: photograph the roster, tap your own name, and your shifts come back. Pinch to zoom, drag to move around, and wherever on your name you tap, it finds the same person.

The reading happens entirely on your phone. The photo doesn't go anywhere.

You can see it on screen today; saving it into your plan is what we're working on now.

Log in or sign up for Devpost to join the conversation.

posted an update

Your shifts changed, you entered the new schedule, and the app wiped days you had actually worked last week. That doesn't happen any more.

The days you've lived through are your record. A new schedule now rebuilds only the dates it covers and leaves the rest alone. The gap between today and your new schedule's first day isn't blanked either — your old shifts stay there. Your roster starting next Monday no longer costs you the three weeks in front of it.

And before you change anything, we tell you what's about to happen: which dates the new schedule covers, and that nothing you've already worked will move.

Log in or sign up for Devpost to join the conversation.

Submission history