01
The problem
A wellbeing assistant that forgets everything between sessions cannot
support someone over time.
Most of these assistants are chat windows with no memory. The user
describes their week, gets generic advice, and the next day the
conversation starts again from nothing. That behaviour comes from the way
the product is built: nothing written the week before is available when
the next conversation begins.
What helps is continuity. Noticing that the bad days often land on a
Sunday, remembering the exercise that worked, pointing out that the user
has been doing better for three weeks. None of those observations is
possible without a stored history and a way to hand it to the model.
02
What I built
An agent that has context
Before each conversation, the app assembles a context from the user's own
data: recent mood ratings, journal entries, finished exercises, stated
goals. The agent therefore starts out knowing who it is talking to.
Conversations are kept and titled automatically.
Replies arrive as a stream, word by word, so the user watches the
agent answer instead of waiting in front of a frozen screen.
The audio exercises
Six guided exercises: breathing, grounding, body scan, gratitude, letting
go, energy. They are delivered as high-quality speech rather than text to
read, because a breathing exercise asks you to close your eyes.
The journal and the insights
Daily mood rating, emotion tags, free-form notes, full history. On top of
that: seven- and thirty-day trend charts, averages, and detection of the
good and bad stretches. The same data feeds the agent's context, where it
serves as memory.
One codebase, two platforms
iOS and Android from a single React Native project, with the whole product
journey: navigation, notifications, charts, smooth animations, sharing,
reactive dark mode and subscriptions handled through in-app purchase.
03
What was hard
Assembling the context without blowing it up
Sending everything to the model is impossible, because the journal keeps
growing. You have to decide what to keep: trends rather than raw entries,
recent rather than old, aggregates rather than detail. That selection
happens in the app's own code, before the call to the model.
The limits of a mental health app
The app states its scope plainly: it does not diagnose and it does not
replace a professional. The agent declines to play therapist and points to
real help when a subject goes beyond what software can carry. These
guardrails were defined before a single screen or agent instruction was
written.
Staying smooth on mobile
The response stream, the animations and the charts compete for the same
thread. Animations have to run on the native side, the screen must not
rebuild on every incoming word, and the theme has to stay reactive without
re-rendering the whole component tree on each change.
Selling a subscription without pushing
In-app purchase brings its own rules: purchase restore, entitlement
syncing, free trial, changing devices. On a subject this personal, the
limits of the free version also had to stay legible and never leave the
user uncomfortable.
What I take from it
On this kind of product, the quality of the answers comes mostly from
the data you give the model to read. Building the history, storing it
and choosing what goes into each conversation is more work than the
agent integration itself.