project 05
FocusPulse
An Android application that analyses attention and focus during work sessions through camera data. All processing happens on the device; the image never leaves it.
- Category
- Mobile
- Role
- Solo developer — Android and edge AI
- Year
- 2026
technologies used
- Kotlin
- Android
- ML Kit
- TensorFlow Lite
- Python
- OpenCV
problem
Problem
Loss of focus and fatigue during remote work and long sessions cannot be tracked objectively. Most existing solutions send the camera feed to the cloud — asking the user to give up their privacy in order to be monitored.
solution
Solution
I developed an Android application that analyses blink frequency, head pose and gaze direction entirely on the device. I prototyped the model side in Python and OpenCV, then converted it to TFLite; the app runs those lightweight models locally. The signals are turned into a live distraction index, which drives dynamic break suggestions.
outcome
Outcome
The result is a working Android application that never lets the user's image leave the device, computes a live focus index and produces break feedback.
key features
- 01Distraction detection through blink frequency, head pose estimation and gaze direction tracking.
- 02On-device image processing architecture computing a live distraction index.
- 03Low-latency inference using models converted to the TFLite format.
- 04Dynamic break suggestions and alert feedback.
- 05Data is processed entirely locally, never reaching any server.
why these choices
Why on-device inference instead of the cloud?
Cloud-based vision APIs offer stronger models but contradict the purpose of the system: in an application that watches someone continuously while they work, sending the image to the cloud is unacceptable. Lightweight on-device inference removed that problem entirely and eliminated network dependency.
Why was the model built in Python but the app in Kotlin?
For model experimentation and validation, the Python ecosystem is incomparably faster. But the final product was going to be an Android application; converting the model to TFLite and running it from Kotlin gave native performance without slowing development.
Why behavioural signals instead of direct classification?
Rather than a single "focused / distracted" classification, I chose to measure separate signals — blinking, head pose, gaze direction — and derive an index from them. That kept the result explainable: the user can see why they were alerted.