Jenny: the AI assistant I text
Before Meta released Muse, I built my own assistant on the Claude plan I already pay for and put her in iMessage. Her name is Jenny. She started as a personal assistant, and I turned her into a life coach instead.
Updated Oct 23. I wrote the first version of this post a week after Jenny started. Two weeks of living with her changed most of how she works, so I rewrote it.
What I made Jenny for
1. A life coach for someone who forgets to drink water
My days are chaos. Jenny keeps the small things from falling through.
- Nudges that keep going until I answer: morning and evening meds, a walk after dinner, Luca’s flea and heartworm pill on the 20th, the water bill. A thumbs up on the text checks it off.
- Reminders in plain words. “Remind me in 20 min.” “Dentist Tuesday at 2, remind me the day before.” “Every Monday at 9.”
- My calendar, Gmail and the web. She looks things up and adds events (never with guests).
2. A weight coach who only talks numbers when I ask
- I text “w” and my weight, and she logs it. My iPhone also sends my weight from Apple Health every morning. If I skip a week, she reminds me on Sunday.
- “ate:” and whatever I had goes into a food log.
- Two “quick move” texts a day, each a short workout at a random time.
- When I end a walk on my Apple Watch, a Shortcut tells her and the walk nudge never comes.
- On Sunday evening she looks at two weeks of logs and walks and suggests three dinners from my fridge.
3. A fridge that texts back
- Memory. “Remember Luca’s vet is Dr. Kim.” She also saves up to two small facts on her own when I mention them.
- A grocery list sorted by store. “Done shopping” moves everything into the fridge list.
- A running list of what’s in my fridge, freezer and pantry. I text “fridge: chicken thighs, kimchi,” or I send a photo. She texts back a list of what she sees, I confirm it or fix what she got wrong, and the lists update with the date. “out: eggs” takes it off. At 4pm she tells me what to use before it goes bad.
- Meal ideas from what I already have, PCOS and diabetes friendly, for two (or more when my siblings eat too), always with some meat or fish. Two texts: one comfort dish and one new one, with amounts and steps. If I heart a recipe, she remembers I liked it.
The photo I sent her. She texted back a list, I fixed a few things, and my fridge, freezer and pantry lists were up to date.
I’ve loved every recommendation so far. They help me clean out the fridge, my siblings love them too, and I get to try new flavors. She cooks to my taste, and every ❤️ makes her better at it.
Optimizing and speeding her the F*** up!!
At first, every text started a new Claude run, so every reply took 30 seconds to a minute, even “took my meds.” In one run I timed, 38 seconds went to Inkbox, a batching wait, the run booting up, Claude itself, sending the reply and the trip to my phone. Claude’s own part was 8 seconds.
I also couldn’t tell anything was happening. My text showed Read, but the typing bubble never shows up on my phone, so I’d stare at a quiet thread wondering if she got it.
Now the simple ones never reach Claude. The doorbell, a small function on Supabase, answers them itself in about 7 seconds, and a thumbs up on my text tells me she got it:
- Check-offs: “done,” “paid,” a tapback on a nudge.
- Lists: “what’s in my fridge,” “my reminders,” “what do you remember.”
- Adds and removals: “fridge:”, “grocery:”, “out:”.
- Simple reminders: “in 20 min,” “at 3pm,” “tomorrow at 8.”
Reminders and nudges moved off Claude completely. They live in a Postgres table, and a job that runs every minute sends them through Inkbox. They arrive within a second of the time and cost nothing from my plan.
Get Eun Ji’s stories in your inbox
Join Medium for free to get updates from this writer.
Everything else wakes Jenny. Short, simple texts go to a fast Haiku routine. Food, calendar, photos and anything that needs the web go to Sonnet, and if Haiku can’t handle a text, Sonnet takes it right away.
How I know it’s working
Every text gets a row in a log: when it came in, who answered it (the doorbell, Haiku or Sonnet) and how many seconds the reply took. When I want a check-up, I ask Claude Code “how is Jenny doing?” and it reads the logs and tells me.
- Every text answered. In the 30 hours before I wrote this, I sent her 52 texts and she answered all of them.
- Reply time by route. Doorbell answers take about 7 seconds. Claude runs still take about 28 seconds whether Haiku or Sonnet answers, so the next win is moving more texts to the doorbell, not a smaller model.
- Alerts. A “JENNY ALERT” text means a reply or reminder failed. The last ones came on Oct 21, when I texted fridge items one by one and hit Claude’s limit on how often a routine can start. Now the doorbell batches texts that arrive close together.
- Texts left. Inkbox’s free plan gives me 2,000 iMessages a month in both directions, so I asked her to keep texts few and short. “Texts left” tells me where I am.
How it works: a doorbell
A Claude routine only runs when something starts it, so most of the day Jenny is asleep and using none of my plan.
- I text Jenny like a person.
- Inkbox gives Jenny a number and fires a webhook on each text.
- The doorbell checks that the text came from my number in our one-to-one thread. If it can answer, it does, and stops there.
- If not, it waits a few seconds in case I’m sending more, then wakes Jenny with my texts, the last few messages, and the notes and memories that match. She doesn’t have to look anything up before she starts.
- Jenny does the job, texts back and goes back to sleep.
Each run gets a one-time key that expires in 30 minutes, so Jenny’s prompt holds no secrets. If a text goes unanswered for six minutes or a reminder fails, the doorbell texts me “JENNY ALERT.”
If you want to build one
- Make an Inkbox identity, connect iMessage, add the Inkbox connector to Claude, and create your notes.
- Write the prompt: read the text, do it, reply. Name your number as the only recipient.
- Create a Claude Code routine with that prompt and an API trigger. Give it only the tools it needs.
- Deploy the doorbell on Supabase and register it with Inkbox for
imessage.received. Keep tokens in secrets, not code. - Text her “add milk.” Then move whatever you text most into the doorbell.
The heart of the doorbell is this check, and then a list of things it tries before waking anyone.
const fromOwner = msg.direction === "inbound" &&
msg.is_group !== true &&
msg.remote_number === OWNER_NUMBER &&
msg.conversation_id === CONVERSATION_ID;
if (!fromOwner) return json({ ignored: true });// Answer it here if we can. Claude only sees the rest.
if (await lookup(msg)) return json({ lookup: true });
if (await quickReminder(msg)) return json({ reminder: true });
if (await noteAdd(msg)) return json({ note_add: true });Most of my prompt is about what Jenny won’t do. Gmail is read-only, she never invites anyone to an event, she never texts anyone but me, and anything involving money or passwords goes to the Claude app.
Copy editing by Claude Sonnet 5. hehe~
Resources
Inkbox for the iMessage identity, notes and webhook.
Claude Code for the routines, and Supabase for the doorbell, using Edge Functions and Cron.






