Feature proposal: reliable operation after reboot, plus a "peace of mind" feature set #176
Replies: 3 comments 9 replies
Is there a release candidate / test build I could try?Separate from the spec above — a practical question. The recent commits look like release preparation: changelogs added, version number bumped, build settings updated, a GitHub Action for builds, and a lot of new tests. The last published release (F-Droid 1.3.3, Nov 2025) predates the Is there any way to get a release candidate or test build — an APK from If a build isn't available to share, no problem — I can look into building from source. But if you already produce one, that's the fastest path to a useful test. |
Scope clarification: relationship to smartwatches / wearablesOne more scope point worth making explicit, alongside the existing "find, not rescue" framing. The gap between phone-based and wearable-based detectionA smartwatch with fall detection, heart rate, and other body-worn sensors can do things a phone sitting on a table or in a pocket fundamentally cannot: detect a fall within seconds, monitor vital signs continuously, and react on a timescale of minutes rather than hours. KeepAlive works on a much coarser signal — device interaction — over a much longer timescale. This isn't a flaw to fix; it's a different tool for a different situation. But it means the choice between "wearable" and "phone-based inactivity monitoring" is a real trade-off, not a minor implementation detail, and users should be making it consciously rather than defaulting to KeepAlive without realizing what a wearable would additionally catch. Suggested framingKeepAlive is best positioned for:
It's a weaker choice for someone who would otherwise get a smartwatch and is only avoiding one because they haven't considered the alternative — in that case, they should at least be making an informed choice, not settling for the phone-based approach as a default they didn't know had a stronger alternative. Where this could liveSame reasoning as the existing "find, not rescue" scope statement — README, F-Droid and PlayStore listing, and/or in-app onboarding, wherever that one ends up. Not proposing a code change, just flagging that this trade-off deserves the same explicit treatment as the other scope boundaries already documented here. |
Scope clarification: alpha/beta status given current gapsRelated to the "find, not rescue" framing already in this thread — a similar honesty question applies to the app's overall maturity, not just its scope. ObservationAcross the issues raised in this discussion and elsewhere (reboot re-arming causing false alarms, the full-screen intent setting having no effect, no post-alert acknowledgement, BFU-SMS reliability still landing), several of the gaps sit on the app's core path: reliably detecting inactivity and reliably alerting someone. These aren't polish items — they're the central promise of the app. At the same time, KeepAlive is listed on the Play Store and F-Droid as a regular, finished app, with no version qualifier or maturity warning visible to someone installing it. Why this might matterFor most apps, a rough edge means annoyance. Here, a gap in the core path means: nobody gets alerted, and the user believes they're covered when they aren't. That asymmetry is exactly the reasoning already behind the "find, not rescue" scope statement — the same honesty argument could apply to current reliability, not just intended scope. Not proposing a specific labelNot suggesting a particular fix here (alpha/beta tag, changelog-based "known limitations" section, in-app disclaimer, or nothing at all) — that's a judgment call for you as maintainer, weighing user trust against adoption, and you're better placed to make it than I am. Raising it as a discussion point because the underlying tension (visible maturity vs. actual reliability on the core path) seemed worth naming explicitly, in the same spirit as the other scope clarifications here. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Why I'm writing this
I'm a user, not really a developer. I have a concrete personal need for an app like this — for an independent person living alone, where the realistic goal is that death or incapacitation is noticed within a day or two, not an acute minutes-matter emergency.
To be clear about what this post is and isn't: I'm not pushing for anything on a timeline, and I'm not asking you to adopt a list. You're clearly the one building this — the recent commits, especially the
MakeAppWorkBeforeFirstUnlockwork, show the project moving in exactly the direction I care about. My hope is just that the app keeps developing; that's the main track, and it's your call.What I can usefully add is a more detailed account of the requirements from a user's point of view than you'd get from a Play Store review. If it's helpful as a reference — for you, or honestly just for other users trying to understand what the app is for — great. If parts of it are already done, already planned, or things you'd reject, that's fine too; I'd genuinely like to know which. Worst case, if I ever needed something specific badly enough, I'd cobble together a prototype with AI help for my own use — but that's a poor substitute for a real, maintained app, which is why I'd much rather see this one thrive.
Intended scope (frames everything below)
This needs stating plainly, because it shapes which trade-offs are acceptable.
The app is not an emergency system requiring a reaction within minutes or hours. A phone cannot deliver that, and pretending otherwise would be dishonest and dangerous. The realistic purpose is narrower and still valuable:
Target users are independent, broadly healthy people living alone (not necessarily elderly; the situation fits younger people too). People who already have daily home care or are hospitalised don't need this. A reasonable baseline of health and daily phone use is assumed. The setup also assumes an eSIM (without a SIM PIN) rather than a physical SIM — see section A for why this matters to reboot behaviour.
This scope is worth stating in the app description too, gently but clearly. Honest framing protects users from false confidence and is itself a feature.
A. Reliable operation after reboot (relates to #156)
This is the capability I care about most, and it's clearly what the recent work targets — so most of this is probably already done or in progress. I'm including it for completeness and to flag the one part I, as a user, can't tell from the outside.
directBootAwarereceiver/service, listening forLOCKED_BOOT_COMPLETED, with alarm state in device-protected storage so the alarm survives a reboot without unlock. (This looks like exactly what theMakeAppWorkBeforeFirstUnlockwork does.)(The battery-low case is related but distinct — see section F.)
Why eSIM, no SIM PIN: BFU operation depends on cellular connectivity being available before first unlock. With a physical SIM that has a PIN set — the norm in many countries, since a stolen SIM otherwise allows costly fraudulent use — the device needs a SIM-PIN replay after an unattended reboot to restore cellular service, and whether that completes before first unlock is uncertain. An eSIM avoids this: nothing to remove and reuse elsewhere, so no SIM PIN is needed, and the radio is available in BFU. (Confirmed in practice on GrapheneOS with an eSIM: incoming calls are received in the BFU state after auto-reboot.) This establishes only that the radio is up; whether the app may use it to send an outbound SMS in BFU is the item in point 2.
B. Configurable timers with sensible ranges
The inactivity and wait timers clearly already exist. As a user I'd want roughly:
C. The warning-and-alert flow
This is essentially the existing "Are you there?" flow; listing it so the whole picture is in one place.
D. Messages, recipients, and delivery
SmsManagertransparently. Worth recommending in setup docs. It does not solve the BFU case (section A): it uses the same telephony/IMS stack, so before-first-unlock availability is the same open question. This means carrier VoWiFi, not RCS (RCS would add a recipient-side dependency).E. Heartbeat / liveness
Every Z, a heartbeat SMS (e.g. "still active"). This is the foundation of the only real defence against silent total failure — see the honesty note below.
Plus, on the first unlock after the app (re)starts, a "reactivated" SMS.
F. Battery handling (refines the #156 discussion)
G. Activity detection (relates to #125, with reservations)
Lock-screen unlock is the primary liveness signal and works well here: a healthy person unlocks at least once a day, and unlocking is a deliberate act (fingerprint/PIN/pattern), not an accidental touch. It's also simple, which has real value. I'd keep it as the default.
Motion/accelerometer detection (#125) is worth considering only as an optional additional signal, with a caveat: people often leave the phone on a table rather than carrying it, so motion absence isn't a reliable proxy for inactivity. Opt-in, not a replacement for the unlock signal.
H. Permission survival
Android may revoke permissions for unused apps, silently disabling the alert. The app already documents disabling "Pause app activity if unused." Worth making this a prominent, guided onboarding step rather than a README note, since a revoked permission is another form of silent failure.
I. Graduated / escalating recipients (relates to #40)
Optional, later: if the first recipient doesn't respond, escalate to additional recipients after a delay. Depends on a recipient-side acknowledgement mechanism (see companion app) and isn't needed for a first version.
The honest limitation: silent failure
The whole thing is a chain: device detects inactivity → sends alert → recipient reacts. If a link fails silently — phone fully dead (battery, defect, no signal at its location), permissions revoked, app killed by an aggressive battery manager — then nothing is sent, and on the recipient's side "all is well" and "the system is dead" look identical. Silence is indistinguishable from safety.
The heartbeat (section E) is the right defence in principle: it turns silence into an expected, missed signal. But it only works if someone on the recipient side notices the absence of an expected heartbeat — and a human won't reliably remember "the last sign of life was Tuesday." That's what a companion recipient app is for. The recipient app sensibly comes after the sender app; until it exists, the sender-only version should state that it detects inactivity on a functioning phone and doesn't protect against complete device failure.
Companion recipient app (future, sketched for completeness)
Out of scope (deliberately)
SmsManager,AlarmManager, Direct Boot APIs,WifiManager,BatteryManager), consistent with the app's F-Droid presence.All reactions