Skip to content
Projects / 09Mobile

Hesya

Role
Founder & Builder
Year
2026

A native iOS session protector for knowledge workers — notice drift, return to intent, without shame or blocking. Built solo end-to-end.

Hesya home screen asking how you want to remember the day
Today — the idle home before a session.
01
Context

Existing tools for attention and screen time split into two failure modes: apps that pull people into unconscious digital escape when they’re already overwhelmed, and productivity tools that push control, guilt, and optimisation. Neither restores agency — one exploits distraction, the other polices it. Hesya was built to sit in between: a session protector for knowledge workers that helps them notice drift and return to what they meant to do, without becoming a system they depend on.

Hesya declare-intent sheet with suggestions and a session length
Declare — name the result you want, and a length.
02
Goal

Ship a native iOS app, solo, that helps people stay oriented to a declared intent — recovering from distraction without shame or blocking — where success is explicitly measured by the tool being needed less over time, not more. Silence is a valid, intended outcome.

03
Research

Fifteen interviews before a line of code. Not a survey. Long conversations with knowledge workers who already recognised the problem in themselves.

Five things came back repeatedly, and each one became a constraint:

I know I’m drifting. I just can’t stop.
Awareness isn’t the gap. Detection alone solves nothing — the product has to offer a way back, not a warning.
I feel guilty afterward, but I couldn’t stop in the moment.
Shame is already present. Anything that adds to it makes the product part of the problem it claims to solve.
Focus apps became another thing to manage, not less.
The product has to be abandonable. Success looks like needing it less.
Too many choices. I freeze instead of starting.
Three taps to start. Nothing pre-filled. One intention, not a task list.
I opened my phone to scroll and lost an hour I didn’t have.
The cue has to arrive during the drift, not in a summary afterwards.

I tested the copy as carefully as the interface. Every cue was checked against the words people actually used — in a product about attention, the tone of a prompt is the product. The same sentence can read as an invitation or as a scold.

04
What I did
  • Designed the core loop — Declare → Start → Stay → Recover → Reflect — as the spine of the product, with supporting cues kept sparse by design
  • Built drift detection using Apple’s Screen Time / DeviceActivity APIs: sessions schedule a threshold on user-marked “pull-away” apps; on trigger, a background monitor checks cue gates before surfacing a prompt
  • Designed pacing cues as an opt-in, separate mechanism from drift recovery — silenced automatically if a session looks fragmented or is paused
  • Designed the shame-free reflection loop and Journal / Weekly Pulse pattern views, shown only when the user asks to see them
  • Built the full SwiftUI implementation solo — product philosophy, UX, on-device pattern recognition, and App Store release — with no external dependencies or data collection
05
Decisions

Shipping less than I designed

The original core feature was behavioural state detection: distinguishing someone overwhelmed from someone restlessly scrolling from someone in deep focus. I built the detection logic around app-switch frequency, session fragmentation, and focus continuity.

Then I hit the platform. iOS doesn’t expose those signals to a background extension. All I had was cumulative screen time.

I could have shipped it anyway — picked a state, shown a confident label, made the demo look finished. Instead I asked what I could honestly claim from the signal I actually had. The answer was: almost nothing.

So detection moved to where the data exists. The background extension sends a neutral cue with no state claim — it never claims which specific app caused the drift. When the user taps in, the app foregrounds and runs the full engine against real data. Less impressive in a screenshot. Honest in use.

Writing a guess down as a guess

The drift threshold is eighteen minutes. That number is a product bet, not a measured finding, and it is documented as one in the code.

Whoever works on this next should be able to tell which numbers came from evidence and which came from judgment. Most products lose that distinction inside a year, and then defend the guess as though it were data.

Designing something that can be ignored

Quiet hours. Mute after three declines in a day. Tapering that stops asking wherever the user keeps saying keep going.

A product measuring success by being needed less has to be able to withdraw. The suppression logic got the same attention as the cue logic.

What I cut

Streaks. Scores. Badges. Comparison against other users. Any notification that competes for attention rather than returning it.

Each was easy to build. Each would have made the product measurably stickier. That is precisely why none of them shipped.

06
Impact

Shipped solo, end to end: philosophy, discovery, UX, SwiftUI implementation, App Store release. No team, no external dependencies, no data collection.

A private beta ran before public release to validate the Declare → Stay → Recover → Reflect loop in daily use. The loop held. What changed was narrower: intent inputs needed restyling for Cyrillic, and the language around cues was tightened again after seeing how it read in the moment.

Live on the App Store. Free, no account, nothing to cancel.

Since release on 27 July 2026, through 9 September: 158 App Store impressions, 47 product page views, 11 first-time downloads. Small numbers, shown rather than omitted.

The honest limitation

It’s early. There isn’t yet enough usage history to claim the core hypothesis has been demonstrated: that people need this less over time. That is the measurement the next version is built to support.

Apple’s own retention panel still reads Not Enough Data. That is the honest status of the hypothesis, not a placeholder I’m working around.

Stating it here for the same reason the eighteen-minute threshold is marked as a bet in the code — a product about honest claims should not make a dishonest one about itself.

Details
Mobile · iOS
2026
Founder & Builder
Swift, SwiftUI, Screen Time API, DeviceActivity, WidgetKit
Solo — concept, philosophy, UX, code, release