Touchward app icon: glowing blue and violet ripples around a bright center

Touchward

Touch. Reward.

You did the thing. Open the app, tap the button, and get a little buzz back. Hold it down for a bigger one when the timer is up.

One-time purchase. No sign up. No in-app purchases.

Buy once, own itPaid up front on the App Store or Google Play. No subscription, nothing to unlock later.
No accountNothing to sign up for. Settings and your tap count live on your phone and nowhere else.
Real hapticsUses your phone's built-in vibration motor. Pick a reward mode, a pattern, a shape, and the colors you like.

Open source

The whole app is public

Touchward is released under the MIT License. Read it, build it yourself, or send a fix. The store versions are the same code, built with Expo Application Services.

View the code on GitHub

Built with

  • Expo SDK 57, React Native 0.86, React 19, TypeScript
  • expo-haptics for iOS impacts and React Native Vibration for timed Android patterns
  • react-native-pulsar (Software Mansion's Pulsar, on iOS Core Haptics and Android VibrationEffect) for composed patterns, a strength setting, and 151 presets in store builds, with react-native-worklets as its peer
  • react-native-svg for the shapes, the ripples, and the hold timer ring
  • expo-notifications for reminders and calendar nudges scheduled on the phone, expo-calendar and expo-background-task to find event ends
  • expo-linking for the touchward://reward link, so a Shortcut, the Action Button, Back Tap, or a button remapper can fire a tap
  • react-native-volume-manager so the volume buttons can count as taps while the app is open
  • @react-native-async-storage/async-storage for settings, saved looks, and the counter
  • expo-font with Josefin Sans and Nunito Sans bundled in the app, so no font is fetched at runtime
  • A SwiftUI Apple Watch companion, built into the iOS app with @bacons/apple-targets

How the code is laid out

App.tsx
Fonts, splash screen, providers, and the root screen.
src/types.ts
The settings model, option lists, and defaults.
src/store/
Settings, counter, and saved-look persistence, with validation of anything read back.
src/design/
The neon palette and color math, the themes, and the typography helpers.
src/button/
Everything that draws the button: shape outlines, the glowing core, ripples in flight, the standing rings, the timer ring, each reward mode's motion and haptic, and the press handling that ties them together.
src/haptics/
Built-in pulse patterns, the lazy Pulsar adapter, and the engine that prefers a Pulsar preset, then a Pulsar pattern, then the built-in pulses.
src/notifications/
Scheduled reminders, calendar nudges and their background refresh, and push registration.
src/hardware/
Turns volume button presses into taps.
src/screens/
The home screen, where every external trigger is routed into the button, the support form, the Customize sheet, and the look library.
src/support/
The crash handler and the support form sender, each with an offline queue.
modules/watch-sync/
Local Expo module that mirrors settings to the watch and reports its rewards.
targets/watch/
The SwiftUI watch app.