Two Days of Circadia Open Alpha
None of the apps I tried even let me manually enter my sleep data, let alone predict my next bedtime or track my drift. So I built one. Two days into open alpha, here's what's been built, what's coming, and a real ask.
It's been two days since open alpha went live on the 13th. Thirty-six people have signed up, eleven are sharing data, and a few are logging every single morning.
I started Circadia because my sleep is genuinely chaotic. I drift 3-5 hours per night, plus frequent 30 to 65+ hour stretches awake. None of the existing sleep apps would even let me manually enter my own data, much less try to predict when I'd next fall asleep or fit my drift into something coherent. So I built one that does. The tempo right now is feedback in the morning, shipped before bed (when possible).
What's new
The Clock tab
A 24-hour circadian dial with sunrise and sunset markers right on the rim, an amber awake band showing your predicted waking hours, and a magenta phase-glow line at your predicted bedtime. Below the dial is a wake-relative day planner so you can schedule things relative to your biological day instead of clock time — "take meds 2 hours after wake," "eat lunch 6 hours after wake," "light exposure 30 min after wake." Those drift along with you as your bio-day shifts.
You can also pin fixed-time markers on the dial for events anchored to clock time instead — pick up the kids from school, a recurring class, a 2pm meeting — so you can see at a glance whether they fall in your awake window or your sleep window. Custom PDF print and phone-wallpaper export both work.
Custom tags
Settings → Tags, or "Manage tags" right from the log form. Add anything you want to track — workout, melatonin, period, migraine, "weird coffee day," "stayed up reading too late." Each gets a color you pick. They appear as chips on every entry and as dots on the chart, exactly like the built-in tags. You can also turn off any built-in tag you don't use; the form shouldn't pretend you take meds if you don't.
A new built-in Social tag
For sessions where you had a social obligation — job, friends, family, anything that pulled you to a specific clock time. Social pressure is one of the strongest zeitgebers, and previously there was no clean way to flag it.
Smarter auto-exclusion controls
The drift / τ / σ math relies on rules about which sessions count as "real cycles" versus naps or fragments. All of those rules are now tunable in Settings → Sleep math: the fragmentation threshold (sessions starting within X hours of your prior wake get treated as continuations, not new cycles), the nap auto-flag threshold (short sessions get auto-excluded from drift unless you say otherwise), and the post-sleepless threshold (gaps longer than X hours between onsets get tagged as ambiguous because the math can't tell if you really shifted that much or just wrapped around 24h after skipping a sleep). Polyphasic, split-sleep, and ME/CFS users in particular benefit from changing these.
Light-environment tracking
Three quick toggles on every entry: when you got bright outdoor light, whether you were on screens in the last 2h before bed, whether you slept in full darkness. Light is the single strongest signal your body clock cares about, and most other sleep apps don't capture it at all — meaning correlations between light exposure and drift have basically never been quantified outside lab settings.
Logging it in Circadia means a future chart layer can overlay your light pattern against your drift, and a future research view can look at the same correlation at cohort scale. Even just the act of filling it in starts to make the connections obvious to you.
More chart improvements than I can count
This one's personal. When I first built the chart I only had my own data to work with, and I have a relatively small log. Then alpha users started sharing logs with hundreds — some with 500+ — sessions across years, and it became immediately obvious the chart wasn't built for that scale.
So: layer toggles for symptoms, line, dots, excluded, wraps. Group-by-day mode for people whose multiple sessions land on the same calendar date. Center-on-you for midnight-cluster sleepers. Normalize-to-tau toggle so you can see your cycle in your day length instead of forcing it onto 24h. Weekly-average downsampling for long views. A real error boundary so render glitches don't blank the whole screen.
Predict tab improvements
New bidirectional-drift detection — when your phase shifts forward on some cycles and backward on others (a real phenotype, not noise), average drift would have hidden it entirely. Now it gets called out explicitly. Confidence ranges are anchored to your actual σ (cycle-to-cycle jitter) instead of a fake fixed number, with plain-English context for what your σ value means. Custom date ranges let you isolate a clean stretch and see your drift without the noise from a rough week — especially useful if you're trying to figure out whether a new treatment is doing anything.
Imports
Sleep As Android CSV, Fitbit JSON, and Oura Ring CSV all supported. Sleep As Android in particular got a parser overhaul to handle European date formats. And the bug where signing in didn't preserve your imports: fixed today. If your import looked empty after refreshing, please re-import — it'll persist correctly now.
A dedicated "How this works" modal
Reachable from the home screen, covering every metric, the three drift estimators (Smart, Clean, Raw), exclusion rules in detail, the custom-date-range strategy, and where every threshold lives. The Doctor's Report PDF also got a proper methodology section so you can hand it to a clinician without having to explain the math yourself.
Small things that matter
- Two-tap confirm before you delete an entry — no more accidental losses.
- Quality rating is optional now and no longer silently defaults to 3 (which was inflating 'average quality' in shared data).
- Simple-number mode for mood and cognition. Settings → Display → 'Simpler icons.' Replaces the emoji buttons with plain 1–5 numbered buttons for people who don't love the emojis or want something easier to scan first thing in the morning.
- Header buttons got descriptive screen-reader labels.
- The Sleep As Android importer now handles a much wider range of date formats and column names.
- Persistent '📚 How is this calculated?' chip on the home screen so the explainer is always one tap away.
The algorithm — how the current one works, and Jon's better version
In plain English, the current Smart estimator looks at how much your bedtime shifted from one cycle to the next, weights recent cycles more than older ones, and mixes in a small assumption about what N24 patients tend to look like so the math doesn't go haywire when you're brand new. Technically: it's an EWMA-weighted regression over the differences between consecutive sleep onsets, with a fading population prior, an adaptive σ floor that grows with your τ so high-drift users don't get fake-tight error bars, and a two-pass cycle-keep threshold so users with unusually long biological days don't lose valid cycles to a too-strict default. The output is your τ ± σ_τ (your estimated period plus its uncertainty) and σ_obs (your cycle-to-cycle jitter).
There are two other estimators in the dropdown for users whose data the Smart one doesn't fit well:
- Clean — a plain unweighted average of your normal day-to-day shifts, skipping post-sleepless transitions. Good for users whose pattern is stable enough that you don't need a prior or weighting; gives you a number you can sanity-check against by hand.
- Raw — an unweighted average of every transition including post-sleepless ones. Most inclusive, most biased if you have a lot of sleepless cycles. Useful mostly as a comparison number — if Raw and Smart disagree wildly, it's a hint that sleepless gaps are doing a lot of work.
The current model works for very messy users like me — extreme drift, frequent multi-day awake stretches. It struggles with polyphasic patterns (people who sleep multiple times in a day as a stable routine). Better polyphasic handling is on the way.
Jon, my husband and an intelligence analyst by profession, has been working on a more sophisticated approach — one that handles scalloping, unstable τ, and more exotic phenotypes more honestly. His model is more computationally expensive than the current one, so it'll most likely live in the paid version of Circadia rather than the free baseline. He's planning to write up the approach here on the blog before it's even shipped, because the math is worth showing in the open.
A real ask
I cannot improve the algorithm beyond a certain point with just my pattern plus a handful of friends'. Better drift math, better polyphasic handling, scallop detection, all of it depends on having more than a dozen people's data to fit against. If you're comfortable, please opt in. There are two tiers:
- Simple. Your anonymized sleep entries reach me so I can keep tuning the math.
- Research-level. Same anonymized data, plus pre-approved for me to share with academic researchers in the future if a request comes in. None has yet.
Either tier strips your email, name, IP, and account ID. Either tier is revocable in one tap, and the share-linkage is deleted immediately on revoke. Never sold, never advertised, never given to anyone outside circadian-rhythm research. Research-level also opens an optional follow-up form — age range, country, comorbidities, treatments, when sleep issues started, entrainment history — every field optional, every field anonymized. Even partial answers help a lot.
A reminder about accounts
If you've been logging without signing in, your entries live on your device's local storage only. They won't sync to the cloud, won't reach a second device, and won't reach me even if you've toggled sharing on — sharing requires an account, because that's the only way the cloud has a row to anonymize. Sign in via the top-left chip to keep your data across devices. Local-only is fine if that's what you want; just know what you're choosing.
What's coming
- Native iOS and Android apps within the next two weeks. Real native apps — proper local alarms, push notifications, deeper sleep-stage imports from HealthKit / Google Fit / Apple Health, and smart sleep-window wake-ups that wake you in the lightest stage of your biological morning.
- Caregiver / partner integration. Not just a read-only share link, but real in-app notifications. My use case: my husband Jon wakes up before me most days. When he wakes, he'd get a morning briefing on his phone — what cycle I'm in, when I'm predicted to wake, what my day is probably going to look like. So he can plan around it without having to wake me up to check or guess. Optional, of course; you control what your partner sees and what they're notified about.
- Calendar integration. Your biological sleep window as a real event on Google Calendar and Apple Calendar — so anything that scopes off your calendar (Zoom scheduling, Calendly, work booking systems) automatically respects when you're asleep. Context: I teach contortion classes, and because I'm free-running, students sometimes try to book me at 4pm — when I'm actually asleep. This fixes that.
- A raster plot view. The standard chronobiology visualization — a double-plotted actogram, where each day stacks as a horizontal strip across the page and your drift shows up as a diagonal pattern. It's the single most common chart in N24 and circadian research papers, and surprisingly hard to find in any consumer sleep app. Coming to charts or analytics, depending on where it fits best.
- Jet-lag and travel mode. Per-entry timezones plus a 'currently traveling' toggle so the Predict tab keeps its predictions accurate across timezone shifts, and so you can actually monitor jet-lag recovery as a distinct event in your log rather than wondering why your drift suddenly looks weird.
- Polyphasic prediction. Treat naps and split sleeps as anchors when they form a pattern, so people sleeping multiple times per day get accurate τ and forecasts, not just an 'uncategorized chaos' reading.
- A real analytics view — directly answer questions like 'do my drift values change after high-light-exposure days?' or 'do cycles tagged stress correlate with shorter sleep?' inside the app instead of squinting at the chart.
- More chart improvements for very large datasets, different screen sizes and devices, and more export options (PDF, PNG, CSV, ICS for the calendar integration).
- In-app research section — N24, DSWPD, ASWPD, ISWRD, general circadian biology explainers, references, plain-English glossary for every clinical term in the app.
- Accessibility audit — full VoiceOver / TalkBack pass over every screen. High priority. There's a not-insignificant overlap between people with circadian rhythm disorders and people with light sensitivity, vision differences, and chronic illness, and an app for this community should not be inaccessible by default.
- Jon's algorithm.
A Discord, eventually
I'm slowly putting together a Discord server for feedback and community discussion. I am, frankly, bad at Discord administration — channel setup, moderation, role hierarchies, all of it. If anyone reading this has set one up before and wants to help me not embarrass myself, please reach out.
Keep telling me what's broken. Keep telling me what you wish it did.
— Dayah
FAQ
- Why build another sleep app?
- Existing apps wouldn't let me manually enter sleep, predict my next bedtime, or model my drift — all essential for N24.
- Do I need an account?
- No, but logging signed-out keeps your data on your device only; syncing across devices and sharing both require an account.
- What are the Smart, Clean, and Raw estimators?
- Smart = EWMA-weighted regression with a fading population prior; Clean = plain average skipping post-sleepless transitions; Raw = average of every transition (most biased). Use Clean/Raw to sanity-check Smart.
- What does opting into sharing involve, and can I undo it?
- Two tiers (Simple / Research-level), both strip email, name, IP, and account ID, both revocable in one tap with the share-linkage deleted immediately on revoke.
Comments