Inspiration
Burnout never announces itself. It doesn't show up one morning as a clear, nameable feeling — it builds invisibly over days and weeks through patterns that feel completely normal in the moment: one more browser tab, one more hour past midnight, one more loop of switching between apps without finishing anything. By the time you consciously recognize you're burning out, you're already deep inside it.
We kept noticing this in ourselves, and the analogy that stuck was the car dashboard. Your car doesn't wait for you to feel that the engine is failing — a light comes on long before. But for our own minds, we had nothing. Every wellness tool we tried fell into one of two traps. It either demanded active self-reporting — the cheerful "How are you feeling today?" prompt that nobody fills in honestly, least of all when they're spiraling — or it was a clinical intervention that arrives far too late to prevent anything. There was no passive, ambient system that detects burnout early using the behavioral data our devices already produce every second, so we set out to build one. The name Custod comes from custodian: a guardian that watches over you quietly, without interruption, and only speaks up when something is actually wrong.
What It Does
Custod is a privacy-first, multi-platform burnout detection system that reads invisible stress signals from your browser, computer, phone, and physical environment simultaneously. It fuses all of those signals through a machine-learning scoring engine and delivers a single real-time burnout status — green, yellow, or red — across every device you own, including a physical ambient light that sits on your desk. It is not a mental health chatbot, it is not therapy, and it does not read your messages, your emails, or your thoughts. Instead it watches the patterns your devices already produce when you're stressed — tab chaos, late-night sessions, declining heart-rate variability, hunched posture, fragmented focus — and tells you what those patterns mean before you recognize them yourself.
The system runs as four interconnected components, each watching a different slice of your day. A Chrome extension tracks tab count, switch rate, distraction-tab ratio, stress-keyword searches, unbroken session length, a "spiral mode" flag, late-night activity, and frustration events detected from rapid backspacing. A macOS app lives in the menu bar, measuring work-app focus percentage, session duration, late-night usage, and blink-rate fatigue captured through the camera using Apple's Vision framework. An iOS app reads physiological signals — heart-rate variability against a 30-day personal baseline, sleep efficiency, and phone pickups per hour — and surfaces the live score through a home-screen widget and push alerts. Finally, an Arduino device on your desk reads room temperature, posture and proximity, and ambient light, then expresses the verdict physically through an RGB LED and a buzzer.
All four components sync through a central Supabase cloud hub. Every five minutes each one sends a feature vector to the scoring engine, which returns a score from 0 to 100, the top contributing triggers, and a suggested micro-intervention, and that result propagates instantly to every connected device. The clearest way to picture it is the demo. You open a browser with thirty tabs and switch between them rapidly for two minutes, then search "deadline extension." The Chrome badge turns red, the macOS menu-bar brain turns red, your phone buzzes, and the LED on your desk flashes red three times and holds while a chime sounds. A message appears — "You're not working, you're spiraling. Pick one tab." — and tapping it opens a three-minute breathing timer. When it ends, the LED fades back to green. That's Custod.
How We Built It
At its core, Custod is four clients and one brain. The brain is a TensorFlow Lite model running as a Supabase Edge Function, which ingests a twenty-feature vector drawn from all four components and returns a burnout score S∈[0,100]S \in [0, 100] S∈[0,100] along with a confidence value and trigger attribution. We trained it on synthetically generated, labeled data spanning green, yellow, and red states across a wide range of behavioral profiles, and we shipped a rule-based local fallback so the system still works fully offline if the Edge Function is ever unreachable.
The physiological signals required careful, personalized math rather than blunt thresholds. For heart-rate variability we compare against each user's own thirty-day rolling baseline, computing the relative deviation
ΔHRV=HRVcurrent−HRVbaselineHRVbaseline\Delta_{\text{HRV}} = \frac{\text{HRV}{\text{current}} - \text{HRV}{\text{baseline}}}{\text{HRV}{\text{baseline}}}ΔHRV=HRVbaselineHRVcurrent−HRVbaseline and flagging a direct stress signal whenever ΔHRV<−0.15\Delta{\text{HRV}} < -0.15 ΔHRV<−0.15, a drop of more than fifteen percent. For screen fatigue on macOS we sample one camera frame every five seconds, locate facial landmarks with the Vision framework, and compute the Eye Aspect Ratio
EAR=∥p2−p6∥+∥p3−p5∥2 ∥p1−p4∥\text{EAR} = \frac{\lVert p_2 - p_6 \rVert + \lVert p_3 - p_5 \rVert}{2\,\lVert p_1 - p_4 \rVert}EAR=2∥p1−p4∥∥p2−p6∥+∥p3−p5∥ registering a blink when the EAR drops below threshold and recovers, then flagging fatigue when the rate falls below the typical fifteen blinks per minute. Crucially, no video is ever stored — each frame becomes a single number and is discarded immediately.
Connecting the hardware took its own approach, because the Elegoo Uno R3 has no WiFi module. We made the macOS app act as a serial bridge over USB, relaying scores from Supabase to the desk LED in real time, with a thermistor reading temperature, an HC-SR04 ultrasonic sensor estimating posture and proximity, and a photoresistor catching dark-room late-night work. The full stack spanned a Manifest V3 Chrome extension in vanilla JavaScript, a macOS app in SwiftUI with AppKit, Vision, AVFoundation, and Combine, an iOS app using SwiftUI, HealthKit, CoreMotion, and WidgetKit, Arduino C++ on the hardware, and Supabase providing Postgres, Edge Functions, Realtime, and REST. We kept the codebase clean across four Git branches, with only two strings to swap per deployment: the Supabase URL and the anon key.
Challenges We Faced
The hardest problem was never any single client — it was getting a Chrome extension, a macOS app, an iPhone, and a microcontroller to share one coherent truth in real time. Supabase Realtime became the spine of the system: every client subscribes to score updates, so a red event triggered by the browser lights up the desk LED a moment later. Wiring up the hardware compounded this, since the Arduino can't reach the cloud on its own. Treating the macOS app as a USB serial bridge solved it without forcing us to add a WiFi shield, but building two-way serial communication that survived the Mac sleeping and waking took real debugging.
Camera-based fatigue detection sounded invasive until we realized the privacy design is the feature, and tuning the Eye Aspect Ratio threshold to work across different lighting conditions and glasses — while guaranteeing every frame is discarded within milliseconds — was a careful balance of accuracy and trust. We also had to teach the system to tell focus apart from spiraling, since rapid tab switching can mean deep, productive research just as easily as a stress loop. We defined spiral mode as sustained switching faster than once every twelve seconds, combined it with frustration events and stress-keyword searches, and let the model weigh those together rather than relying on any single rule. Underlying all of it was a subtler challenge: a burnout detector that nags you becomes its own kind of stressor, so we had to make Custod silent by default, surfacing only a calm color and, when it truly matters, one specific and actionable nudge.
What We Learned
The biggest lesson was that privacy isn't a constraint on the product — it is the product. The moments where we chose the more privacy-preserving path, like discarding camera frames, never reading page content, and storing data in the user's own Supabase project, were also the moments that made Custod trustworthy enough to actually live in someone's background. Closely related, we learned that relative baselines beat absolute thresholds: human signals like HRV are meaningless in the abstract and only mean something relative to you, so personalization turned out to be the difference between noise and signal rather than a nice-to-have.
We also learned that the interesting signal lives in the fusion. No single component is a reliable burnout detector — tab chaos alone is just a busy day — but tab chaos plus a seventeen-percent HRV drop plus a dark room at one in the morning plus a collapsing blink rate is a story, and only a system watching all of them at once can read it. Finally, we learned that ambient beats interruptive. The most powerful interface we built was a single LED that quietly changes color; it demands nothing, yet it tells you everything.
What's Next
The next step is replacing synthetic training data with consented real-world data to sharpen the model, followed by Android and Windows clients to widen coverage. We want to ship the Arduino bridge as a tiny standalone WiFi device so it no longer depends on the Mac, and to let users tune their own intervention messages and thresholds. The goal stays exactly what it was at the start: make the invisible visible, and catch burnout while it's still preventable.
Log in or sign up for Devpost to join the conversation.