Cross-platform alarm app focused on Android and Windows.
- Behaves like a normal alarm app first (create/edit/toggle/delete alarms).
- Supports secure remote alarm triggers for Verint workflow integration.
- Avoids using ADB as a production transport.
- Alarm domain model + local JSON persistence.
- Polished tabbed UX:
Alarmstab (create/edit/delete/toggle/test-now)Historytab (activity timeline + clear)Settingstab (global snooze, auto-stop timeout, 24h format)
- Per-alarm snooze override editable in alarm editor.
- Next-alarm and upcoming alarms cards.
- Android native scheduling via local notifications:
- exact allow-while-idle scheduling
- recurring day-of-week alarms
- auto-sync of schedules when alarms change
- permission request action in settings
- Windows background scheduling via Task Scheduler:
- creates per-alarm scheduled tasks (
schtasks) - launches app with
--trigger-alarm-id=<id>at alarm time - one-time alarms auto-disable after triggered launch
- creates per-alarm scheduled tasks (
- Windows active alarm attention:
- looping bundled alarm sound (
assets/sounds/alarm_loop.wav) while alarm is active - restores/focuses app window and keeps it on top during active ring
- looping bundled alarm sound (
- Active ringing overlay with:
- dismiss
- configurable snooze
- configurable auto-stop timeout
Disable all alarmsquick action.- Security primitives for remote trigger verification:
- HMAC-SHA256 signature validation
- request timestamp skew check
- nonce replay protection
- Remote trigger handler that maps verified remote events into local alarms.
- Remote payload parsing layer (
Map<String,dynamic>-> typed trigger). - Local fail-safe foundation:
- persistent paired devices registry
- persistent source->target route rules
- timeout-trigger hook from alarm engine
- real local LAN receiver endpoint (
/failsafe/trigger) with signed payload verification - local LAN discovery via UDP broadcast (
Discover on LAN) - route test dispatch over HTTP on local network
- interactive
Fail-safetab for setup/pair/test/logs (no CLI required)
- Windows Verint Schedule Bridge (extension-free):
- local loopback endpoint:
http://127.0.0.1:38941/verint/schedule - imports schedule payload into
[Verint]alarms - replaces previous browser extension dependency for schedule ingest
- includes bookmarklet generation in Settings tab
- local loopback endpoint:
This phase completes app-level alarm behavior and UX flow.
Windows scheduling note:
- Best reliability is with packaged runner executable builds.
- During
flutter rundebug sessions, Task Scheduler launch behavior can vary by environment.
{
"event_type": "panic",
"status_text": "Door forced",
"scheduled_at_ms": 1730000000000,
"timeout_at_ms": 1730000600000,
"timestamp_ms": 1730000001000,
"nonce": "d1f6b9...",
"signature": "hex_hmac_sha256"
}Signature canonical string:
event_type|status_text|scheduled_at_ms|timeout_at_ms|timestamp_ms|nonce- Use local Windows Verint Schedule Bridge (no browser extension).
- Backend API as source of truth and security boundary.
- Android receives signed trigger events via FCM data messages.
- Windows app communicates with backend for schedule/status/history.
- Keep ADB bridge only for local/dev fallback.
flutter pub get
flutter run -d windowsAndroid:
flutter run -d android- Set a release version/build in
pubspec.yaml. - Configure Android signing:
- Copy
android/key.properties.exampletoandroid/key.properties. - Fill
storeFile,storePassword,keyAlias, andkeyPasswordwith real release keystore values.
- Copy
- Build beta artifacts:
- Android App Bundle:
flutter build appbundle --release - Android APK:
flutter build apk --release
- Android App Bundle:
- iOS/TestFlight (on macOS with Xcode):
flutter build ipa --release
- Run validation before publishing:
flutter analyzeflutter test
This repo includes an automated release workflow at .github/workflows/release.yml.
- Trigger: push a tag that starts with
v(for examplev1.0.1). - Output artifacts:
NeverMissAlarm-android-<tag>.apkNeverMissAlarm-windows-<tag>.zip
- Release: artifacts are attached to a GitHub Release automatically.
Android signing in GitHub Actions:
- Add repository secrets:
ANDROID_KEYSTORE_BASE64(base64 of your.keystorefile)ANDROID_STORE_PASSWORDANDROID_KEY_ALIASANDROID_KEY_PASSWORD
- If these are missing, workflow falls back to a debug APK.
Local helper to generate release signing material:
powershell -ExecutionPolicy Bypass -File tools/setup_android_signing.ps1This creates:
android/release.keystoreandroid/key.propertiesandroid/github_actions_secrets.txt(copy values into GitHub secrets)android/release_signing_credentials.txt(backup locally, do not share)
Create and push a release tag:
git tag v1.0.1
git push origin v1.0.1