Blushing app icon
Blushing is a small web app for asking someone out: one lovely invitation, one private link, and a "no" button that refuses to make it easy.

Most of my projects are serious. An accounting engine. A retirement planner. A workflow analyzer. Blushing is not that.

Blushing started from a much smaller, sillier question:

Can a piece of software make a genuinely nerve-wracking human moment feel a little braver — and a lot more fun?

The moment I had in mind is asking someone out. Over text, it’s brutal. You type it, delete it, retype it, and whatever you send undersells how much you mean it. A plain “wanna go out sometime?” carries none of the courage it took to press send.

So I built a page that carries some of that for you.

The shape of it

You write a warm, personalized invitation and share a private link. The person you’re asking opens it to a gentle page made just for them. Say yes and it opens a sweet little planner — date, time, place — and an add-to-calendar keepsake. Try to say no, and the button dodges your cursor, pleads a little sweeter each tap, and eventually summons a tiny snowstorm before it lets you.

It’s free to create and send. Nobody needs an account to answer.

The “no” button is the whole personality

The joke is the product. I spent more time on the button you’re not supposed to click than on the one you are.

On desktop it runs from the cursor — detaching from the layout and roaming the page — then settles just long enough to be catchable, and darts off again at a random interval so it never feels mechanical. On a phone, where there’s no cursor to flee, it dodges side to side within the card instead. Every tap swaps in a fresh line of copy that escalates from “are you sure? 🥺” to increasingly dramatic pleading, and past a certain number of nos the whole scene turns to snow and dusk.

None of that copy is templated. The questions, the plea lines, and the post-yes celebration are drawn from large, seeded copy banks — so each invite feels written, not generated, and stays consistent every time that link is opened.

Selling the yes, not the software

Here’s the part I find most interesting as a product decision.

Creating and sending an invite is free. The thing worth paying for isn’t a feature — it’s the answer. When someone says yes, the sender unlocks the plan’s details as a small keepsake, framed at the emotional peak rather than behind a paywall on the way in.

The trick is that the celebration is split across two doors. The person who says yes gets their celebration for free, kept on their own device. The sender unlocks the details on a separate private page — so the payment never spoils the recipient’s surprise. Pricing routes by country: a QR payment for the Philippines, a card checkout for everywhere else.

The stack, and one deliberate constraint

Blushing is an Elixir and Phoenix app, with the domain modeled in the Ash Framework on PostgreSQL, background jobs on Oban, deployed to Fly.io behind Cloudflare.

The deliberate constraint: it’s controller-rendered HEEx — no LiveView, no single-page framework — served under a strict content-security policy that forbids inline scripts. Every one of those animations, the runaway button, the confetti, the snowstorm, the melt-into-sunshine payoff, is hand-wired vanilla JavaScript loaded from a single bundle. That constraint kept the whole thing small, fast, and honest about what’s actually running on the page.

What I learned

Playful software is still software. The runaway button needed to stay reachable for keyboard and touch users. The celebration had to survive a browser restart. A full-page navigation freezes mid-animation, so the hand-off to the celebration screen needed a warm curtain to cover the frozen frame. The joke only works if the engineering underneath it is quiet and correct.

Mostly, though, Blushing was a reminder that not every project has to be earnest to be worth building. Sometimes the point is to make one small, scary, wonderful moment feel a little kinder.

Current status

Blushing is live at blushing.app. The product page is here.

If you’ve ever wanted to ask someone out and couldn’t find the words, go make one — or say hello.