Inspiration
Someone posted to r/AgingParents on 22 September 2026: "Has anyone had luck getting an elder parent to stick with a simple strength routine?" Two posts down the far more common question: "Parents keep taking off their fall-alert wearables. What actually worked for you?"
That imbalance is the whole argument. Across 200 posts in r/AgingParents and r/eldercare coded for this build, nineteen people were shopping for a device to tell them their parent had already fallen and five were asking about the exercise that would stop the fall happening. The evidence runs the other way. A 2019 Cochrane review found exercise cuts the rate of falls by 23% (rate ratio 0.77, from 59 trials and 12,981 participants, graded high certainty), and the CDC's age-adjusted fall death rate rose 21% between 2018 and 2024, from 64.7 to 78.4 per 100,000 older adults. Families are buying the alarm because there is nothing on the shelf that does the other thing in a living room.
What it does
Turn on the TV. One button is already focused: Start Today's Session. Walk through today's exercises at your own pace, say whether it was too much, just right or too easy, and the weekly streak updates. Progression from chair-supported to standing is automatic and conservative, and a plain-language weekly update goes to one named family member.
How we built it
Kotlin and Jetpack Compose, minSdk 28 for Fire OS 16, a LEANBACK_LAUNCHER intent filter and a 320 by 180dp banner. Everything that decides what the person sees is pure Kotlin with no model and no network in it: ProgramEngine, AdherenceTracker, WeekCalendar, IntensityAdjuster and PauseTracker. Standing exercises unlock only after two consecutive fully elapsed weeks each meeting 75% of the prescribed dose, because the adherence study this app is built on (Hua et al., 2026, 41 publications and 20,202 participants) found programmes clearing 75% adherence cut fall incidence far harder than the pooled effect. A single empty week drops the tier back, and a week the person marked as away or unwell is excluded rather than counted as zero.
Amazon Bedrock is called in exactly two places, and both follow one rule: the rules decide, the model only describes. CaregiverSummaryBuilder computes the session count, streak and tier; NarrationService hands those facts and nothing else to Bedrock's InvokeModel API in us-east-1 and asks for two or three warm sentences, tagged on screen as "AI-personalised" or "standard wording" depending on which one actually ran. The second call rewrites the one-sentence explanation of why today's session is shorter, after the deterministic sentence is already on screen. Every call has a four second timeout, and the app never waits on one before a session can start. The proxy tries us.anthropic.claude-sonnet-4-5-20250929-v1:0 then us.anthropic.claude-sonnet-4-6, holds the AWS credential on the machine that owns it, and is the only host the app's network_security_config.xml permits cleartext to.
The ten-foot type scale has no phone size in it: 38 / 30 / 30 / 28 / 26sp, a range collapsed to a ratio of 1.46 against a six-step reference scale's 2.8, because there is no small print for a person standing up, possibly on one leg, three metres from the panel. Weight carries hierarchy where size cannot: the heading is bold at 38 rather than semibold at a size closer to the body under it, because at three metres a small size jump is nearly invisible and a weight jump is instant. Focus signals on three channels at once, an 8dp near-white ring, a 1.1x grow and a brighter container, in 120ms. The session screen is deliberately barer than anything else we have built: one screen, one focused button, no menu, no tab bar, nothing to get lost in. History is the opposite of bare on purpose — a record with columns, not a list: date, how long, how it felt and movements done line up under a header, the movement count drawn as five upright marks as well as written as a figure, because at three metres a shape reads before a number does and an unlabelled glyph is not a fact anyone can check. 134 tests, all passing with no network at all.
Challenges we ran into
The headline feature silently vanished. After a real five-exercise session the streak line was absent from the accessibility tree entirely, while the stored data and the domain tests both said it should be there. HomeScreen combined Arrangement.Center with Modifier.verticalScroll on the same node; a scroll container measures as effectively unbounded, so centring has no viewport to centre against and the extra height from the conditional streak line pushed it off screen. The scroll modifier had been added earlier as a safety net against a different overflow bug, and it defeated the thing it was protecting.
Initial focus was a race, not a bug. LaunchedEffect(Unit) { focusRequester.requestFocus() }, which is the pattern in most Compose-for-TV samples, lost against Android's own default-focus-on-attach often enough that DPAD_CENTER on a fresh launch fired the wrong button. Requesting focus from Modifier.onGloballyPositioned with a short deliberate delay fixed it, verified by driving the emulator entirely with adb shell input keyevent and never a tap, since a tap can land correctly even when focus is wrong.
The build brief named anthropic.claude-sonnet-5. It lists cleanly under ListFoundationModels and returns AccessDeniedException on invoke, so the proxy ships a preference list rather than one id. And "Send now" composes the real summary from real adherence numbers and records it locally; no SMS or email provider is wired in, and the README says exactly which line would have to change.
Accomplishments that we're proud of
The adherence machinery, not the exercise content, is the product, and it is all rule-driven and readable. A person can pause because they were in hospital and come back to the same tier with an eased-in first session, rather than being demoted for the event the app exists to prevent.
What we learned
A centring arrangement and a scroll modifier on the same layout node is a trap, and the safety net is what hides the failure. Verify a screen's full semantics tree, not a screenshot crop, before trusting that late-appearing content renders.
What's next
A real delivery path for the weekly update, a device pass with VoiceView switched on, an in-app text size control, and reduced-motion support.
Built With
- android
- fire-tv
- jetpack-compose
- kotlin
Log in or sign up for Devpost to join the conversation.