{"id":181,"date":"2026-10-14T13:37:02","date_gmt":"2026-10-14T08:07:02","guid":{"rendered":"https:\/\/huffme.com\/blogs\/?p=181"},"modified":"2026-10-14T13:37:02","modified_gmt":"2026-10-14T08:07:02","slug":"founders-note-2","status":"publish","type":"post","link":"https:\/\/huffme.com\/stories\/founders-note-2\/","title":{"rendered":"Founder\u2019s Note #2"},"content":{"rendered":"\n<!--\n  Huff founder's letter no. 2. WordPress paste block.\n\n  WHERE TO PASTE\n  Block editor: add a \"Custom HTML\" block and paste this whole file into it.\n  (Or: post options menu > Code editor, and paste it there.)\n  Paste while logged in as an Administrator or Editor. Lower roles have the\n  <style> tag stripped by WordPress's HTML filter, and you would get plain text.\n\n  TWO KNOBS, both at the top of the .huff-post rule below\n    --hp-pad   side padding. 0px by default, because your theme already pads the\n               content column. If text touches the screen edge on a phone, set 16px.\n    --hp-max   reading-width cap. 46rem keeps lines readable on a wide theme\n               without leaving gutters on a normal one. Set \"none\" to fill fully.\n\n  FONT\n  It inherits your theme's typeface on purpose, so the post looks native to the\n  site. To use Huff's own face instead, uncomment the @import line and the\n  font-family line marked GEIST.\n\n  THE TITLE\n  If your theme already prints the post title above the content, delete the\n  <h1> block marked \"REMOVE IF THEME PRINTS TITLE\".\n\n  Colours adapt to the page: greys and hairlines are derived from your theme's\n  own text colour, so this reads correctly on a light or a dark theme.\n-->\n\n<style>\n\/* @import url('https:\/\/fonts.googleapis.com\/css2?family=Geist:wght@400;500;600;700&display=swap'); *\/\n\n.huff-post {\n  --hp-pad: 0px;\n  --hp-max: 46rem;\n  --hp-accent: #C23F73;\n  --hp-line: color-mix(in srgb, currentColor 15%, transparent);\n  --hp-mono: ui-monospace, 'SF Mono', SFMono-Regular, Menlo, Consolas, monospace;\n\n  max-width: var(--hp-max);\n  margin-inline: auto;\n  padding-inline: var(--hp-pad);\n  line-height: 1.7;\n  \/* GEIST: font-family: 'Geist', inherit; *\/\n}\n@media (prefers-color-scheme: dark) {\n  .huff-post { --hp-accent: #E8779F; }\n}\n\n.huff-post *, .huff-post *::before, .huff-post *::after { box-sizing: border-box; }\n\n\/* ---- masthead ---- *\/\n.huff-post h1 {\n  font-size: clamp(2rem, 7vw, 3.1rem);\n  line-height: 1.06;\n  letter-spacing: -0.03em;\n  font-weight: 700;\n  margin: 0 0 1.1rem;\n  text-wrap: balance;\n}\n.huff-post .hp-standfirst {\n  font-size: clamp(1.1rem, 3.6vw, 1.3rem);\n  line-height: 1.5;\n  opacity: 0.72;\n  margin: 0 0 2rem;\n  text-wrap: pretty;\n}\n.huff-post .hp-rule {\n  border: 0;\n  border-top: 1px solid var(--hp-line);\n  margin: 0 0 2.4rem;\n  height: 0;\n}\n\n\/* ---- body ---- *\/\n.huff-post p { margin: 0 0 1.25rem; }\n.huff-post strong { font-weight: 600; }\n.huff-post h2 {\n  font-size: clamp(1.35rem, 4.6vw, 1.75rem);\n  line-height: 1.18;\n  letter-spacing: -0.02em;\n  font-weight: 600;\n  margin: 2.8rem 0 1rem;\n  text-wrap: balance;\n}\n\n\/* ---- pull quote ---- *\/\n.huff-post .hp-pull {\n  margin: 2rem 0;\n  padding: 0.2rem 0 0.2rem 1.15rem;\n  border-left: 3px solid var(--hp-accent);\n  font-size: clamp(1.15rem, 3.8vw, 1.4rem);\n  line-height: 1.36;\n  letter-spacing: -0.014em;\n  font-weight: 600;\n  text-wrap: pretty;\n}\n\n\/* ---- numbers strip ---- *\/\n.huff-post .hp-figures {\n  list-style: none;\n  margin: 1.9rem 0;\n  \/* Transparent: two hairlines instead of a filled card, so it sits on the\n     page's own background whatever colour that is. *\/\n  padding: 1.15rem 0;\n  border: 0;\n  border-top: 1px solid var(--hp-line);\n  border-bottom: 1px solid var(--hp-line);\n  background: transparent;\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(7.5rem, 1fr));\n  gap: 1.2rem 1.4rem;\n}\n.huff-post .hp-figures li {\n  margin: 0;\n  padding: 0;\n  background: transparent;\n  display: flex;\n  flex-direction: column;\n  gap: 0.1rem;\n}\n.huff-post .hp-figures b {\n  font-family: var(--hp-mono);\n  font-size: clamp(1.3rem, 5vw, 1.5rem);\n  font-weight: 500;\n  letter-spacing: -0.02em;\n  line-height: 1.1;\n  color: var(--hp-accent);\n  font-variant-numeric: tabular-nums;\n}\n.huff-post .hp-figures span { font-size: 0.82rem; line-height: 1.4; opacity: 0.68; }\n\n\/* ---- the failure tally ---- *\/\n.huff-post .hp-tally {\n  margin: 1.8rem 0 1.4rem;\n  display: flex;\n  flex-direction: column;\n  gap: 1.1rem;\n}\n.huff-post .hp-fail {\n  display: grid;\n  grid-template-columns: 2rem 1fr;\n  gap: 0.6rem;\n  align-items: start;\n}\n.huff-post .hp-fail .hp-n {\n  font-family: var(--hp-mono);\n  font-size: 0.8rem;\n  color: var(--hp-accent);\n  padding-top: 0.4rem;\n  font-variant-numeric: tabular-nums;\n}\n.huff-post .hp-fail p { margin: 0; font-size: 0.97rem; line-height: 1.62; }\n.huff-post .hp-fail b { font-weight: 600; }\n\n\/* ---- signoff ---- *\/\n.huff-post .hp-signoff {\n  margin: 2.8rem 0 0;\n  padding-top: 1.8rem;\n  border-top: 1px solid var(--hp-line);\n  font-size: 0.97rem;\n  opacity: 0.75;\n}\n.huff-post .hp-signoff strong { opacity: 1; }\n\n\/* ---- phones ---- *\/\n@media (max-width: 480px) {\n  \/* Insurance: if your theme runs content to the screen edge on a phone, this\n     keeps text off the bezel. Delete this line if your theme already pads. *\/\n  .huff-post { padding-inline: max(var(--hp-pad), 14px); }\n  .huff-post .hp-figures { grid-template-columns: repeat(2, 1fr); }\n  .huff-post .hp-fail { grid-template-columns: 1.7rem 1fr; }\n  .huff-post h1 { letter-spacing: -0.022em; }\n}\n\n\/* ---- charts ---- *\/\n.huff-post figure { margin: 2rem 0; }\n.huff-post figure img { display: block; width: 100%; height: auto; border-radius: 12px; }\n.huff-post figcaption { font-size: 0.82rem; line-height: 1.4; opacity: 0.68; margin-top: 0.6rem; }\n.huff-post h3 { font-size: 1.12rem; font-weight: 600; margin: 2rem 0 0.6rem; letter-spacing: -0.01em; }\n.huff-post ul { margin: 0 0 1.25rem; padding-left: 1.2rem; }\n.huff-post li { margin: 0 0 0.6rem; }\n<\/style>\n\n<div class=\"huff-post\">\n\n  <p class=\"hp-standfirst\">\n    Huff is building one place where the people who know you can find out what\n    you actually want. Seven weeks after Note #1, here&#8217;s how far that has come.\n  <\/p>\n  <hr class=\"hp-rule\">\n\n  <p>\n    In <a href=\"https:\/\/huffme.com\/stories\/founders-note-1\/\">Founder&#8217;s Note #1<\/a>\n    I said what was next: shared lists, much better at reading any shop link, and a\n    Huff that works for families spread across countries. All three are now real,\n    and people are using them.\n  <\/p>\n  <p>\n    This is the update. What we learned, what we built and why, where the numbers\n    are, and what we&#8217;re taking on next. Mostly small fires. One medium one.\n  <\/p>\n\n  <h2>What we learned<\/h2>\n\n  <h3>1. People don&#8217;t live where the dropdown says they do.<\/h3>\n  <p>The single biggest reason people failed to sign up wasn&#8217;t a bug. It was a country picker.<\/p>\n  <p>\n    In September, 64% of failed signups were &#8220;that&#8217;s not a valid phone number&#8221;.\n    The US rejected half of what people typed, and the UK rejected even more. These\n    were Indians abroad typing their Indian number while the picker sat on +1 or +44.\n  <\/p>\n  <p>\n    My favourite fact from that week: every valid Indian number is also a valid\n    German one. Phone numbers are not a type system.\n  <\/p>\n\n  <h3>2. Things still fail quietly.<\/h3>\n  <p>Last time I said almost nothing went wrong loudly. That is still true, and I&#8217;ve stopped finding it charming.<\/p>\n  <p>\n    One in five shares from the iOS share sheet were failing. The login it borrowed\n    from the app expired an hour after you last opened Huff. So if you shared\n    something at lunch, it worked. If you shared it at dinner, it went into the\n    void, politely.\n  <\/p>\n  <p>\n    About a quarter of everyone who ever signed up got rate-limited by our own login\n    provider. The cause was the app asking for a fresh login token on every single\n    request, all at once, like a toddler at a buffet.\n  <\/p>\n\n  <h3>3. Privacy you can feel beats reach you can count.<\/h3>\n  <p>\n    In Note #1, the rule was one-way. If you had my number saved, you could see my\n    list. We&#8217;ve now made it mutual. You both have to have each other saved.\n  <\/p>\n  <p>\n    This cost us. About three in ten visible friend pairs went dark overnight. We did\n    it anyway, because &#8220;someone I don&#8217;t remember can see my wishlist&#8221; is the one\n    sentence that kills a product like this.\n  <\/p>\n\n  <h3>4. The internet is not a database. It is a weather system.<\/h3>\n  <p>\n    We scraped one eBay listing three times in one day. It came back priced in\n    Indonesian rupiah, then US dollars, then Brazilian reais. Somewhere an Indian\n    user was looking at a trading card that cost 2,147,880,000 of something.\n  <\/p>\n  <p>The lesson: never trust a price you didn&#8217;t ask for from the right country.<\/p>\n\n  <h2>What we built, and why<\/h2>\n\n  <h3>We got much better at reading shops.<\/h3>\n  <p>This is the one I&#8217;m proudest of, so it goes first.<\/p>\n  <p>\n    When you share a link to Huff, our server has to visit that shop and work out the\n    name, the picture and the price. In August, we were bad at it. About 35% of the\n    things people added came back broken: no price, no picture, or a product card that\n    just said &#8220;Amazon.in&#8221;.\n  <\/p>\n  <p>Today that number is 8%.<\/p>\n  <figure>\n    <img decoding=\"async\" src=\"https:\/\/huffme.com\/blogs\/wp-content\/uploads\/2026\/10\/fn2-failed-products.png\" alt=\"Bar chart: the share of added products that failed to load fell from 35% in August to 8% in October\" width=\"1600\" loading=\"lazy\">\n    <figcaption>Huff&#8217;s internal scrape tracking, August vs October 2026.<\/figcaption>\n  <\/figure>\n  <p>That&#8217;s not one clever fix. It&#8217;s dozens of small, unglamorous ones:<\/p>\n  <ul>\n    <li>A sweep that quietly retries failed products every hour, so a shop having a bad day doesn&#8217;t mean your item has a bad life.<\/li>\n    <li>Spotting &#8220;soft 404s&#8221;: products that have been delisted, but where the shop still serves a cheerful page saying nothing at all.<\/li>\n    <li>Refusing to call a scrape &#8220;done&#8221; when the price is missing. One shop&#8217;s pages were empty shells that our scraper had been happily marking as perfect.<\/li>\n    <li>Pinning each shop to the right country, so your trading card stops arriving in Brazilian reais.<\/li>\n    <li>Custom handling for shops that fight back, from Zepto to Flipkart to a trading-card site whose product pages contain the product&#8217;s name zero times.<\/li>\n  <\/ul>\n  <p>The last 8% is the long tail, and the long tail has a lot of shops. We&#8217;re coming for it.<\/p>\n\n  <h3>Lists, and categories to go with them.<\/h3>\n  <p>\n    As promised. One shared link can now go to your wishlist and to several lists in\n    one go. List owners choose who can add to them.\n  <\/p>\n  <p>\n    We also taught a small AI model to sort every item into one of 13 categories, so\n    you can filter a list down to &#8220;just the books&#8221;. Before this, 92% of items had no\n    category at all. And one shop had every product hardcoded as &#8220;fashion&#8221;,\n    including the ones that weren&#8217;t.\n  <\/p>\n\n  <h3>A share sheet that actually saves.<\/h3>\n  <p>The iOS share extension now has its own long-lived login. Sharing at dinner works as well as sharing at lunch.<\/p>\n\n  <h3>A login screen that lets people in.<\/h3>\n  <p>\n    We stopped stampeding our login provider. We now accept the code from any SMS you\n    were sent, not just the latest one, which turns out to matter when two arrive at\n    once. And we gave up on an SMS auto-fill library that, it turned out, could never\n    have worked. The commit was titled &#8220;remove the library that never could&#8221;.\n  <\/p>\n\n  <h3>A Home feed.<\/h3>\n  <p>\n    The newest thing, still switched on for only a few phones. Once a friend has three\n    or more things on their list, Huff opens on a feed of what the people you know\n    actually want. Double-tap to like. It ends with &#8220;All caught up!&#8221;, which is the\n    only social feed I know of that wants you to leave.\n  <\/p>\n\n  <h3>Smaller, but felt.<\/h3>\n  <ul>\n    <li>Long wishlists on Android stopped stuttering. A 70-item list was using nearly four times its graphics memory budget.<\/li>\n    <li>Nudges for empty wishlists, a note when your gift is revealed, and a way for friends to say &#8220;please put something on your list&#8221;.<\/li>\n    <li>The app now knows you might not be in India. Shop examples, the onboarding tour and address forms change with your country.<\/li>\n  <\/ul>\n\n  <h2>Where we are<\/h2>\n  <figure>\n    <img decoding=\"async\" src=\"https:\/\/huffme.com\/blogs\/wp-content\/uploads\/2026\/10\/fn2-growth-since-note-1.png\" alt=\"Line charts: people signed up grew from 1,095 to 2,841, things added from 2,022 to 5,612, and things gifted from 35 to 69 between 25 Aug and 14 Oct 2026\" width=\"1600\" loading=\"lazy\">\n    <figcaption>Huff production database, read 14 Oct 2026. Deleted accounts are excluded, so 25 Aug differs slightly from Note #1&#8217;s figures.<\/figcaption>\n  <\/figure>\n  <p>Those people now live in 10 countries, up from 9.<\/p>\n  <p>\n    Last time I said the gap between &#8220;things added&#8221; and &#8220;things gifted&#8221; is the\n    whole company. Here&#8217;s the honest update: wishlists nearly tripled, gifts nearly\n    doubled. The gap got wider. That&#8217;s exactly why the Home feed exists.\n  <\/p>\n  <p>\n    The column I&#8217;m quietly proudest of is the small one. In August, the US had exactly\n    one Huff user, our lonely pioneer. Today there are 13. The UK went from 7 to 16, and\n    the UAE from 9 to 16.\n  <\/p>\n  <figure>\n    <img decoding=\"async\" src=\"https:\/\/huffme.com\/blogs\/wp-content\/uploads\/2026\/10\/fn2-users-outside-india.png\" alt=\"Chart: Huff users by country, 25 Aug to 14 Oct: United States 1 to 13, United Kingdom 7 to 16, UAE 9 to 16, Canada 3 to 4\" width=\"1600\" loading=\"lazy\">\n    <figcaption>Huff production database, read 14 Oct 2026. Countries with 4 or more users.<\/figcaption>\n  <\/figure>\n  <p>\n    Those are not big numbers. But my bet is that most of them are people abroad\n    getting a link from family back home, which is the version of gifting that\n    genuinely hurts, and the one Huff was built for.\n  <\/p>\n\n  <h2>What we&#8217;re solving for now<\/h2>\n\n  <h3>1. The last 8%.<\/h3>\n  <p>\n    The long tail of shops is long. Some sites block every data centre on earth. Some\n    are empty pages that build themselves in your browser. One shop&#8217;s\n    &#8220;high-resolution&#8221; product images all decode to 78 by 98 pixels, which is roughly\n    the size of a postage stamp&#8217;s opinion.\n  <\/p>\n  <p>\n    We built an AI reader for pages like these. It worked well, and it cost more than\n    we wanted to spend, so it&#8217;s paused while we make it cheaper.\n  <\/p>\n\n  <h3>2. Getting contacts to sync.<\/h3>\n  <p>\n    Huff only works if your phone tells it who you know, without telling us anyone&#8217;s\n    number. Too many people still finish signing up and never sync. Some deny\n    permission. Some phones suspend the sync halfway and leave it wedged. Every one of\n    those people opens Huff to an empty room.\n  <\/p>\n\n  <h3>3. Making mutual visibility feel fair.<\/h3>\n  <p>\n    The mutual rule protects people, but it also means &#8220;why can&#8217;t I see my sister&#8217;s\n    list?&#8221; now has a real answer: she hasn&#8217;t saved your new number. We&#8217;re working on\n    telling people that clearly, in the right country code, without making it feel like\n    a scolding.\n  <\/p>\n\n  <h3>4. Closing the gap between wanting and gifting.<\/h3>\n  <p>\n    This was the real problem in August, and it still is. The Home feed is our first\n    proper swing at it: show people what their friends want, at a moment when they\n    might act on it.\n  <\/p>\n\n  <h3>5. Testing on real phones.<\/h3>\n  <p>\n    For the record, most of this was built and tested on simulators and a small pile of\n    personal devices. Real phones in real pockets keep teaching us things simulators\n    never mention.\n  <\/p>\n\n  <p class=\"hp-pull\">\n    Gifting isn&#8217;t a discovery problem. It&#8217;s a &#8220;what does my sister actually want&#8221;\n    problem. Every week, Huff gets a little better at answering it.\n  <\/p>\n\n  <p class=\"hp-signoff\">\n    <strong>Operator<\/strong><br>\n    If you shared something to Huff in August and it showed up as a grey box, try again. We owe you one.\n  <\/p>\n\n<\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>Seven weeks in: what we learned, what we built, and how broken product cards went from 1 in 3 to 1 in 12.<\/p>\n","protected":false},"author":1,"featured_media":177,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21],"tags":[],"class_list":["post-181","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-stories"],"_links":{"self":[{"href":"https:\/\/huffme.com\/blogs\/wp-json\/wp\/v2\/posts\/181","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/huffme.com\/blogs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/huffme.com\/blogs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/huffme.com\/blogs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/huffme.com\/blogs\/wp-json\/wp\/v2\/comments?post=181"}],"version-history":[{"count":1,"href":"https:\/\/huffme.com\/blogs\/wp-json\/wp\/v2\/posts\/181\/revisions"}],"predecessor-version":[{"id":182,"href":"https:\/\/huffme.com\/blogs\/wp-json\/wp\/v2\/posts\/181\/revisions\/182"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/huffme.com\/blogs\/wp-json\/wp\/v2\/media\/177"}],"wp:attachment":[{"href":"https:\/\/huffme.com\/blogs\/wp-json\/wp\/v2\/media?parent=181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/huffme.com\/blogs\/wp-json\/wp\/v2\/categories?post=181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/huffme.com\/blogs\/wp-json\/wp\/v2\/tags?post=181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}