Inspiration

My grandmother is seventy-four. I have asked her the same three questions my whole life: how are you, have you eaten, are you warm enough.

I know she moved to a city when she was twelve. I do not know whether she was frightened. I have never asked, and I am running out of years to.

The problem was never that we don't talk. It is that nobody ever hands us the question. Family-history apps solve the wrong half of this. They give you somewhere to store answers but no reason to ask, and they quietly turn the older person into a subject being interviewed. I wanted something where we are both answering.

What it does

One question a day, answered blind. Both of you get the same question. You answer in your own voice. Neither of you can see the other's answer until both are in, so nobody is performing for anyone.

The reveal. Both stories open side by side, and for a few seconds nothing happens at all. Then a phrase in each one catches, two stems come up out of the two pages, and where they meet a flower opens that is literally half of each of you: her half painted as a faded botanical plate, yours as a calmer contemporary one, joined under a single centre. No two discoveries ever open as the same flower.

The garden is the record. Every plant in it is a story somebody actually told. Every bud is a question still waiting for an answer. Every flower on the binding is something the two of you turned out to share. It gets fuller because there is more of it. There is no level, no streak, no score, and no progress bar anywhere in the product.

The only reaction is a real question. No hearts, no likes. After you hear her story for the first time there is exactly one thing worth asking: had you heard this before? "I never knew this" and "I remember this" are not a rating. They record where that memory already stood between you, and the ones you had never heard get their own shelf in the archive.

Every discovery opens the next question. A shared thread is only worth something if it leads somewhere, so each one arrives with a follow-up the two of you can actually ask each other. Send it and a new branch starts growing.

Meet Her at My Age. A page deeper in, where you stop meeting your grandmother as your grandmother and meet the person she was at the age you are now: same first job, same living away from family, same not knowing what comes next.

Where the AI is, and where it isn't

The AI is never the protagonist here. It does not write, summarise, rewrite, or speak. Both voices on screen are human and unedited.

What the model does is read two stories and ask one question: is there something real these two people actually share? It is allowed to answer no, and expected to. When it finds nothing you get "Two stories, kept side by side," and no flower opens. That refusal is the feature. A flower means something precisely because it cannot be manufactured.

Getting that judgement right was most of the work. Early versions were too generous. They would connect drying persimmons in 1974 to debugging CSS in 2026 under the theme "Patient Work": technically a pattern, humanly nothing. The rule that fixed it was structural rather than stylistic.

What counts is a feeling, a need, or a relationship. Never an activity, and never a personality trait.

With that constraint the model started finding the connections a person would actually be moved by, and rejecting the ones that only look like patterns. There is no chat interface, no sparkle icon, and the phrase "AI-powered" appears nowhere in the product. The only thing a user ever sees is: something bloomed between your stories.

How we built it

Next.js 16 (App Router), React 19, TypeScript, Tailwind CSS v4, deployed on Vercel.

The connection engine is the Vercel AI SDK v7 with Claude, returning a zod-validated object: a theme, a headline, a statement, a follow-up question, and the exact substring in each transcript that caught. Those substrings are what the reveal marks on screen, so the highlight is always the model's own evidence rather than decoration.

Voice is the browser's MediaRecorder plus the Web Speech API for a live transcript. The recording is the memory and the text is a convenience; the app keeps the audio either way.

The botany is the part we are proudest of and the part nobody asks about. Every specimen is a watercolour painting, lifted off its sheet by treating white as nothing and everything darker as pigment. That is an unpremultiplied alpha key, and it keeps the soft faded edges that a hard threshold would chop off. Two hands: her blooms are warm and veined and gone faded, yours are cooler and simpler, and each has its own leaf.

A shared flower is composed at render time, the two blooms clipped on one line and joined under a single centre, so which two halves, how far it leans and how wide it opens all come from the discovery itself. That is why no two are alike.

Stems are geometry, but painted: a real wash tiled behind the shape, an edge pushed about by fractal noise the way a brush wanders, and enough translucency to let the paper through. The rule throughout was simple. Anything that has to animate is code. Anything that has to look like somebody made it is a painting.

Challenges we ran into

Teaching the model to say no. Too strict and it missed threads two people would recognise instantly; too loose and it invented poetry. Three passes and one structural rule got it to six out of six real connections, with the invented ones refused.

Leaves lying back across the stems they grow out of. Mirroring a drawing in the placed frame does not flip it. It turns it round to face the other way, so every "flipped" leaf was pointing backwards over its own branch. It has to be mirrored about the specimen's own axis, which changes the hand and keeps the direction.

A stretched flower is an oval. The garden fills a page whose shape changes, and a fixed viewBox stretched to fit turned every bloom into an ellipse. The scene is now 1440 units wide and however tall the page happens to be, so the scale stays uniform and nobody's painting is distorted.

A garden that vanished on a phone. Fitting the full width into 420px shrank a flower to a 40-pixel thumbnail and the page read as empty. On a narrow screen the view moves in on the middle instead of fitting all of it: the same drawing, fewer plants, full size.

Flat-filled stems read as sticks no matter what shape you give them, and a taper that stops just short of nothing leaves a blunt cut across the end of every branch. Both were invisible at a glance and obvious at 200%, which is exactly when a product about paying attention has to hold up.

Accomplishments that we're proud of

The pause before the bloom. Two stories sit on screen with one closed bud between them and nothing else for several seconds. Everything in us wanted to fill that gap with a spinner or a "finding connections…" line. Leaving it empty is the best decision in the product.

A flower that cannot be faked. The model is allowed to find nothing, and when it does, nothing opens. Every bloom in a garden is therefore evidence.

No score anywhere. No levels, streaks, points, or progress bars. The only way the app tells you how far the two of you have come is that there is more garden than there used to be.

One reaction, and it isn't a like. Replacing hearts with "had you heard this before?" turned a reflex into a small act of attention, and produced a genuinely new artefact: a shelf holding the pieces of her life you met for the first time.

What we learned

Restraint is a feature you have to build. Every empty second and every missing button took more work than the thing it replaced.

Constraints make models better, not smaller. The connection engine became dramatically more human once we told it what doesn't count. "Never an activity, never a trait" removed more bad output than any amount of prompt polish.

Design language is load-bearing. Once the two generations had genuinely different hands, the shared flower could be half of each, and that single image says more about the product than any copy on the page.

Look at your own work closely. Almost everything we fixed was invisible at a glance. A product about paying attention has to survive being paid attention to.

What's next

Two devices, two people. A garden currently lives in one browser. The data layer is already shaped for a real backend, so the next step is proper pairing, invites, and sync.

Transcription that isn't the browser's. Web Speech is Chrome and Safari only, and it struggles with accented English and with older voices, which is exactly who this is for.

Questions that know where you are. A longer, better-sequenced set that notices what the two of you have already opened.

Something you can hold. The garden and the stories printed as a book at the end of a year, because the people this is built for do not want an app.


The demo family is fictional and their photographs are generated, so the whole experience can be seen without a second person. Everything they say was written for the demo. The connection between any two stories, however, is found live by the model at the moment you open them. It is not scripted, and it sometimes finds nothing.

Built With

Share this project:

Updates

Submission history