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.
Built with
- Expo SDK 57, React Native 0.86, React 19, TypeScript
expo-hapticsfor iOS impacts and React NativeVibrationfor timed Android patternsreact-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, withreact-native-workletsas its peerreact-native-svgfor the shapes, the ripples, and the hold timer ringexpo-notificationsfor reminders and calendar nudges scheduled on the phone,expo-calendarandexpo-background-taskto find event endsexpo-linkingfor thetouchward://rewardlink, so a Shortcut, the Action Button, Back Tap, or a button remapper can fire a tapreact-native-volume-managerso the volume buttons can count as taps while the app is open@react-native-async-storage/async-storagefor settings, saved looks, and the counterexpo-fontwith 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.