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.
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.
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.
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.
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.
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.
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
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.
Reading those messages, I just paused. This was the reason I built 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.
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.