A wake time that tracks sunrise, bounded by your work schedule.
Sunrise
—:—
Wake
—:—
Bed
—:—
Loading today’s schedule…
Open Shortcuts.app, tap +, and add these actions in order. Name it Circadian Wake.
Latitude, Input: Current Location. Rename the magic variable to Lat.Longitude, Input: Current Location. Rename to Lon.Time Zone, Input: Current Location. Rename to TZ. (Hardcode America/New_York with a Text action instead if you don’t travel.)09:00. Set Variable → Work.90. Set Variable → Prep.0. Set Variable → Offset.8. Set Variable → Sleep.05:00. Set Variable → Earliest.https://theastigmaticactuary.com/wake/today?lat=[Lat]&lon=[Lon]&tz=[TZ]&work_start=[Work]&prep=[Prep]&offset=[Offset]&sleep_hours=[Sleep]&earliest=[Earliest]
wake_hour, wake_minute, bedtime_hhmm, label.wake_hour. Rename to WH.wake_minute. Rename to WM.label. Rename to Label.is Wake → Remove Alarms (Input: Found Alarms). Silently clears yesterday’s.WH:WM, Label: Wake, Sound: your pick, Snooze: off.Label.Run it once to grant location + alarm permissions. Then Automation → Create Personal Automation → Time of Day → 10:00 PM daily, Run Immediately, no notification. It now re-entrains every night.
Install the free HTTP Shortcuts app, then:
work_start = 09:00, prep = 90, offset = 0, sleep_hours = 8, earliest = 05:00.Circadian Wake. Method: GET. URL: https://theastigmaticactuary.com/wake/today
lat, lon, tz leave the value blank — they’re filled by the pre-request script below. For the other five, tap the { } icon and insert the matching variable: work_start, prep, offset, sleep_hours, earliest.const loc = await getLocation();
setVariable("__lat", loc.latitude);
setVariable("__lon", loc.longitude);
// Android doesn't expose IANA TZ; hardcode yours or read from a Constant variable.
setVariable("__tz", "America/New_York");
Then back in Request Parameters, point lat at __lat, lon at __lon, tz at __tz (create these three as Constant variables first — HTTP Shortcuts needs them to exist to bind).{label} (the app substitutes JSON fields with double braces).const body = JSON.parse(response.body);
sendIntent({
type: "activity",
action: "android.intent.action.SET_ALARM",
extras: [
{ name: "android.intent.extra.alarm.HOUR", type: "int", value: body.wake_hour },
{ name: "android.intent.extra.alarm.MINUTES", type: "int", value: body.wake_minute },
{ name: "android.intent.extra.alarm.MESSAGE", type: "string", value: "Wake" },
{ name: "android.intent.extra.alarm.SKIP_UI", type: "boolean", value: true },
],
});Wake alarm in the stock Clock app.AOSP-based clocks dedupe by exact hour+minute+label; Samsung/Pixel create a new alarm each day. If old alarms stack up, toggle them off manually or switch to a Tasker AutoAlarm flow.
Pick your platform — each card has a numbered recipe you build by hand in the native Shortcuts app. No files to import.
Today’s schedule as JSON: /wake/today. Override location, hours, sleep duration via query params. Source on GitHub.