Skip to content

Senior Health App

A phone-first companion for older adults, built by Equal Entry. Accessibility is a build requirement here rather than a later audit pass: CI fails on accessibility lint violations, component tests query by role and label so they break when the accessibility layer breaks, and content that cannot be described is never shown.

Start here

Guide What it covers
Accessibility The conformance target, the assistive-technology test matrix, and the conventions every surface follows
Design system Daybreak: the color, spacing, and type tokens, and the primitives built on them
Testing The layers, the shared helpers, and how to add a case without inventing a pattern
Media catalog How to add a new video or photo, and the description gate every asset must pass
Multiple seniors A concept sketch: two people's memories on one device, switched from Settings
Launching the app Every way to run it: simulator, Accessibility Inspector, Wi-Fi to a phone, TestFlight, and what to do when Wi-Fi will not connect
Deploy to iPhone Installing the dev client once, then iterating over Wi-Fi with no rebuilds
Backend over Cloudflare Tunnel Giving the laptop backend a stable public hostname for TestFlight builds

The features

Feature What it does
Stories from the Past A gentle, one-question-at-a-time memory session built from the senior's own life story
Accessible Video Quiz A video quiz that cannot reach a senior without both an audio description and captions
Voice Answers Answering by speaking, with automatic endpointing, so no tap is required
Photo Questions An EXIF-driven photo prompt. Prototype only; not yet built
Faces Learning a name from a face in three steps, one person at a time

How the repo is laid out

The Architecture page has the full picture, including the Cloudflare data plane and the Loved One web app. The short version:

apps/mobile/   Expo app (SDK 57, React Native 0.86, TypeScript strict, Expo Router)
backend/       FastAPI service: image and video processing, Deepgram transcription
docs/          This site
compose.yaml   Runs the backend in Docker

Two principles run through all of it:

Born Accessible. The data model itself enforces access. A video quiz without an audio description and captions is not publishable and the screen refuses to play it. A photo without a description is never rendered. This is checked by tests over the shipped content, so it cannot rot.

Laptop or cloud, the app does not care. The mobile app derives its backend URL from the Expo dev server in development and from EXPO_PUBLIC_API_URL in preview and production builds, so simulators, emulators, and physical devices all reach the right place with no configuration.

Working on the docs

The site is Material for MkDocs, built from the docs/ directory and hosted on Cloudflare Pages. The settings Cloudflare needs are in the repository README.

pnpm docs:serve    # live-reloading preview
pnpm docs:build    # strict build; a broken internal link fails it

The preview lives at http://127.0.0.1:8001, on port 8001 rather than the MkDocs default of 8000 because the FastAPI backend uses 8000.

A new page has to be listed in the nav in mkdocs.yml, or the strict build fails.