Rust · Tauri · Privacy · ML
Luminh
Local-first desktop app that infers fatigue and brain fog from typing rhythm, cursor motion and app-switching — without ever reading what you type.

Overview
Luminh watches how you use your computer and estimates fatigue, focus and motor stability from it. Typing gets slower and more variable when you are tired, cursor paths get less smooth, and you bounce between windows more. Those signals are real, but they are also exactly the signals a keylogger collects, which is the whole design problem.
So the architecture is driven by one non-negotiable: capture keystroke timing without ever reading text. The capture process classifies each key at the OS hook itself — a CGEventTap on macOS, a low-level hook on Windows — and emits an enum plus a timestamp. The character never exists downstream. Capture runs as a separate privileged sidecar and talks to the main app one way over length-prefixed CBOR on a Unix socket, because capture is the thing holding Accessibility rights and nothing else should. There is a CI script that checks this property, so the privacy guarantee is enforced by the build rather than by my memory.
Above that sits rolling feature extraction in fixed windows, per-user baselines keyed by app and hour using medians and IQR rather than means, and a composite score with a twenty-minute EMA half-life. Scores stay hidden for the first fourteen days because a personal baseline built on a few hours of data is noise. The local model reports fatigue probability, a brain-fog index, psychomotor slowing and recovery readiness, refined online against mood check-ins the user enters by hand.
I also spent real time cutting the product's own claims down. The original spec leaned on webcam eye-tracking and on reading cognitive decline out of typing rhythm. I went through the literature and sorted each biomarker into shippable, directional, or research-only, and dropped webcam gaze from phase one entirely. Written in Rust across eight crates with a Tauri and React shell.