u/Slight_Appointment_8

▲ 11 r/GenAiApps+2 crossposts

I'm a designer and I built an iOS keyboard that remembers your clients

Background: I've been a product designer for 12 years, mostly fintech (Revolut, Itaú, some others). Never shipped an app myself. Six months ago I started actually writing code instead of handing off Figma files, and this is the first thing I've built end to end.

The idea

I kept watching salespeople, real estate agents, watch dealers, yacht brokers.. lose deals because they forgot things. Not big things. Small ones. What the client's wife's name was, which property they liked, what got promised three weeks ago in a WhatsApp thread nobody scrolls back through.

CRMs exist for this, but nobody in that world uses them. Because using a CRM means stopping the sale to go type in a form, and no one selling a $2M yacht is going to do that.

So I built the opposite: a custom iOS keyboard that surfaces client context inside whatever app you're already in. You open WhatsApp, start typing to a client, and everything you know about them is right there above the keys.

What actually broke

Custom keyboard extensions on iOS are their own special hell:

  • Memory limit is brutal (~30-60MB before iOS kills you). My first version tried to load client data directly in the extension and got terminated constantly. Had to move everything to a read-only App Group cache written by the main app.
  • No network access unless the user grants "Full Access," which triggers a scary system warning. Had to design the whole thing to work offline-first.
  • Extension lifecycle is unpredictable — it gets killed and relaunched constantly, so any state you hold has to be reconstructable from disk in milliseconds.
  • Debugging is miserable. Breakpoints in the extension work maybe 40% of the time. I spent an embarrassing number of hours with print statements.

The AI part

There are around 30 AI capabilities behind it (drafting responses, extracting facts from voice memos, matching clients to inventory). My first architecture was one giant system prompt handling everything. By capability #5 it was a mess — changing one thing broke three others.

Ended up rebuilding it as a thin router + isolated specialists. Each capability gets its own prompt with a hard scope declaration and a token cap. If a specialist gets asked to do something outside its scope, it returns OUT_OF_SCOPE:x and the router re-dispatches. Sounds obvious in hindsight. Wasn't obvious at capability #4.

Where it is now

TestFlight approved, Google OAuth verified (that took three weeks and a video that YouTube auto-removed for "sharing personal information" it was fake demo data). First version works. No users yet.

Built with Cursor + Claude, mostly at night after the kids sleep. Budget: about €200/month, which is the Cursor subscription.

What I'd like feedback on

  • Is this shit really cool?
  • Would love to know if the "AI that doesn't talk to your clients" positioning lands, or if it sounds like I'm just describing a limitation.

Happy to answer anything about the iOS extension pain specifically. Learned a lot the hard way.

u/Slight_Appointment_8 — 2 days ago