The Bijoux app icon

Bijoux

iOS app · designed, built and shipped solo

I invented a way to give someone a small object that then lives on their phone’s Dynamic Island. Nobody had done this before, which meant nobody knew how to use it — so the real design work was teaching a brand-new gesture without ever explaining it.

Role

Product design, art direction, engineering

Platform

iOS · SwiftUI

Shipped

Launched on TestFlight

Status

Beta tested in production with 10 users

The pattern I was inventing

Bijoux app screen

A friend hands you a charm. It hangs from a gold thread across your Dynamic Island — the one piece of screen you glance at a hundred times a day — and it stays there until you pass it on.

You can wear three. Your dish holds twelve. You cannot make one for yourself; every object you own came from a person. I built those limits as the physics of the world rather than settings, because scarcity is what makes a gift mean anything.

No app on iOS behaved like this, so there was no habit to borrow from. Every screen had to carry the explanation itself.

Teaching it without a tutorial

My first instinct was to describe the idea. It didn’t work — a carousel explaining a gesture nobody has felt is just words. So I made the app perform the interaction instead.

Three lines and one username. The whole idea in the shape it will actually take.
Three lines and one username. The whole idea in the shape it will actually take.
Then three bijoux arrive, using the exact animation a real gift uses. Your first experience of the app is the thing the app is for.
The dish and the thread are literal: you drag a charm up to wear it. The metaphor is the control.
The Dynamic Island expanded, showing a heart labelled Welcome and a cat labelled Miso hanging from the gold thread
And the same thread is waiting on the Dynamic Island. The charm you just dragged up is hanging there under the name its giver chose — so the gesture in the app and the thing you glance at all day are visibly the same object.

The half-second that made it feel unsure

Wearing a bijou is one gesture: drag it up to the thread. But for a long time the landing had a stutter in it. The charm went where your finger left it — and then the layout recalculated, and yanked it somewhere else, shoving its neighbours aside to keep everything evenly spaced.

Both things were individually correct. Evenly spaced charms are what make the Dynamic Island legible at 22 points tall. Landing under your finger is what makes a drag feel like a drag. They just arrived in the wrong order, one frame apart, and the result read as the app second-guessing you.

Before

Every charm that lands shoves the others along. Watch the ones already on the thread twitch sideways each time.

After

It flies from your finger to its place in one motion, and nothing already hanging moves at all.

The fix was ordering, not animation: hand the charm to the bracelet while it is still drawn under your finger, and release the drag one runloop later — so the flight begins where you let go instead of where the charm used to live.

Is it sent? Which one is new?

Two moments confused everyone, and they were the two that mattered most: whether a gift had actually gone, and which bijou had just arrived. In a familiar app you’d borrow the answer from Messages or AirDrop. Here there was nothing to borrow, so I had to build the answer into the screens.

My fix was to stop treating a send as an event and start treating it as a handover between two people — so every screen below belongs to one half of the same exchange, marked with whose phone it is, each always showing where the handover has got to.

On the giver’s phone

Their username appears the moment they're ready to receive. Tapping it offers the bijou — it doesn't send it.

Who is it going to?

Their username appears the moment they're ready to receive. Tapping it offers the bijou — it doesn't send it.

The screen answers out loud: waiting for nectarine87 to say yes. Nothing has left your phone yet, and it says so.

Did it send?

The screen answers out loud: waiting for nectarine87 to say yes. Nothing has left your phone yet, and it says so.

On the receiver’s phone

They see the real object, its name and who it's from, with the freedom to decline. Their yes is what completes the send.

What am I accepting?

They see the real object, its name and who it's from, with the freedom to decline. Their yes is what completes the send.

It lands with a gold shimmer and a small red badge, and keeps them until the first time you touch it. Your dish tells you what's new.

Which one just arrived?

It lands with a gold shimmer and a small red badge, and keeps them until the first time you touch it. Your dish tells you what's new.

Objects worth keeping

Thirteen painted charms in three inks. My rule for the set: recognisable by silhouette alone, because on the island a charm is 22 points tall.

heart
star
flower
glasses
coffee
croissant
cat
note
moon
cake
wine
book
bow

And when thirteen isn’t personal enough, you draw your own. Four pens — the brand inks, nothing else — so a hand-drawn bijou still belongs beside the painted ones. It lands on your friend’s island in their own hand.

Drawing over a stencil you can summon by name.
Drawing over a stencil you can summon by name.

Where AI actually belongs here

Nobody wants to be handed AI-generated art. The whole value of a bijou is that a person made it for you — generate that and you’ve generated away the point of the app.

But testers kept telling me the same thing: I can’t draw. So I pointed Apple’s on-device image generation at the one job it’s genuinely right for — not making the gift, but making a stencil to trace. Name anything, and it appears faintly under your canvas. The bijou your friend receives is still drawn in your own hand.

Three rules make that line hold. The stencil renders outside the export path, so it is structurally incapable of ending up in the gift. Your words are quietly wrapped in the app’s own visual language, so what comes back already belongs to this world. And it fails open: if the model balks, your own words are retried before you ever see an error.

Ask for any stencil by name. It's generated on the phone — nothing about your gift leaves it.
Ask for any stencil by name. It's generated on the phone — nothing about your gift leaves it.
Buster is her boyfriend's dog. She can't draw — so she asked for a fluffy-dog stencil, traced it, and named him. Now Buster hangs on his bracelet, in her own hand, for as long as he wants to wear him.

Two people, wearing each other’s gifts

A newly engaged couple were among the first people to use Bijoux. They drew each other matching bijoux by hand and put them on their home screens, so the other person is there every time they unlock their phone.

These are their phones, not mine — and it’s the part I’m proudest of. Two people who had never seen the pattern before understood it well enough to use it for exactly what it was for, without me in the room.

One phone: a bijou with their partner's name in gold script, hanging beside a Celtics crest and Sweet Syrus.
One phone: a bijou with their partner's name in gold script, hanging beside a Celtics crest and Sweet Syrus.
The other: “My beautiful Divya” on a little red heart, a moon called Night, and Duncan.
The other: “My beautiful Divya” on a little red heart, a moon called Night, and Duncan.

Every screen here is SwiftUI I wrote — the physics behind the swaying charms, the pipeline that produced the charm art, and the constraints of putting a live bracelet on the Dynamic Island. I wrote that side up separately.

Build details