Every app I admire spends its life solving discovery. We built one where
you are invisible by default, there is no follow button, and no amount of
searching will surface you.
That is not a roadmap gap. That is the product.
The bet
Gifting is not a discovery problem. Nobody in 2026 struggles to find things to buy. Amazon alone will happily show you four hundred million options and a carousel of regret. The problem is narrower and much more annoying: you do not know what your sister actually wants, and asking her ruins the only interesting part.
Every social wishlist I looked at solved this with a profile. A public page, a follower count, a feed. Which quietly converts a private list of things you want into a performance of taste. People notice. So they curate. So the list stops being true, and a list of gifts that isn’t true is worse than no list at all.
And they share a second habit that bothers me more, because it is invisible: they are all list-based. You create a list. A baby registry, a wedding registry, a Birthday 2026 list. Which quietly means the product only exists during an occasion. When you spot the perfect thing in the middle of March, you have nowhere to put it, so you do what everyone does and remember it wrong six months later.
Huff has no lists to create. You have one wishlist, it is always on, and you add to it in the two seconds after you see the thing. That is the only moment anyone reliably knows what they want.
So we turned the arrow around. On Huff you can see someone’s wishlist only if they have your number saved in their phone. Not if you have theirs. Theirs.
How it actually works
The awkward part of a contact-graph product is that contact books are the most sensitive thing on a phone, and every company that has ever asked for yours has gone on to do something regrettable with it.
So we never receive them. Your contacts are normalised and hashed on the device with Argon2id, salted with a server-side global salt plus an epoch salt that rotates daily, then truncated to 96 bits before anything leaves the phone. What our database holds is a pile of anonymous fingerprints that expire into uselessness. The only phone number we store in plaintext is your own, because we have to text you a code. In plain English: your phone turns your address book into confetti before anything leaves it, and nobody here can put the confetti back, least of all me at 2am with a debugger.
This is not a privacy policy. It is an architecture. We cannot sell a social graph we were never given, and I find that a far more convincing promise than a paragraph in a footer.
The rest is deliberately boring. You add things with your phone’s share sheet. The app never asks you to copy a link, because nobody wants to be a data-entry clerk for their own birthday. Our server unfurls the URL through an adapter chain: a site-specific parser if we have one, then structured JSON-LD, then plain OpenGraph. And when someone taps Gifted, that item goes into a thirty-minute exclusive hold, so two cousins in two cities don’t independently buy the same blender.
Where we are
- 1,083people signed up
- 9countries they’re in
- 1,956things added to a wishlist
- 36of them actually gifted
Read those last two together, because that is the whole company in two numbers. Nineteen hundred and fifty-six things that people want badly enough to save. Thirty-six of them actually bought. The gap between those two numbers is the product I am building.
Nine countries is a slightly cheeky way to say a thousand people in India and a rounding error everywhere else: nine in the UAE, seven in the UK, three in Canada, and one lonely pioneer each in the US, Lebanon, Türkiye and Germany. I like that column more than the big one. Gifting across a diaspora is the version of this problem that genuinely hurts, and those are the people feeling it first.
Under that: FastAPI and Postgres on Fly, a React Native app on both stores, Firebase for phone auth, and a scraper that has strong opinions about Indian e-commerce. iOS 1.0.37 went up today. The whole thing is small enough that I know what every table is for, which I am told is a phase.
Five things that went wrong
I would rather write this section than the previous one, because the previous one is a scoreboard and this one is the actual education.
Two releases shipped pointing at localhost. The config file is gitignored; a fresh checkout didn’t have one; the build tool bakes environment variables in at compile time. So the app was entirely broken in production, and invisible in our telemetry, because the missing file also held the telemetry keys. The perfect crime, committed against ourselves.
iOS lets people share only some contacts. We inferred permission from how many contacts came back. Seventeen percent of synced users therefore had a quietly crippled graph, and no way to know.
Forty-four percent of people who finished onboarding never synced at all. A check threw an exception before the sync started. No error screen, no event, no complaint. Just half our funnel walking into a room with the lights off.
“The app feels slow” was not the app. It was a database in the wrong city, cold starts, and a cache we were wiping on every launch. We nearly rewrote the client to fix a hosting decision.
And this week, doing design work: every confirmation dialog in the app had letter-spacing tuned for 32px text being applied at 22px. A progress bar that rendered permanently full. Fifty-seven animations, not one of which respected the operating system’s “reduce motion” setting.
Look at the shape of that list. Almost nothing failed loudly. Not one of those arrived as a crash report or an angry email. They were all found by going and looking, usually at something adjacent, usually by refusing to accept a number that seemed slightly off.
What we’re building next
Near term: shared lists, so a family can coordinate one gift instead of six sweaters. Better extraction, so pasting any link from any shop on earth just works. We’re teaching a model to read product pages that have no structured data, which is most of them. And nine countries’ worth of phone formats, currencies and address shapes, because gifting across a diaspora is the version of this problem that actually hurts.
Further out, the thing I keep circling: “things I want” is a durable object and nobody owns it. Your search history is rented to advertisers. Your cart is owned by one retailer. Your Pinterest board is aspiration, not intent. A list you maintain honestly, shown only to people who already know you, is the most valuable and least exploited object in commerce. The only way to hold it is to build something that structurally cannot spy on you.
Birthdays are the wedge. The wedge is not the point.
Operator
If someone you know saved your number, you might already be visible. Sorry.
