Inspiration

We've all been there you sit down to work, and two hours later you're deep in a TikTok rabbit hole with no memory of how you got there. Screen time apps tell you after the damage is done. We wanted something that actually interrupts the loop in the moment not a report, but a real intervention. Pause was born from the frustration of knowing you're distracted and still not being able to stop.

What it does

Pause is a macOS background companion that watches your app usage in real time. When you enter Focus Mode, it tracks which apps you're in and for how long. The moment you drift into a distracting app Instagram, TikTok, YouTube, Reddit and exceed your personal threshold, Pause steps in with a screen overlay and a voice line telling you to get back on track.

How we built it

macOS Swift app runs in the background, monitors active windows, syncs events to the backend via a device token Node.js + Express backend handles event ingestion, stats aggregation, and config storage; runs on Node 22 using the native node:sqlite module (no ORM needed) SQLite database append-only event log with indexed queries for fast stat rollups per user and time period Auth0 JWT-based authentication for the web dashboard; device token auth for the Swift app Voice layer intervention lines delivered via the system voice at severity-scaled intensity Dev dashboard a vanilla JS dashboard served directly from the API for testing without the Swift app; lets you simulate sessions, trigger interventions, and tune thresholds live

Challenges we ran into

Window tracking on macOS getting reliable app name + window title without accessibility permission prompts required navigating several macOS API constraints Avoiding false positives a 2-second YouTube visit shouldn't trigger an intervention; tuning the per-category thresholds and idle detection to feel natural took real iteration Voice timing the intervention overlay and the voice line needed to land simultaneously; async race conditions between the screen and audio layer were trickier than expected SQLite in Node 22 the built-in node:sqlite module is newer and has some rough edges around named parameter handling that required workarounds in the query layer

Accomplishments that we're proud of

The win rate metric framing "did you resist the intervention?" as a score turned a nagging app into something that actually feels like a game worth winning The three-vibe system worked better than we expected. Sassy mode in particular got real laughs and real compliance during testing A fully working backend + dashboard + Swift integration within the hackathon window, with real data flowing end to end The dev dashboard let us demo and test without needing the Swift app running huge time saver during the build

What we learned

Behavior change tools only work if they're inconvenient at the right moment the intervention has to actually interrupt you, not just notify you Tone matters more than content. People respond to a sassy roast faster than a gentle nudge because it breaks the scroll trance with surprise SQLite is genuinely production-worthy for per-user event logging at this scale no Postgres, no Docker compose, just a file and fast indexed queries

What's next for Pause

Existential gate a harder intervention that requires you to answer a reflective question before you can continue using a distracting app. So that could be next after this.

Share this project:

Updates