Blog

One Month of Open Alpha

One month into open alpha, Circadia has moved from a tool I built for my own impossible sleep into an app with enough real N24 data to make the research side feel less theoretical. The Community tab is live, Jon replaced the particle filter forecast with a tag-aware Kalman-IMM model, and the app now has enough users to expose the administrative layer under health software: platform rules, security audits, server costs, and the boring financial reality of keeping something useful alive.

Open alpha went live on May 13. That makes this the one-month update!

The first update was two days in, when Circadia was still mostly a tool I had built around my own sleep. I needed somewhere to put data that normal sleep apps either rejected, flattened, or treated like user error. I drift around 5 hours per night, with frequent 30 to 65+ hour stretches awake. I did not need another app telling me my sleep was irregular, I needed one that understood irregular as the starting point.

A month later, Circadia is in the strange last stretch between open alpha and native launch. People are logging, importing, sharing data, breaking charts, testing forecasts, and showing me what the app has to handle if it is going to work outside my own sleep. We are days away from the iOS launch, with Android following after Google Play’s required closed test.

The app shipped constantly this month. The harder part was the layer under and around the code: health-data permissions, store rules, security audits, server costs, accessibility issues, and years of messy sleep history arriving all at once. That is what this update is about: what changed, what shipped, what broke, what still costs money, and what I am doing about it.

The numbers

In my first update, Circadia had been open for two days. 36 people had signed up, and 11 were sharing data. One month in, there are 97 sign-ups, 50+ people logging daily, and over 21,000 sleep entries in the app. Some people started from nothing. Some imported years of sleep history and immediately proved that my original chart code had been living a sheltered life.

The smaller number matters more: 43 people are sharing data to improve the algorithm, 37 at the research tier, and 35 have consented to future publication. The largest study of sighted Non-24 ever published followed 57 patients, twenty-one years ago (Hayakawa et al., 2005). Circadia has not passed that yet, but the research-sharing cohort is approaching that scale in its first month.

A month in, I am already seeing possible phenotypes inside N24. Some people have a bad night with a huge drift, then snap back toward their natural τ with negative drift. Some people have the same bad night and simply continue from the new point as if the lurch became the new baseline. Some sleep long after a sleepless stretch. Some seem almost locked into a fixed total cycle, where staying awake longer means sleeping less. Others drift in both directions instead of cleanly free-running one way.

That is the kind of structure I have not seen described well in the literature. Circadia may be able to bring it into view: not one N24 pattern, not one average τ, but different ways the disorder behaves over time.

Other fun numbers: ~160,000 hours of sleep logged across everyone (almost 18 years), 247 logged stretches of 24+ hours awake, more than 16,000 full sleep-wake cycles, and — added all together — over 600 laps around the clock. Plus, my own exciting number: ~1,350 code commits in 30 days (I've been busy!)

The Community tab

N24 isolates by making time unstable. Your waking hours slide later, sometimes slowly and sometimes all at once, and the people around you stay attached to a clock your body keeps leaving behind. After a while, the disorder is not just about when you sleep. It is about when you can answer messages, when you should eat, when you should take medication, when you can show up, when light helps or hurts, and why 4pm can be a perfectly normal afternoon for someone else and the middle of the night for you.

Most people with sighted Non-24 have never met another person who has it, and almost none of us have seen what the disorder looks like across more than one body. The Community tab is my attempt at that second thing. It will not connect you to anyone, but it can show you the shape of the group you're part of: who's awake on your schedule right now, where your body-clock length sits among everyone else's, who drifts at nearly your pace, and which everyday things seem to move people's rhythms. The point is less "meet other people" and more "stop feeling like the only data point."

It is opt-in, anonymous, and share-to-see. It is also separate from research and publication consent. Community pools derived numbers, not raw nights, because rare-disorder data does not become safe just because a name is removed from it.

What it shows:

The N24 Atlas shows where everyone’s body clock is sitting right now, not where they live, but where their biology is across the 24-hour day. Your slice is marked, so you can see how many others are near your body time. That sounds small until you have spent years feeling like your sleep exists in a private weather system nobody else can see.

The Community Discoveries section looks at what factors may be moving drift: light timing, darkness, screens, melatonin, caffeine, alcohol, last food, stress, illness, social obligations, medication, and exercise. Those are zeitgebers, time-givers, the external signals that can nudge a circadian rhythm.

The important part is the math. Each effect is computed within one person first, then averaged across the community. Circadia compares your tagged nights against your other nights before adding your result to the group, so the fastest drifters cannot drag the whole finding around. It is not asking whether people with worse N24 behave differently. It is asking whether a change inside one person’s life lines up with a change inside that same person’s drift. Then Circadia averages those within-person effects across the opted-in group.

Each finding gets a confidence tier: Emerging, Moderate, or Strong. The group is still small, n=20, so most findings should be treated as early. That is the point of showing confidence instead of dressing every number up as a conclusion. The early results are already interesting enough that I keep checking them though!

How you compare:

There is also a τ percentile, so you can see where your body-clock length falls against the group. A tighter view compares you only with people whose body clock runs within an hour or two of yours, because someone drifting twenty minutes a day and someone drifting four hours a day do not belong in the same bucket.

Sleep Constellations sort people into drift archetypes — Fast drifter, Moderate drifter, Slow drifter, Near-24, and Bidirectional — so you can see your type and who shares it. Sleep Clubs are badges earned from your own patterns: Fresh Starts, Marathon Loggers, Smooth Operators, Erratic Drifters, Speed Lappers, Long Haulers.

Everything else that got built

Jon replaced the forecast. The previous adaptive forecast was a particle filter: sixty-four competing guesses about your rhythm that updated every time you logged a night. He wrote that version up here. This month, he replaced the particle filter forecast with Adaptive V3, a Kalman-IMM model.

Plain version: it runs two filters at once. One assumes your drift is relatively steady. The other assumes your rhythm is unstable. A Markov chain decides how much to trust each one from night to night. The forecast widens when the two disagree, or when your recent nights are messy, and tightens when things settle. That is what I want from a forecast for this disorder: not confidence as a costume, but uncertainty that actually responds to the data.

The new forecast also reads tags. If you log caffeine, illness, stress, medication, or other context (like custom tags), that information can affect the next prediction instead of sitting off to the side like a note nobody reads. There is also a personalization layer underneath it. The current model can use general settings across users, but the paid tier will add an every-two-weeks training run on your own sleep history. That means the forecast can keep adapting to your rhythm over time, rather than relying only on population-level defaults.

My side was the τ math. I rewrote the Smart estimator in gap-space, which fixed a bug where one long cycle could read as either −9.95 or +14.05 hours of drift depending on which way around the clock the math measured it. The old estimator benched those nights instead of risking a bad read. That was safer than using them wrong, but it also meant some of the most important nights were being excluded because the clock is circular and the math did not know how to be honest about it. Now a long cycle reads as a long cycle. I wrote that change up on its own.

The Body-Time Translator turns clock time into body time. If a doctor offers you a 9am appointment, Circadia can show that 9am may land at 2:13am for your body, with a conflict score to match. The related event check answers the question underneath every future plan: “Am I likely to be awake then?”

The Clock runs off the live forecast. It has a continuous awake band, sunrise and sunset markers, raw latitude and longitude, polar-latitude handling, and a wake-relative planner so meds, meals, caffeine, and light can be planned around your biological day instead of the wall clock. You can also anchor events to your predicted bedtime, which helps for evening meds, wind-down times, and more.

The Time Zone Passport names the world city whose local time currently matches your body clock and stamps the cities your clock passes through as it drifts. For fast drifters, one stamp per day is too coarse. I am working on a version that shows several cities across a single day, because my body clock can apparently take a layover before breakfast.

The chart took more work than almost anything else. I built the first version on my own log. Then testers arrived with several thousand sessions across years, and the chart folded. It now has a canvas fast path, fewer slow recomputes, a navigation strip for long histories, weekly downsampling, normalize-to-τ, group-by-day, center-on-you, and per-date rows so missing days do not disappear.

Next to it, the new Analysis tab is where you actually dig in. It has the actogram — one row per cycle, the standard chronobiology view — which you can read against a 24-hour day, where a free-running rhythm marches diagonally down the page, or realign to your own τ, where the same rhythm stacks into a straight line. It also shows your own with-versus-without effect for each tag, how steadily your timing drifts, when you tend to fall asleep, a sleep-midpoint metric, and a forced-wakes panel. That forced-wakes split matters, because a sleep that ends naturally and a sleep that ends because the world demanded consciousness are not the same data point.

Calendar sync publishes a private feed you can subscribe to in Apple or Google Calendar. Predicted sleep windows show up as events and move as your rhythm moves. You can include past logged sleeps, choose which forecast drives it, and use the in-app calendar view if you want the forecast as bars instead. I teach contortion and I free-run. I made this because students kept trying to book me for hours I was asleep. Now anything that reads my calendar knows when I am actually available.

Circle is the partner-and-friend sharing I wanted early on, built with real boundaries instead of "just show someone everything." You generate a code or link and decide per person, exactly how much they see — three tiers, scaled to how close they are. Availability only is just your busy/free windows, for classmates, coworkers, and acquaintances. Family & friends adds your current status, today's predicted wake, and when you're likely reachable. Full detail is a read-only view of your whole Circadia — recent nights, weekly trends, your predicted week — for the people who actually plan around your sleep. There are public, read-only status links for people who aren't on Circadia, and an Awake Planner that answers "how awake will they be at 7pm?" right on someone's card. The point is that someone who loves you can know whether you're probably asleep without waking you to find out.

The accessibility pass was one of the most important parts of the month. There is real overlap between circadian disorders and light sensitivity, vision differences, chronic illness, migraine, and neurodivergence. An app for this group has no business being difficult to look at or navigate. The pass added text & app scaling, numbered icons instead of emoji for mood and cognition, contrast fixes, screen-reader labels, reduced motion, faster tooltips, and a high-contrast theme.

Imports now cover Sleep As Android, Fitbit, Oura, Huckleberry for baby or child sleep, and paste-your-notes, all with dedupe so re-imports do not duplicate old data. Logging got split-sleep grouping, a one-tap "didn't really sleep," a stale-logs guard so the app stops warning that you have been awake for 130 hours when you forgot to log, bulk "fill unknowns," a "my usual" shortcut, two-tap delete, and settings that sync across devices.

The navigation changed too: Clock, Log, Predict, Community, Trends. Settings got more compact. The Doctor's Report PDF got a real methodology section. Themes and color schemes were added for those that don't vibe with the cosmic backdrop: Aurora, Bioluminescence, Bubblegum, and more along with some light-themes like Dawn and a high-contrast black-and-white.

That is the visible list. Underneath it is the longer list every app has: small fixes, wording changes, performance repairs, edge cases, import weirdness, scroll positions, save buttons, missing states, tooltips, and all the places where a real user does something more interesting than the developer's test data.

Native apps, and why Android is later

The iOS and Android apps are already built. I have mostly been tinkering, polishing, fixing native-specific weirdness, and updating them every time the web app changes, which has been often because open alpha has been moving fast.

The part I underestimated was not “can I make the app run on a phone?” It runs on a phone, and quite well. The part I underestimated was everything between a working app and a store release. I did not understand how many platform rules sit between those two things until I ran into them.

iOS is coming first. I plan to submit it soon, though submission and publication are not the same thing, especially for a health-adjacent app. Circadia is careful with wording on purpose. It does not diagnose, treat, or pretend a forecast is a medical conclusion. It shows patterns, estimates, uncertainty, and context, because that is what the app can honestly know.

Android is ready too, but Google Play has an extra gate I did not know about until after I paid for my account and was ready to hit submit. New developer accounts have to run a closed test with at least 12 testers for 14 continuous days before they can apply for production release. Not before approval. Before applying. If those 12 testers don't open the app daily, they fail you and you have to start over.

Then I found out I needed to buy an Android phone to prove I had a real test device. That is fair enough in hindsight, but it was not on my mental checklist when I started building. I am new to apps, and this has been one of the louder ways the process has reminded me.

So Android is not later because the app is less built. It is later because Google Play has a mandatory waiting room, and I walked into it later than I would have if I had known it existed. With almost 100 users already in open alpha, being required to run a closed test is objectively funny. Not helpful, but funny. So iOS comes first, and Android follows as soon as Google’s required waiting period is over. I will be sending out tester requests soon!

The walls I hit

I wanted Fitbit sync to be simple because the user-facing idea is simple: connect the thing people already sleep with, pull in the sleep data, and let Circadia do the part Circadia is good at.

That is not how health data works.

Google retired new access to the old Fitbit Web API, so Fitbit sleep data now has to come through the Google Health API. Sleep is a restricted scope. Restricted scopes require verification, and for this one, verification includes a third-party CASA assessment, a Cloud Application Security Assessment. The cost range I was given is roughly $500 to $4,500 a year.

Per year.

For a company, that is a compliance line item. For a small app with one health-data integration, it changes the entire calculation of the feature. I understand why health data has a higher bar, I want health data to have a higher bar. I also understand now that the bar is priced for organizations with budgets, not tiny projects trying to add one integration without charging everyone for it.

So for now, live Fitbit sync is paused while the app sits in Google's verification queue so I can find out how much (in that very LARGE range) verification will cost. Fitbit users can import from a free Google Takeout or Fitbit export instead. It costs nothing, works today, and uses the same underlying data.

The larger lesson is that almost none of this is visible until you hit it. Scope tiers. Security audits. Token lifecycles. Store-review rules. Claim wording. Permissions. The administrative side of health software is not a side quest. It is part of the product whether I like that or not.

Keeping Circadia alive

I feel weird charging people for a tool I built because I need help.

I feel weirder imagining the community losing it because I tried to make server bills disappear through moral purity.

The core stays free: logging, drift, τ, the actogram, the basic forecast, and the Doctor’s Report PDF. Those are the parts someone needs to understand their rhythm and bring something coherent to a doctor. I built Circadia because normal sleep tools did not work for me, and I do not want the basic version to become another thing people with N24 cannot access.

But Circadia costs money to run. Servers cost money. Forecasting costs compute. App stores take their cut. Health-data access has verification and security costs, including a third-party CASA assessment that can cost $500 to $4,500 a year. None of that gets cheaper because the app is useful.

There is already a donate button in the account menu. It does not unlock anything, it is not a secret subscription, and it will not follow you around the app making sad owl eyes. It is just there for people who want to help with server costs, security costs, and the general reality of keeping Circadia alive before the paid tier launches.

When the native apps launch, there will be a paid tier. I am tentatively planning on launching it at $4.99/month, with an optional $9.99/month supporter tier for people who want to help fund the project beyond their own account. There will also be annual options and lifetime options, as well as a special rate for those who helped me test in Alpha, so many of you made the app what it is with your feature requests and bug reports. There will also be a free trial, and an “I can’t afford this” option where people can email me. I'm not trying to take away features everyone is used to, just trying to keep the doors open!

The paid tier will not be a sad little unlock screen with one extra chart. It will include the expensive and advanced parts of Circadia, especially personalized adaptive forecasting: a training run on your own sleep every two weeks, so the model can keep learning your rhythm instead of treating you like the average user. Other newer planning and analysis features will live there too.

N24 is a disability, and disability affects income. I know that from the inside. I want people who need Circadia to be able to use it. I also want Circadia to still exist six months from now.

That is the line I am trying to hold: the essentials stay free, the paid tier is worth paying for, donations are there for people who want to help early, and the people who can support the project help keep the tool alive for the people who cannot.

The people testing it

Most of what shipped this month came from the tester Discord. Someone reports something broken. I fix it. Someone tries the fix, finds the next edge case, and the loop runs again. The chart only survives years of data because someone brought years of data and broke it. Several forecast problems were caught because people watched their own predictions go wrong and told me exactly how. A lot of the planner, import, analysis, and sharing work started as someone saying, "Could it also…"

I am not naming people because that is theirs to share, not mine. But a lot of this changelog has a specific person behind it. There is also a Facebook group for people who would rather not use Discord.

N24 is isolating because your schedule moves away from everyone else's. Watching people find each other around the app has been one of the few parts of this month that was not complicated.

That is the month. Circadia is still an alpha. It is still unfinished. It is also much less hypothetical than it was thirty days ago. It has real users, real data, real bugs, real costs, and enough momentum that the next set of decisions has to be more careful than the first.

Keep telling me what is broken. Keep telling me what you wish it did.

— Dayah

FAQ

What is Circadia?
Circadia is a sleep tracker for Non-24-Hour Sleep-Wake Disorder and other circadian rhythm disorders. You log your sleep, and it shows your circadian drift, your τ (the length of your body's day), and a forecast of when your next sleep window opens. It runs in the browser at circadia.owlandkestrel.com, with native iOS and Android apps in progress.
Is Circadia free, and will it stay free?
The core stays free: logging, drift, τ, the actogram, the basic forecast, and the Doctor's Report PDF. When the native apps launch, the more expensive features, mainly the adaptive forecast, move to a paid tier because they cost real compute to run. The essentials needed to track the disorder and bring useful data to a doctor stay free.
What is Non-24-Hour Sleep-Wake Disorder?
Non-24-Hour Sleep-Wake Disorder is a circadian rhythm disorder where your body clock does not stay aligned to the 24-hour day. In sighted Non-24, sleep and wake times often drift later and later instead of holding to a stable schedule. It is common in totally blind people and under-recognized in sighted people. There is a full explanation here.
Can Circadia import my Fitbit or Oura data?
Yes. Circadia imports Sleep As Android, Fitbit, Oura, Huckleberry for baby or child sleep, and paste-your-notes. Oura syncs live over OAuth. Fitbit live sync is paused while Google Health API access clears verification, so Fitbit data comes in by free file import for now.
How does Circadia predict my sleep?
Two ways. The transparent estimators, Smart, Clean, and Raw, compute τ and drift from your history. Jon's adaptive forecast uses a Kalman-IMM model that runs two filters at once, one for steady drift and one for upheaval, then blends them based on which fits your recent data. It also reads tags like coffee, illness, stress, and medication.
What is the Community tab?
The Community tab is an opt-in, anonymous view that pools derived numbers, never raw nights and never research data. It shows where everyone's body clock sits, what factors may be moving people's drift, where your τ falls against the group, and the people whose clocks run closest to yours.
Is my data private?
Sharing is opt-in, with separate choices for app improvement, research, publication, and Community. Community uses derived numbers. Research sharing strips identifying information and can be revoked.
Is there a native app yet?
Not yet. The iOS and Android wrappers are built. iOS will launch first. Android will launch at least two weeks later because Google Play requires new personal developer accounts to complete a 14-day closed test with 12 people before applying for production release.
How can I support Circadia?
Use it. Log honestly. If you are comfortable, opt into data sharing so the forecasts and research tools improve. There is also a donate button in the app, in the account menu, if you want to help with running costs.

Comments