FocusEye
A deep-learning application that classifies attention second-by-second from webcam video into deep, partial and absent states, then accumulates sessions into a history you can compare. The model runs in the browser rather than on a server, so no webcam data leaves the device.

The problem
I wanted to know whether the hours I recorded as studying were hours of attention. Self-reporting cannot answer that — you do not notice yourself losing focus while you are losing it, so the log and the reality drift apart in the one direction you would never catch. The measurement has to be passive and it has to be continuous, which rules out anything that stops to ask the user a question.
What I built
A React and TypeScript dashboard over a Java Spring Boot REST API, with PostgreSQL persistence so focus sessions accumulate into a comparable history instead of vanishing when the tab closes — a single session tells you nothing, and the comparison is the entire point.
CI/CD runs to Azure Container Apps through a GitHub Actions pipeline with a multi-stage Docker build, gated on 100% JUnit coverage, so no merge reaches production without passing the suite.
The interesting decision
I trained a two-layer PyTorch LSTM over sequences of MediaPipe Face Mesh landmarks rather than over independent frames. That is the whole design. A single frame of closed eyes is ambiguous — it could be a blink or it could be someone who stopped working a minute ago — and no classifier reading one frame at a time can tell those apart. A sequence can, because the thing that distinguishes them is duration.
The second decision was where to run it. I exported the trained model to ONNX and ran it in the browser through ONNX Runtime Web rather than streaming landmarks to the backend. Inference is local, so webcam-derived data never crosses the network — which is the difference between a tool someone will leave running and one they will close. A per-second classification loop over a network round trip would also have spent more time in transit than in the model. The cost is that the model has to stay small enough to ship to a browser, which constrained the architecture more than accuracy alone would have.
What I would change
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.