Akshita Sodhani — Product Designer 01 — The Product
heartfelt

I built the thing I kept meaning to send.

There are things we think about saying — and somehow keep delaying. So I built one. Heartfelt lets you send a gratitude card to someone you care about. No account, no download. Pick a feeling, write your message, share a link.

Timeline10 days
RoleSolo — Design + Build
StackReact · Vite · Supabase
StatusLive ✦
Heartfelt — card creation with Gratitude category
02 — Why I Built This

Life makes everything feel urgent
except the people who matter.

There is always something to catch up on, something to prove, somewhere you feel behind. In the middle of it, I realised I had gone quiet with people I actually care about. Not because I stopped feeling things — just because there was never a moment that felt right to say them.

So I started sending messages. To friends, family, people I had not spoken to in years. Small, honest things — I have been thinking about you. Thank you for that thing you did that you probably forgot about.

The response was always the same. Something between surprise and warmth. Like they needed it too.

That gap felt worth closing. So I built something for it.

03 — The Build

Three decisions
that shaped the product.

I gave myself 10 days — intentionally. One idea, one person, no excuses. I pushed changes to GitHub more than 80 times. Tweaked JSX files, redeployed on Vercel, iterated on what was visible on screen in real time. React, Vite, Supabase — tools I was learning while using them.

— The Wall

Cards were being sent. But from the outside, Heartfelt looked empty.

So I built a Gratitude Wall — a live feed of cards people had sent. Not names, not private messages. Just the feeling, visible. Proof that something real was happening.

Then I realised I had two completely different people to design for. Someone arriving for the first time needs to understand what Heartfelt even is. Someone returning just wants to see the wall. Same page. Opposite needs.

I built two states. New users see the story. Returning users see the cards. And one small addition — a "just now" pill. Someone sent something moments ago. No extra noise. Just enough to make the whole thing feel alive.

First visit — new user state
Gratitude Wall — new user state
Returning — existing user state
Gratitude Wall — returning user state
— The Blank State

The hardest moment is when someone opens it wanting to say something — and freezes.

I had seen this in my own testing. The cursor sitting still. The category unselected. The message unwritten.

So I made the categories do more work. Six of them — gratitude, love, birthday, make amends, congratulations, just because. Each with its own visual mood. Each with Heartfelt Suggestions — not writing for the person, just giving them a place to start.

Heartfelt dashboard — six categories

The difference between a nudge and a replacement.

Everything stayed calm. Neutral colours. No visual noise. The emotion had to come from the person. The product just had to stay out of the way.

— The Feature I Did Not Ship

I built it. I believed in it. But I left it out.

I wanted to add a "Say it better" button — powered by Gemini — that would refine whatever someone typed into something more expressive. I built it. I spent two days on it. I genuinely believed in it.

Then I sat with what it was actually doing. Someone sits down to tell another person they are grateful. They write something imperfect and honest. And a model smooths it into something that sounds better — but is less theirs.

The rough edges are part of what makes it real. I left the button out.

The integration kept breaking anyway. Ten days was the deadline. I shipped what was working — and I think the product is more honest for it.

That imperfection is part of what makes it real. That was reason enough.
On removing the AI feature · Decision 03
04 — The Moment It Became Real

I shared it with 15 people first.
Intentionally.

A close group — so if something broke, I could fix it quietly. Things did break. Links redirected wrongly. Cards would not open. I was pushing fixes in real time, changing lines of code between shares.

But then the messages started coming in. People used it. They understood it without any explanation. And when the recipient opened the card, the subtle interaction I had added landed exactly the way I had hoped.

Real reactions from friends and family
Heartfelt — shipped in 10 days

Reading those messages, I just paused. This was the reason I built it.

05 — What I Would Do Differently

I did not start this
planning to ship it.

The original intent was simpler — build the visuals, test my own ability, see how far I could get. But the product kept becoming more real, and I kept going.

What I would change is not the thinking but the starting point. Next time I begin with a shipping intent from day one — not arrive at it halfway through.

Version two interests me more as a platform than a product. A paid layer for teams — where appreciation becomes part of how organisations actually work. Peer recognition, manager-to-team moments, structured gratitude built into workflows. The personal version proved the idea works. The next question is how far it scales.

06 — What This Changed

I did not know if I could
actually ship something.

Then I did.

The noise around AI and designers building faster — I could not relate to it until Heartfelt. After it, I could not un-relate to it. Something settled when the first real user opened a card I had built — not designed, built.

A designer who ships is a different thing than a designer who designs. Heartfelt made that a fact, not a theory.

And that opens a different question — not what can I design, but what can I build next.

Behind the scenes — 80+ commits
So much love and warmth — March 2025
heartfelt-send.vercel.app
Built with
React Vite Supabase Vercel Claude