Resona, a meditation app that measures the session by Szymon DziedzicResona, a meditation app that measures the session by Szymon Dziedzic

Resona, a meditation app that measures the session

Szymon  Dziedzic

Szymon Dziedzic

Meditation apps hand you a library and leave you to work out which track suits a Tuesday. Nobody can tell you whether any of it is working on you specifically, because a content library has no way to. Resona brackets every session with two readings of the same two-dimensional field, and the difference between them is the whole product.
That decision reaches all the way down. Because the beat has to ramp from a frequency near your check-in to the one your goal needs, there is no file to play: every sample is generated while you listen, on a real-time thread whose render block must never allocate, never lock and never touch the Swift runtime. Parameters cross from the main actor as plain aligned scalars with no synchronisation at all, and every one of them is smoothed over about fifty milliseconds, so a torn read is inaudible rather than a click.
The social layer is a shared chart rather than a feed. A star carries a word from a fixed sixty, its band, its length and how far the person moved, and nothing else: no name, no avatar, no follower count, no reply. Curating the vocabulary is a product decision before it is a moderation one, and it is the reason a board between anonymous strangers needs no queue, no classifier and no human review.
Four things underneath all of it would have been expensive to reverse, and each would have failed quietly. Preferences and sessions decode every key by hand, because Swift's synthesised Decodable throws on a missing key even where the property has a default: add one field and every store written by an older build stops decoding, the app comes up empty, and the next thing the person changes writes that emptiness over their history. Elapsed time is derived from dates rather than accumulated, because a session counting ticks drifts by minutes across a ninety-minute programme and freezes outright the moment iOS throttles timers in the background. Neither of those reports an error when it goes wrong, which is the whole reason to get them right the first time.
Everything here is mine: the product, the interface, the synthesiser, the Firestore rules that are the entire backend, the store listing and the landing page.
Like this project

Posted Aug 25, 2026

Two check-ins bracket every session and the difference is the product. Live-synthesised audio, a shared chart, no audio files. iOS 26 and Apple Watch.