Inspiration
Bad desk habits — slouching, biting your nails, sitting for hours without standing — sneak up on everyone, especially mid-hackathon. We wanted something that notices the moment it happens instead of a wellness app you check once a day and forget about. We also didn't want to build nag-ware, so we built the whole thing around a pet that reacts honestly to how you're actually doing.
What it does
Kelp watches you through your webcam while you work, tracking posture (slouching, leaning), nail-biting, and how long you've been sitting, and reacts immediately: toast notifications for small habits, and a genuinely hard-to-ignore popup window — independent of the main app, appears even if Kelp is minimized to the tray — when you've been sitting too long. Everything you do feeds a virtual sea lion on your dashboard: stay on top of your stand breaks and keep your hands off your face, and it stays happy; ignore enough alerts or bite your nails too often, and it visibly gets sadder (healthy → sad → very sad). Your dashboard tracks daily progress bars for stand compliance, bad habits, and streaks, with goals you configure yourself. Everything runs as a self-contained desktop app — no account, no cloud. Your webcam feed and your habit data never leave your machine.
How we built it
Frontend: React + Tailwind inside Electron, so detection keeps running in the background, with a system tray icon and a stand-alert popup window that's independent of the main window. Vision: MediaPipe Tasks Vision (Face Landmarker, Hand Landmarker, Pose Landmarker) running entirely on-device, all three detectors sharing a single webcam stream. Storage: SQLite via Node's built-in node:sqlite, running in Electron's main process and exposed to the UI over IPC — no server, no native module to compile for packaging. We started as a Chrome extension, pivoted to a Supabase-backed web app, and landed on a local-first Electron desktop app once it was clear that "runs constantly in the background, watches your webcam" fits a real app far better than a browser tab.
Challenges we ran into
Keeping detection alive when the window isn't focused: Electron throttles backgrounded renderers by default, and our stand reminders needed to fire even while hidden in the tray — we disabled background throttling and built real OS-level popup windows over IPC instead of relying on in-page toasts. Parallel development, same files: we were building the vision pipeline, the habit/streak backend, and the posture UI at the same time, and more than once two of us touched the same screen or the same stand-alert logic with different intentions. Reconciling that without quietly dropping someone's feature took real care. A subtle schema bug: we used CREATE TABLE IF NOT EXISTS, which is a no-op against a database that already exists — so columns we added mid-hackathon (goals, pet-health counters) silently never landed on anyone's actual local file. Chasing that down (and then discovering Electron's main process doesn't hot-reload, so a long-running dev session kept using the old code even after the fix) taught us to treat local persistence as something that needs real migrations, even in a weekend project.
Accomplishments that we're proud of
A stand alert that actually works like a stand alert — a real, independent, always-on-top popup, not a toast you can scroll past. A fully local, privacy-respecting pipeline: three MediaPipe models sharing one webcam feed, all inference on-device, nothing ever uploaded.
Log in or sign up for Devpost to join the conversation.