Care Communication Board
A cross-platform communication board for Android and the web: tap a tile to play a recorded voice clip or speak text aloud. Built for my mom, with Claude Code.
- 4 daysidea to first release
- 13 daysto v1.0 on Android and the web
- 413+automated tests
- 90%line coverage gate
- About 16,000lines of code and tests
- 159+pull requests
Problem
I built this for my mom and her caregivers. The commercial communication apps I evaluated were either expensive, sketchy, or ad-supported novelty software, unsuitable for what we wanted. What was needed was something focused: tap a tile to play a recorded voice clip or speak text aloud, with no ads, no data collection, nothing to set up, and full function offline. As a bonus, my mom didn't end up needing to use it, but I'll still add features as I think of them. Show has definitely seen use in loud environments to order drinks and converse.
What I built
- A cross-platform app for Android and the web, designed, built, and shipped while directing an AI coding agent (Claude Code) and owning every architecture and review decision.
- Zero-setup preset boards, voice banking with an adjustable text-to-speech fallback (voice, speed, and pitch), and critical phrases pinned on every screen for one-tap access.
- A progressive web app that installs like an app and works offline, so caregivers can use it on any device, plus a stable download link that always serves the latest Android release.
- Legibility and accessibility work: automatically sized labels, fonts designed for low vision, and screen-reader support.
- Features shaped by real care situations: a large-text Show mode that flips upside down for someone sitting across from the user, a hold-to-unlock caregiver lock that prevents accidental edits, and warnings when a tap would make no sound.
- A 4-phase migration to Kotlin Multiplatform and Compose Multiplatform, sharing about 80% of the code between Android and the web (WebAssembly) with no change in behavior on Android.
- Data-integrity safeguards: older saved boards keep loading after format changes, tiles with missing audio reset themselves instead of failing silently, and cleanup never deletes audio a saved board still uses.
- A suite of 413+ tests that runs on the JVM, in headless Chrome, and on an Android emulator, backed by a 90% coverage gate, screenshot regression tests, and branch protection on every merge.
Stack
- Kotlin
- Kotlin Multiplatform
- Jetpack Compose
- Compose Multiplatform
- WebAssembly
- Claude Code
- ElevenLabs
- GitHub Actions
- JUnit
- Robolectric
- Roborazzi
- Puppeteer
- Kover
Outcome
- Idea to first release in 4 days, and v1.0 on Android and the web in 13 days, with 151+ issues, 159+ pull requests, 186+ commits, and 7+ releases to date.
- About 16,000 lines of code and tests, with a CI coverage gate that fails the build if core code drops below 90% line coverage (currently 91-99.5%).
- Found that half the UI test suite was failing unnoticed because CI never ran it, repaired it, and added emulator-based UI testing to CI so a green build now covers the UI.
- Diagnosed and fixed a race condition that could silently save stale data, and proved the fix with a regression test that fails reliably without it.
- Shelved a feature on evidence: after a real speakerphone test, investigated routing app audio into phone calls, then dropped it after weighing feasibility, misuse risk, and texting as a simpler existing alternative.
- Refactored a 2,900-line file into 8 focused modules in a planned pass with no change in behavior, keeping AI-generated code maintainable.
- My mom was mostly able to communicate on her own, so the app was not something she leaned on.
- Built as a safety net, so being rarely needed so far is a good result.
- Found a second use beyond the original one: some people use Show mode in loud places to order drinks, sell merchandise, and hold conversations by showing large text to the person across from them.