Inspiration
Standard productivity apps are useless because they ask nicely. When a UCF student has an 8 AM lecture or a 10-minute sprint from MSB to CB1 in the Florida heat, it is incredibly easy to hit snooze, tell themselves "I'll just watch the lecture recording," and flake attending your class. Gentle push notifications are instantly swiped away.
We realized that true utility doesn't come from polite reminders, but from fear and consequences. To solve the attendance crisis, we built Dandruff: an accountability app that doesn't just remind you to go to class, but actively takes your phone hostage if you don't.
What it does
Dandruff is the ultimate hostile productivity tool. Users onboard by simply uploading a screenshot of their UCF class schedule. Our backend processes the image, extracts the class times and locations, and maps them to exact GPS coordinates on the UCF campus.
When class time hits, Dandruff checks the user's live location. If they are still in their dorm bed instead of their lecture hall, Dandruff triggers "Lockdown Mode." It constantly throws up an un-dismissible alert (with cringey and embarrassing notification sounds) and blocks access to all distracting apps (like Instagram and TikTok). The only way to unlock the phone and restore access to their digital life is to physically travel to their designated UCF building so the GPS distance threshold clears.
How we built it
We engineered a highly aggressive user experience backed by a sophisticated data pipeline:
Frontend: We built the mobile application using React Native and Expo, utilizing expo-location for background geographic monitoring and expo-router for file-based navigation.
AI Data Extraction: To make onboarding frictionless, we integrated the Gemini 2.5 Flash API. Users upload a messy screenshot of their schedule, and Gemini acts as a vision agent to extract weekly meetings, start/end times, and raw building codes into structured JSON data.
Custom Geocoding Pipeline: Raw text doesn't give us spatial data. We wrote a custom geocoding algorithm in Node.js that takes the AI-extracted building codes, normalizes the text, and fuzzy-matches it against a hardcoded JSON registry of exact UCF campus coordinates.
Challenges we ran into
Our biggest roadblock wasn't the AI or the geocoding, it was Apple's iOS sandboxing. As iPhone users without a $99 Apple Developer Subscription, we were restricted from deploying the true, administrative-level malware we originally envisioned. We were blocked from using custom blaring siren sounds, system-wide app restrictions, and un-killable background processes. We had to creatively engineer our "Lockdown Mode" within Expo's local limitations to simulate this hostile device takeover. With even just one Android mobile device, we maybe could have been able to demonstrate an app closer to the initial product we had envisioned.
Additionally, translating messy, unstructured visual data (a screenshot of a UCF daily schedule) into strict spatial and temporal coordinates was incredibly difficult. We had to heavily prompt our Gemini implementation to ignore irrelevant data and isolate exact building codes. Building a reliable location-tracking threshold that accounts for UCF's massive campus layout without draining the user's battery also required strict fine-tuning.
Accomplishments that we're proud of
We successfully engineered a seamless pipeline that takes a user from a raw screenshot to a fully mapped, GPS-enforced lockdown state in seconds. Even without administrative iOS privileges, we managed to build a terrifyingly effective proof-of-concept for cyberbullying college students into getting their degrees.
What we learned
We learned how to effectively integrate Gemini's multimodal capabilities into a Node.js backend, how to manage state and background location permissions in Expo, and how to creatively bypass OS-level restrictions to design a hostile user experience.
What's next for Dandruff
Currently, the app maps to UCF's main campus, but we want to scale our geocoding algorithm to support any university campus. Most importantly, we plan to acquire an Apple Developer account so we can bypass current sandboxing limitations, allowing us to deploy system-level app blocking and custom, un-mutable alarm sounds. We also plan to integrate a "shame" feature that automatically texts your mother or maybe even your ex if you flake on the same class three times in a row.
Built With
- expo-location
- expo-router
- expo.io
- gemini-2.5-flash
- javascript
- node.js
- react-native
- rest-api
- typescript
Log in or sign up for Devpost to join the conversation.