2026 · CASE STUDY · IOS
Mes app icon

Mes

Designing AI for the most intimate digital surface.

Concept to App Store. Solo. Four months.

Designer & engineer · SwiftUI + Gemini · Live on the App Store

Spicy 🌶️Wholesome 🤍Chaotic ⚡
At a glance
The problemAI features in messaging feel untrustworthy, and no iMessage app combined polls, AI reply, and bill-split at a quality bar worth featuring.
The outcomeShipped solo to the App Store, design and engineering both mine.
My roleSolo: product design and the SwiftUI build (design engineer).
Timeline~4 months, concept to ship · 2026
ApproachTrust through agency: generative UI you can preview, edit, and undo before it ever sends.

Adding AI to iMessage is not adding a feature. It's editing the most personal app on someone's phone.

This is what that design problem actually feels like.

01 · RESEARCH & DISCOVERY

A crowded market,
and a gap nobody filled.

I screened 412 iMessage apps and the top group-chat tools before designing anything. The market was busy but fragmented: every capability existed on its own, none of them together.

412 apps screened
iMessage-native
Polls
AI reply
Translate
Bill split
Sticker packs
Poll extensionssingle-purpose
Sticker appscosmetic only
AI keyboards / chatbotslinked-out, not native
Bill-split appsleave the thread
Mesall six, one app
Affinity map · from raw notes to five themes

I dumped every observation onto a board and clustered until the themes named themselves. One note kept surfacing under trust, and it became the thesis of the whole product.

Mes · Discovery synthesisEdited 2h ago
GARK+3
Share
Trust & control
“I’d never let it just send”
Nothing lets me check before it’s out
Re-reads every AI line before sending
“It’s my name on that text, not the app”
Deletes the AI draft rather than risk it
Preview, edit, undo before it ever sends
Insight

Adoption hinges on control: preview, edit and undo have to be the default, not a setting.

Tone & voice
“Does this sound mad? I can’t tell”
Drafts a reply, deletes it, leaves on read
Same words land wrong in different chats
Screenshots a text: how’s this read?
Generic AI replies sound like a robot
Pick the tone before you generate
Insight

The real job is landing the tone, so let people choose it before generating, not type faster.

Group coordination
“Wait, are we still on for Friday?”
One person herds every plan
40 messages, still no decision
Chasing people for $12 feels petty
Poll and split inside the thread
Insight

Plans drown in the scroll, so the tools that settle them belong where the talking happens.

App-switching friction
“Ugh, now I have to open Venmo”
Copy-pastes the result back into the chat
AI keyboards bounce you out of the thread
“By the time I switch, I forget”
Keep the state in the message bubble
Insight

Every hop out to poll, split or pay breaks the moment, so staying native to the thread is the product.

Language & inclusion
“Mom texts Spanish, I reply English”
Pastes into Translate, tabs back, loses flow
Someone gets left out of the joke
“Don’t want to sound broken in their language”
Inline two-way translate, no app-switch
Insight

Mixed-language chats quietly leave people out, so inline two-way translate keeps everyone in one conversation.

Gazi
you
Legend
Voice of user
Observed behavior
Pain point
Opportunity
412 apps screened · 27 notes · synthesis, pre-interview
100%+
Who I designed for
MG
The group organizer
runs the plans in every chat
What they need

Tools that resolve the group without leaving iMessage.

Goals
  • Settle a plan fast without a 40-message thread
  • Collect money without chasing people
  • Look effortless, not needy
Frustrations
  • Polls live in a different app
  • Splitting a bill means leaving the chat
AR
The anxious replier
overthinks every message
What they need

A draft they can preview, edit and undo, not an autopilot.

Goals
  • Reply well when words are hard
  • Match the right tone for the person
  • Never send something that sounds off
Frustrations
  • AI replies feel generic and risky
  • No way to check before it sends

Design-target archetypes, drawn from the competitive gap and the problem space.

02 · DESIGNING FOR AI

Designing for AI is designing for uncertainty.

The hardest part wasn't the model. It was the mental model.

Generative AI in iMessage is high-stakes by default.

In a productivity tool, generative AI is forgiving: a slightly-off summary gets fixed. In iMessage, a reply you send is a reply from you. Wrong tone breaks the relationship. Too generic reads robotic; too clever reads like an AI wrote it.

iMessage thread, high-stakes context

Three options, not one.

A single "best" reply forces a binary: accept or rewrite. Three options create a comparison space, and comparison shifts the user from evaluator to editor: pick the closest match, then tweak. That mental shift is everything.

Three AI reply options

Tone as a first-class control.

Most AI reply UIs hide tone behind a generate button. Mes makes it the primary interaction: three chips, picked before generating. The user steers the AI's voice instead of auditing its output. Trust comes from agency.

Tone chips as a first-class control

Bubbles, not list items.

Reply options render as iMessage bubbles, not menu rows, so the user sees each message in the form it will take: no translation step between preview and reality. And nothing sends on its own. The reply you pick drops into the compose field to edit first, so the AI drafts but never speaks for you.

Reply rendered as an iMessage bubble
TRY IT

Generate a reply.

Pre-canned tones, but the choreography is exactly how the real feature behaves.

01 · Incoming message
02 · Tone

Trust in generative UI comes from agency, not accuracy.

03 · IDEATION — FLOWS & IA

How it's wired.

Two decisions shaped everything downstream: the reply flow keeps a human in the loop, and the app splits across an in-thread extension and a full main app.

Core user flow · AI reply
1Open a chatExtension in the iMessage tray
2Tap AI ReplyReads the last message
3Pick a toneCasual · Romantic · Funny
4Preview draftNothing sent yet
5↺ loopEdit or regenerateSteer it, or reroll
6SendA reply that sounds like you

The preview → edit loop is the whole design bet: the AI drafts, the human approves. Nothing sends on its own.

Information architecture
Mesapp group · shared data layer
Main app
container · full-screen
Onboarding
Paywall & subscription
Sticker store · 6 packs
Settings & language
iMessage extension
the tools · in-thread
AI Reply
Translate
Polls
Bill Split
Stickers

The split is the architecture: the extension stays in the thread, the main app holds everything that needs room, and an App Group shares state between them.

04 · THE FEATURE SYSTEM

Six tools. One language.

AI Reply is the headliner, but Mes is a platform. Five more tools cover the rest of what group chats need, each built from the same component vocabulary, each ship-quality on its own.

Extension home with six tool tiles
01 / AI REPLY
feature-ai-reply.mp4
01 / AI REPLY

Reply in your voice, not the AI's.

Three tones, three options each, generated by Gemini 2.5 Flash. The user picks the tone before generating, steering the AI's voice rather than auditing its output.

02 / LIVE POLLS
feature-polls.mp4
02 / LIVE POLLS

Real-time polling. No backend.

Interactive cards that update inside iMessage as participants vote. Multi-choice and star-rating. State lives inside the MSMessage URL: no server, no sync, no lag.

03 / BILL SPLIT
feature-bill-split.mp4
03 / BILL SPLIT

Settle the bill in three taps.

Even or custom splits for up to 10 people. Tip presets and custom percentages. One-tap Venmo or Cash App handoff per person, routed through the main app to satisfy iMessage sandboxing.

04 / SPIN WHEEL
feature-spin-wheel.mp4
04 / SPIN WHEEL

Let the wheel decide.

A weighted decision tool for groups. Spring-physics spin animation tuned for natural deceleration. Result card auto-inserts to the thread.

05 / COUNTDOWN
feature-countdown.mp4
05 / COUNTDOWN

Count to what matters.

Shared event countdowns rendered in the recipient's local time. Cards update each time the thread is opened. No backend, just smart re-rendering.

06 / STICKERS
feature-stickers.mp4
06 / STICKERS

Reactions, curated.

Six packs covering the full emotional range of group chat. Sticker store syncs across the main app and extension via App Group. Cat Reacts ships free.

05 · FROM WIREFRAME TO SHIP

The reply screen,
three drafts deep.

The AI-reply screen carries the whole trust idea, so it took the most iteration. From a paper sketch full of question marks, to an annotated greyscale wireframe, to the shipped screen, each pass locked one decision.

1Lo-fi · paper

Where does the reply even go?

The first sketches were about placement and open questions, not polish: does tone come before or after the draft, and where does the draft live so nothing sends by accident?

2Mid-fi · greyscale
9:41SELECT YOUR TONECasualWarmFunnyDRAFT · NOT SENTEditSend12

Tone before draft, preview before send

The greyscale wireframe resolved the two questions from the sketch: tone selection sits above the draft, and the draft is a preview card with an explicit Send, annotated for handoff.

3Hi-fi · shipped
9:41AAgent 1Are we still on forYosemite this weekend?still figuring it outno pressure! just let meknow by tonight 🙂$SELECT YOUR TONECasualWarmFunny✦ DRAFT · NOT SENTYes! Yosemite soundsperfect, I'll bring thesnacks and playlist 🥾EditSend ↑iMessage

Approve, don’t autopilot

The shipped screen keeps that structure and adds the real voice: the AI drafts in a card that never enters the thread until you tap Send, with regenerate one tap away.

06 · DESIGN SYSTEM

One system, two targets.

Mes ships as two Apple targets sharing one design language: a main app for paywall, onboarding, and the sticker store, and an iMessage extension for the tools. Every component had to work in both, and the library lives in production Swift, not just a design file.

Mascot.

A plush bunny named Mes that carries the brand's emotional range through a single accessory. No crown in onboarding: welcoming. Gold crown in the paywall: aspirational. One character, two registers.

Onboarding · No crown
Paywall · Crowned

Color tokens.

Deep midnight base, a saturated iMessage-blue accent, and a warm cream for text, never pure white. Two hairline tints carry every division.

--bg
#06070C
--surface
#15182A
--accent
#0A84FF
--text
#F5F4ED

Typography.

Bricolage Grotesque carries every display moment; Geist handles body and UI; JetBrains Mono labels the technical and editorial eyebrows.

Bricolage Grotesque · DisplaySix tools, one language.
Geist · BodyTrust comes from agency, not accuracy.
JetBrains Mono · Technical01 · Designing for AI

Components.

Bubble UI as the dominant metaphor. Liquid-glass pills, a custom bounce button, spring-physics progress, each a reusable view shared by both targets.

Sounds good
Bubble
Toggle
Glass pill
Continue
Bounce button
Progress

Design → Xcode.

Xcode
Xcode — Mes running in the simulator
design-xcode.png
Swift
🗳 Live Poll
Where for dinner tonight?
Tacos52%
Ramen31%
Pizza17%
3 votes · live

Every component existed in design and SwiftUI at once. No handoff, just the same person committing both files to git in the same hour.

07 · CONSTRAINTS

Three constraints. Three design decisions.

iMessage extensions are the most constrained surface Apple ships. Every limit became a design problem, and each solution shaped the product's character.

The 60MB ceiling.

THE CONSTRAINT.

iMessage extensions are hard-capped at 60MB of memory. The AI model can't run inside the extension, and calling the Gemini API directly is a crash waiting to happen.

THE DESIGN RESPONSE.

The main app becomes the AI brain; the extension stays a thin client. API calls fire from the main app and write results to an App Group container. The bridge is a URL scheme handler (mes://) the user never sees but the architecture depends on.

THE DESIGN IMPLICATION.

Responses had to feel instant in the extension even though they were generated outside it. The fix was eager pre-generation: the extension requests replies before the user has even picked a tone.

APP GROUP BRIDGE · SWIFT
// AppGroupBridge.swift: extension → main app communication.
// iMessage extensions have a 60MB ceiling, so AI calls run
// in the main app and results sync via App Group.

enum AppGroupBridge {
    static let appGroupID = "group.com.gya.mes"
    static let defaults   = UserDefaults(suiteName: appGroupID)!

    static func requestReplies(for incoming: String, tone: Tone) {
        defaults.set(incoming, forKey: "pendingMessage")
        defaults.set(tone.rawValue, forKey: "pendingTone")
        NotificationCenter.default.post(name: .mesAIRequest, object: nil)
    }

    static func cachedReplies() -> [String] {
        defaults.stringArray(forKey: "cachedReplies") ?? []
    }
}
The 60MB memory ceiling

No UIApplication.shared.open.

THE CONSTRAINT.

Inside an iMessage extension, you can't open URLs the normal iOS way: Apple's sandboxing forbids it. That breaks Venmo, Cash App, every deep-linking pattern designers reach for first.

THE DESIGN RESPONSE.

Every payment handoff goes through a NotificationCenter event the main app observes: the extension posts the intent, the main app acts on it. Tapping Venmo opens Venmo, even though the actual call happens in a different process.

THE DESIGN IMPLICATION.

The bill split UI couldn't promise instant handoff, so it doesn't try. Buttons animate to an "Opening Venmo…" state for ~200ms before the app switches. The micro-interaction covers the architectural seam.

iMessage is stateless.

THE CONSTRAINT.

An iMessage app has no backend. Every piece of state (poll votes, wheel results, countdown updates) lives inside the MSMessage URL itself. The message is the state.

THE DESIGN RESPONSE.

Polls re-render and re-insert into the thread on every vote, replacing the previous version. The card looks live, but it's recomposed each time: the user perceives real-time updates while the system performs stateless replacements.

THE DESIGN IMPLICATION.

Visual continuity does the work backend persistence usually does. Spring-physics animations make a recomposed card feel like the same card updating, not a new one replacing the old.

08 · PROTOTYPING & TESTING

Used every day,
then handed to strangers.

Two passes pressure-test the design. First I dogfooded the working extension on my own threads across the build; that pass is done and already moved the product. Then I scoped a moderated study to put it in front of people who have never seen it, protocol below, ready to run.

Track 01 · DogfoodingDone

Ran the working extension in real conversations across ten build sessions. Every awkward tap became a to-do. Three of them moved the design:

Friction

Picking a tone after seeing the draft felt like grading the AI, not directing it.

Change

Moved tone selection above the draft, so intent is set before a word is generated.

Friction

The first prototype dropped the draft straight into the input, one tap from an accidental send.

Change

Added a preview state: the draft never enters the thread until an explicit Send.

Friction

Regenerate was buried in a menu, so a bad draft felt like a dead end.

Change

Promoted regenerate to a persistent, cheap action right next to Send.

The pivot
Tone-before-draft was the moment the product clicked, the difference between steering the AI and auditing it after the fact.
Track 02 · Moderated studyScoped

Five first-time users, five real group-chat jobs, one question the study exists to answer: can someone trust AI to help them text without it ever sending something they didn't choose?

Recruit
Who
iMessage users on iOS who text in at least one active group thread every week.
How many
Five, the point where each added participant stops surfacing new problems.
Mix
Three new to AI writing tools, two regular users, to separate first-run trust from habit.
Screen out
Anyone who has seen Mes, so first-touch reactions stay uncoached.
Format
30-minute remote moderated session, think-aloud, one ease question after each task.
Task script
01

Reply to a group message with AI, in a casual tone, without leaving the chat.

Tone-set reply sent, zero app switches.
02

You don’t like the first draft. Fix it before it goes out.

Edits or regenerates, previews before Send.
03

The group is picking a hike day. Start a poll everyone can vote on.

Poll posted with two or more options.
04

Dinner was $84 across four people. Split it and send.

Correct $21 share posted to the thread.
05

A friend texts in Spanish. Read it, then reply in Spanish.

Inbound translated, outbound composed.
Success bar
Pre-registered · target
AI-reply task success≥ 4 / 5 unaided
Accidental sends0
Time to first send< 20s
Ease per task (SEQ)≥ 5.5 / 7
Overall usability (SUS)≥ 75
09 · THE JOURNEY

Four months. One person. One ship.

Jan 2026
01 ·Concept & PRD

Competitive research across 400+ iMessage apps surfaced the gap: no single app handled polls, AI reply, and bill split at a feature-worthy level of polish. PRD v2 set one quality bar: would Apple feature this?

From the PRD · Phase 01 / 07scroll →
PRD v2 · Phase 01 / 07
Competitive Research & Feature Scope
iMessage tools landscape · Feature gaps · Design north star
Jan 3–14, 2026
Gazi Yeasin Arifin
● Approved → Architecture
01 · Research Scope
412iMessage apps screened
App Store keyword search, AppFollow top-charts, and direct install reviews. Categorized by feature type, native vs. linked-out, and design quality against the most polished apps in the category.
Does one extension combine AI reply, polls, and bill split at award-level craft?
02 · Competitive Landscape
AppAIPollSplit
Polly
Splitwise
ChatGPT~
GamePigeon
Mes
0 of 412 iMessage-native extensions combined all three at design-award quality. The gap is wide open.
03 · Feature Scope — PRD v2
P0
AI Reply
Tone-aware, multiple options, bubble-native
P0
Live Polls
Real-time feel, spring animation, no backend
P0
Bill Split
One-tap Venmo / Cash App handoff
P1
Sticker Packs
Curated art, App Group sync
P1
Spin Wheel
Physics deceleration, result card
P1
Countdown
Recipient local time, re-renders on view
04 · Design North Star
Apple-feature quality
The bar from day one. Every feature is held to one question:
“Would Apple feature this?”
Delight · MotionAccessibility · AACraft · Every pixelNative · Apple-feel
Feb 2026
02 ·Architecture

Dual-target architecture: main app (paywall, onboarding, sticker store) plus extension (all six tools), with App Group as the shared data layer and the Gemini API routed through the main app only. The constraint shaped the architecture; the architecture shaped the UX.

From Xcode · Phase 02 / 07scroll →
Xcode — dual-target project structure
Xcode — App Group shared data layer
Xcode — Gemini API routed through the main app
Feb – Mar 2026
03 ·Build

Ten build sessions across six weeks, each feature an isolated SwiftUI module. Bubble UI, liquid-glass cards, and the dark-blue extension aesthetic developed in parallel, so the visual language emerged from the components, not the reverse.

From the build · Phase 03 / 07scroll →
Build — SwiftUI module
Build — SwiftUI module
Build — SwiftUI module
Build — SwiftUI module
Mar 2026
04 ·Design system

Plush bunny mascot finalized. Fluffy-fabric paywall. SF Rounded typography. Animated onboarding with looping video backgrounds. Every component documented in Swift and design files at once.

From the design system · Phase 04 / 07scroll →
Design System v1 · Phase 04 / 07
Mes — Design System v1
Visual tokens · Component library · Motion system · Mascot
March 2026
Gazi Yeasin Arifin
● Complete
Surface Strategy
Main App
Paywall & Onboarding
  • Full-bleed fluffy fabric texture
  • Plush mascot · 2 variants
  • RevenueCat paywall · light-mode capable
iMessage Extension · always dark
Extension Surface
  • Deep midnight #06070C · liquid glass
  • Compact density · under 60MB
  • Pure SwiftUI, no UIKit
Color Tokens
--bg
#06070C
Extension background
--surface
#15182A
Card, elevated layer
--accent
#0A84FF
iMessage blue · CTA
--text
#F5F4ED
Primary · warm cream
Typography
SF Rounded
Display · Mascot
Mes. Reply.
SF Pro Text
Body · UI
Reply in your voice.
SF Pro · tabular
Countdown numerics
23 · 14 · 07
SF Mono
Labels · technical
01 / AI REPLY
Mascot System
Mes — No Crown
Variant 01 · Onboarding
Mes — No Crown
Welcoming · Approachable
Mes — Gold Crown
Variant 02 · Paywall
Mes — Gold Crown
★ Aspirational · Premium
Component Library
Sounds good 🙌
Bubble UI
Spicy 🌶️
Tone Chip
Continue →
Bounce Button
Poll Bars
Motion System
Reply bubble
spring(200, 28)
280ms
Panel open
cubic-bezier(.22,1,.36,1)
360ms
Bounce press
spring(400, 35)
200ms
Poll bar fill
spring(120, 15)
600ms
Spin decel
easeOut + rubber-band
2.4s
Documented · Tested in Xcode 16
Bubble UI
Glass Card
Tone Chips
Bounce Button
Progress Bar
Poll Card
Bill Split
Spin Wheel
Countdown
Sticker Grid
Mascot ×2
Paywall
Onboarding
Translate UI
App Icon
Widget Kit
Apr 2026
05 ·First submission

Rejected. Guideline 2.1: App Review wanted a screen recording of the IAP flow end-to-end. Guideline 3.1.2c: free-trial toggle on the paywall plus an EULA link. And the primary language was accidentally set to Danish, which App Store Connect will not let you revert.

From App Store Connect · Phase 05 / 07scroll →
App Store Connect — first submission rejection
Apr 2026
06 ·Fixes & resubmit

Added English (U.S.) as the primary language, filled the Danish fields with proper translations, and reconfigured the StoreKit trial flow. Shipped localization for 10 languages: ES, PT-BR, FR, DE, JA, IT, KO, AR, NL, TR.

Fixes & resubmit · Phase 06 / 07scroll →
Fixes & resubmit
Fixes & resubmit
Fixes & resubmit
Fixes & resubmit
May 2026
07 ·Launch

Mes: AI Reply & Translate goes live. Weekly $1.99 · Monthly $5.99 · Yearly $39.99. Six sticker packs. Ten languages. Held to that same Apple-feature quality bar from concept through ship.

Launch · Phase 07 / 07scroll →
Launch — App Store listing
Launch — App Store listing
Launch — App Store listing
10 · REFLECTION

In most AI products, the UI displays the model's output. In Mes, the UI gives the user control over the model's voice. That inversion is the whole case study.

What I expected to be hard, getting Gemini to return good replies, was the easy part. What I expected to be easy, making users want to send an AI-generated reply, was the entire problem. Every design decision in Mes routes back to that inversion.

And it generalizes. In generative AI, agency is the trust mechanism, not accuracy: the user who steers the model trusts the result; the user who audits it doesn't. Mes is one expression of that in a consumer surface, but the same problem runs through every enterprise AI product I've used, where the model acts on the user's behalf and the user can't steer how. Same pattern, same fix.

Building Mes alone, design to code to ship, with Claude Code as my engineering partner collapsed the design-engineering loop like nothing I'd worked in before. I'd sketch a tone-chip interaction in the morning and have it in SwiftUI by lunch. The story above is the design story; the deeper one is what becomes possible when the same person owns the decision and the implementation.

Let's build something people remember

From enterprise teams to growing startups.

Let's talkarifin.yeasin@gmail.com