Local-first Android hydration reminders that remain noticeable on silent phones. Siploop combines exact alarms, a full-screen grace countdown, smart suppression, local history, and one responsive home-screen widget.
Important
Siploop is an early-stage personal project, not a medical device. It is Android-only, unpublished, and distributed without official APK releases. Review the permissions and build the app yourself.
- Exact reminder slots inside a configurable active window
- Full-screen, screen-waking countdown before alarm audio begins
- Alarm-priority vibration and audio that can work in silent/DND modes after Android access is granted
- Manual, timed, face-down, pocket, allowed-area, and allowed-Wi-Fi suppression
- Selectable OR/AND presence rules for area and Wi-Fi checks
- Room/SQLite intake history, progress, trends, backup, CSV export, and restore
- Resizable 1×1-and-up widget with Pause/Resume prioritized at every size
- Dark-only interface with 12-hour times
Siploop has no account, application server, telemetry, advertising, map provider, or cloud sync. Intake history, settings, captured coordinates, and allowed Wi-Fi names remain in the app's Android sandbox. Android backup is disabled.
Development builds use Metro over the network. The production application contains no feature that sends personal data to a remote service. User-initiated backup and CSV exports are plaintext files once shared outside the app; protect them accordingly.
Permissions are requested only for the selected features:
| Access | Purpose |
|---|---|
| Notifications, exact alarms, full-screen intents, wake lock, vibration | Reliable reminders and alarm UX |
| Foreground media playback | Alarm-stream audio while the app is backgrounded |
| Fine/background location | Optional allowed-area checks at reminder time |
| Nearby Wi-Fi and network state | Optional allowed-network checks |
| Boot and time changes | Rebuild reminder schedules after system changes |
See SECURITY.md for vulnerability reporting.
The UI uses Expo SDK 57, React Native, TypeScript, Expo Router, Uniwind, and Hugeicons. A local Kotlin Expo module owns Room/SQLite, exact scheduling, alarm delivery, sensors, presence checks, import/export, and the Android widget so those features work without the React Native runtime.
android/ is generated by Expo Continuous Native Generation and intentionally ignored. Maintained native source lives under modules/siploop-native.
- Node.js 24+
- pnpm 11
- JDK 17
- Android SDK 36
- Android 13+ device or emulator
Expo Go is unsupported because Siploop includes native Android code. Use a development build:
pnpm install --frozen-lockfile
pnpm prebuild
pnpm androidpnpm check
pnpm audit --prod
pnpm exec expo config --type public
pnpm exec expo-modules-autolinking search --platform androidGenerate the Android project, configure a private signing key, then build locally:
pnpm prebuild
cd android
./gradlew assembleRelease -PreactNativeArchitectures=arm64-v8aThe APK is written under android/app/build/outputs/apk/release/. Never commit signing keys or generated APKs. Keep the same private key for future in-place updates. Expo's generated debug signing configuration is suitable only for local testing, not redistribution.
The intended behavior is documented in docs/spec.md, with architectural decisions in docs/adr. Some specification acceptance tests and hardening work remain; contributions should not describe the app as production-ready.
Read CONTRIBUTING.md, keep changes focused, and run all checks before opening a pull request.
