Daniel Howells

Building Kinecho

2025-09-15

Kinecho is a family connection app, and the hardest constraint isn't technical. It's that half the users are family members who don't install apps willingly, don't read onboarding flows, and will abandon anything that feels like work. Every design decision filters through that reality. If my mum can't figure it out in 30 seconds without instructions, it's too complicated.

That constraint shaped the architecture more than any technical consideration. I chose local-first because sync should be invisible. Family members shouldn't know or care that data is being synchronized. They open the app, their stuff is there, they add something, it shows up for everyone else. No loading spinners, no "waiting for sync" states, no conflict resolution dialogs. The local database is the source of truth for the UI, and background sync happens through a CRDT-based merge strategy that resolves conflicts automatically. I'd rather occasionally show a duplicate that gets cleaned up than ever show a "sync conflict" modal to someone who doesn't know what sync means.

The UX hides real complexity. Sharing photos, messages, and family updates sounds simple, but the interaction patterns are different for every family member. Some will post daily, some will only read. Some use it on a tablet, some on a phone they barely understand. I designed the core loop to be almost entirely passive: content appears in a feed, you scroll through it, you tap a heart if you like something. Active contribution is a big button that opens the camera or a text input. No menus, no settings to configure, no permissions to grant during setup. Everything that requires configuration happens once during the invite flow, and the person sending the invite handles the complexity, not the recipient.

The biggest lesson from building Kinecho is that simple UX requires more engineering, not less. Every edge case you'd normally surface to the user through a dialog or error message has to be handled silently. Offline support, retry logic, image compression, push notification permissions, background sync scheduling. All of it is invisible. The app feels simple because the code isn't.