Inspiration

Nudge began in the middle of the night with a very ordinary thought: I should drink more water.

I could set alarms, but then I would have alarms—noise, banners, snoozing, clearing, and one more thing demanding attention. What I actually wanted was much smaller: a vibration I had already decided meant “drink some water.” It would happen once and disappear. No screen required. Nothing to acknowledge.

That immediately suggested something much broader than hydration. The same private cue could mean check your posture, relax your jaw, take a breath, look away from the screen, notice the passage of time, prepare to transition, redirect your attention, or remember any small intention that does not deserve an alarm. Nudge does not decide what the cue means. The person does.

I work in behavioral health and am completing a master’s degree in clinical mental health counseling, so I also saw potential for people who benefit from discreet, low-demand support with attention, pacing, awareness, or routines. Nudge is not a treatment and makes no clinical claims. It is a flexible personal tool: a quiet haptic language between a person and the devices they already wear and carry.

What it does

Nudge is a wearable-first Android application for creating recurring, personal haptic cues. The phone is the complete authoring and control surface; a paired Wear OS watch is the intended primary cue surface. Phone delivery remains available for people who prefer it or do not have a watch.

A user can:

  • Name a Nudge and choose an icon so its private meaning is easy to recognize.
  • Choose a built-in vibration pattern or create a custom one by tapping and holding a recording pad. The resulting pulses and gaps appear on a visual timeline and can also be adjusted with accessible controls.
  • Set any recurring interval from 10 minutes through 24 hours, choose active weekdays, and choose the hours during which that Nudge is allowed to run—including windows that cross midnight.
  • Send the cue to the phone or an enrolled watch without silently switching devices when the chosen destination is unavailable.
  • Use Quick Nudge for a one-off cue, Pause all Nudges for a chosen duration or indefinitely, and Resume immediately.
  • Optionally pause an individual saved Nudge when Do Not Disturb is active on the device that will execute it.
  • Optionally use selected calendar Busy intervals as a private “Skip while busy” boundary. Event titles, descriptions, attendees, and locations are not stored in Nudge history or sent to the watch.
  • Review a passive history of what the software actually observed: requested, suppressed, skipped, or failed. Nudge never claims that a vibration was felt or that a person completed a task.

Once a compatible watch has received and acknowledged its schedule, it owns those assigned cues and can execute them from local state without a live phone connection. The watch stays intentionally focused: next cue, Test, Quick Nudge, Pause or Resume, status, recovery, and a privacy-preserving Tile. Full editing remains on the larger phone screen.

The core experience is local-first. It requires no account, custom backend, advertising SDK, analytics service, or internet connection. Nudge is deliberately not a task manager, habit score, notification queue, or alarm clock. The cue happens, carries the meaning the user assigned to it, and is gone.

How we built it

The coincidentally idea came about during Build Week, but I wasn't aware of it. I read about the event a couple of days before the submission deadline, and I decided to go for it. During the event, Nudge went from an unscaffolded repository to a native paired phone-and-watch application.

The project is written in Kotlin with Jetpack Compose and Material 3. It has three deliberate modules: an adaptive Android phone application, a Wear OS application and Tile, and an Android-free core containing deterministic scheduling, suppression, collision, ownership, protocol, and entitlement policy. Room provides durable local storage on both devices; DataStore holds bounded preferences; and the Wearable Data Layer carries a versioned, validated execution projection from the phone to the watch.

The difficult part was not merely sending data between two screens. Nudge has to keep exactly one execution owner for each cue, survive process death, reboot, time and time-zone changes, recover after transport loss, avoid duplicates and burst replays, and tell the truth when Android or a device prevents a haptic request. The implementation therefore treats authoring, synchronization, scheduling, execution, and observed history as separate responsibilities.

I used Codex with GPT-5.6 as the implementation partner for the entire build. I broke the work into bounded Goals so each stage had its own acceptance gate: project foundation, deterministic core and persistence, phone/watch transport and ownership, scheduling and haptic request paths, product flows, correction, visual acceptance, and release hardening. Codex created and revised the Kotlin and Compose implementation, Room schemas and migrations, the phone/watch protocol, test harnesses, emulator workflows, and documentation. It also captured screenshots across compact and expanded phone layouts plus round and square Wear layouts, inspected those captures, and iterated on defects instead of assuming that compiled UI was good UI.

My role was product direction and acceptance. I defined the central promise, decided that the watch—not the phone—was the intended cue surface, rejected conventional alarm and notification behavior, required flexible intervals and per-Nudge active hours, replaced a mechanical pattern editor with tap-and-hold creation, corrected Free and Plus boundaries, removed unfinished feature advertising, and repeatedly sent the implementation back when model assumptions did not match the product. Put simply: I overcame model problems and let the models overcome code problems.

The resulting proof is layered. Independent core tests cover schedule, daylight-saving, suppression, ownership, collision, and recovery contracts. Room migration tests exercise real Android databases. Compose semantics and instrumentation tests exercise the named phone and Wear images. Paired emulator probes verify reciprocal discovery, durable watch activation, exclusive ownership, and disconnected local execution. Deliberately seeded faults confirm that key tests fail for the intended reason before the faults are removed. Visual review covers compact, expanded, foldable, round, square, light, dark, large-text, localized, and right-to-left states.

Challenges we ran into

The first challenge was preserving an unusual interaction model. Familiar reminder products create banners, alarms, acknowledgements, completion states, streaks, and backlogs. Those patterns are easy for an agent to reproduce and exactly what Nudge is trying to avoid. I had to keep pulling the implementation back to one quiet cue with no administrative aftermath.

The second challenge was making a wearable-first product reliable without making the watch a tiny phone app. Authoring belongs on the phone, but watch-owned cues must remain locally executable after synchronization. That required a durable, versioned handoff with one owner, explicit acknowledgement, replay protection, recovery, and no silent phone fallback.

The third challenge was proving an interaction whose most important output is invisible. An emulator can prove the configured flow, platform request, durable state, and history record, but it cannot prove that a person felt a vibration or that a pattern is comfortable. I kept those boundaries explicit instead of turning a screenshot or green test into a physical claim.

The final challenge was time. The implementation, product correction, accessibility work, adaptive layouts, emulator matrices, and consumer-language pass all happened under a two-day delivery window. Goal-based Codex sessions kept that speed from becoming one enormous, unreviewable change.

Accomplishments that we’re proud of

  • Turning a middle-of-the-night idea into a coherent paired Android and Wear OS product in roughly two days.
  • Building a custom Pattern Studio that lets a person create a tactile phrase by feel instead of programming milliseconds and gaps.
  • Keeping complete authoring on the phone while allowing acknowledged watch schedules to execute locally through ordinary disconnection.
  • Designing one simple mechanism for many meanings: hydration, posture, breathing, screen breaks, focus, pacing, transitions, routines, and private cues only the wearer needs to understand.
  • Preserving a local-first, no-account core with no custom backend, ads, or analytics.
  • Using Codex at high speed while retaining human authority over the product’s meaning, scope, language, design, and acceptance.
  • Treating accessibility, recovery, migrations, negative cases, and visual iteration as part of the product rather than afterthoughts.

What we learned

AI-assisted development does not reduce the need for product judgment; it increases it. Models can solve code problems at remarkable speed, but they also move quickly toward familiar solutions. Someone still has to recognize when the familiar solution is the wrong product.

I also learned that a good agent workflow needs explicit boundaries and independent proof. Small Goals, focused commits, tests that can detect a deliberately introduced defect, screenshot-and-correction loops, and a written product authority made it possible to change direction without losing coherence.

Most of all, I learned that “less interruption” can require substantial engineering. The final interaction is tiny by design. Making it quiet, durable, private, truthful, and wearable-first is the real work.

What's next for Nudge

The immediate next step is physical-device validation: tuning the provisional pattern limits on real actuators, evaluating perceived comfort, observing OEM power behavior, and testing real phone-to-watch connectivity across hardware. Live Google Play purchase, restoration, and subscription lifecycle testing will follow in an authorized Play environment.

After that, I want to broaden the built-in haptic vocabulary, continue human accessibility and usability testing, refine onboarding from real user observation, and explore how people use private cues in daily life without turning Nudge into a prescriptive tracker or clinical product.

Built With

  • android
  • android-room
  • android-studio
  • androidx-datastore
  • androidx-workmanager
  • google-play-billing
  • google-play-services-for-wear-os
  • gpt-5.6
  • gradle
  • jetpack-compose
  • kotlin
  • material-3
  • openai-codex
  • vscode
  • wear-os
Share this project:

Updates