ai mental health companion · flutter, onnx, ml kit
MindHeal
An AI mental-health companion that reads emotion on the device, so nothing personal has to leave the phone.

Overview
Private by construction
On-device intelligence, not a cloud round trip
MindHeal runs emotion recognition locally with ONNX Runtime and Google ML Kit, then wraps the result in mood tracking, journalling and guided support. Because inference happens on the device, the sensitive part of the experience works without shipping a face or a voice to a server.
The problem
Emotion recognition normally means sending a face or a voice to a server. For mental-health support that is exactly the wrong shape: the data most worth protecting is the data the feature needs.
The goal
Run the sensitive part of the experience entirely on the device, and wrap it in something supportive rather than clinical — so the product is useful without asking anyone to trust a server.
How it was built
- 01Discovery
Starting from what must never leave the phone
Mental-health data is the kind you design around, not for. I drew the privacy line first — inference on-device, nothing sensitive synced — and every later decision had to fit inside it.
- 02Development
Fitting a model into a mobile budget
Getting an emotion model to run smoothly inside a Flutter app meant working within a real memory and latency budget: quantised ONNX models, ML Kit for camera-side detection, and inference kept off the UI thread so the interface never blocks while a frame is processed.
- 03Strategy
A companion, not a diagnosis
The product deliberately stays supportive rather than clinical. Model output feeds reflection and tracking, and the copy throughout is careful never to present a prediction as a verdict about the person using it.
Project details
- Role
- Product design and development
- Type
- AI mobile application
- Stack
- Flutter, ONNX Runtime, ML Kit
Key features
- On-device emotion recognition with ONNX Runtime and Google ML Kit
- Camera-side detection that never uploads a frame
- Mood tracking over time
- Journalling and guided support flows
- Copy written to inform reflection, never to deliver a verdict
Challenges
Fitting a model inside a mobile budget
Running inference in a Flutter app meant working within a real memory and latency budget: quantised ONNX models, ML Kit handling camera-side detection, and inference kept off the UI thread so the interface never blocks while a frame is processed.
Staying supportive rather than diagnostic
A model output is a probability, not a fact about a person. The harder problem was linguistic — every string had to present a reading as something to reflect on rather than a conclusion about the user, which constrained the interface as much as the technical budget did.
The Result
A companion app where the AI work happens on the device it belongs to — responsive in the hand, and private without asking the user to trust a server.
What I learned
Drawing the privacy line first — inference on-device, nothing sensitive synced — made every later decision easier, because anything that did not fit inside it was simply not an option. The genuinely hard part was not the model; it was writing copy that stays honest about what a prediction is.
Want something like this built?
Tell me what you have in mind and I will come back with a plan, a timeline and a price.