buenomini

Wakey

An alarm that reads tomorrow's calendar and wakes you at the right time, computed on the phone.

iOS app
status
In development, not on the App Store yet
platform
iPhone, iOS 26
app
SwiftUI, AlarmKit, EventKit, MapKit
server
TypeScript, Fastify, SQLite

Your 9:00 moved to 8:00 and your alarm didn't. Wakey reads tomorrow's calendar, does the first event minus prep minus commute math, and sets one Smart Alarm for you. Backup alarms keep ringing until you slide "I'm up", because half-asleep doesn't count.

There are two modes. Manual Mode is free and fully on-device, but you have to open the app every day so it can recompute from the current calendar (an evening local notification reminds you). Auto Mode is a subscription. A small server sends a silent push every night (the Schedule Ping) that wakes the phone in the background, and the phone recomputes tomorrow from your calendar, on the device. There's also an hourly silent sync pulse on top of that. Only a trigger and a timestamp go over the wire. The server never receives, needs or stores your calendar.

# Decisions

One Smart Alarm, no alarm list

ADR-0001
chose
Exactly one alarm per night, derived from the calendar. Reliability comes from automatic backup alarms.
rejected
A Clock-style list of alarms you manage by hand. That's a general alarm app, which Wakey explicitly isn't.
cost
No alarm list UI and no per-alarm editing, on purpose.

Pre-schedule the whole backup chain

ADR-0002
chose
When the Smart Alarm is set, a chain of backups is scheduled at 5-minute intervals, and sliding "I'm up" cancels the rest.
rejected
Deciding at fire time whether to ring again. iOS gives the app no background time to make that call.
cost
Every backup sits in AlarmKit up front. I measured the pending limit at 100 or more on a real iPhone, so it's fine.

Silent push over BGTaskScheduler

ADR-0004
chose
Auto Mode uses a server-timed silent push to trigger the nightly recompute.
rejected
BGAppRefreshTask, which runs when iOS decides. That's unreliable when you have a deadline.
cost
A server to run, and silent pushes are still best effort (iOS throttles them if you force-quit the app), so there's a visible push as a fallback.