A link-in-bio platform built on an anti-greed foundation where the price drops the more people subscribe.
Product Lead · Web · Next.js · Convex
01 · Origin
Bento.me was a link-in-bio tool built around a bento-grid layout, a flexible canvas of cards for links, social profiles, media, and whatever else a person wanted to surface. It was good and it had an audience (of mostly Designers) that liked it. Then Linktree acquired it, let it run for about 2 years and then shut it down. The loss was personal: the studio's own bento profile was among the casualties, therefore we started working on Bhann the week the shutdown email arrived.
The obvious response was to build a clone, which is what we did at first: fill the gap, serve displaced users, and use standard SaaS pricing. That would have been the sensible business choice. Bhann took another path: build a replacement whose structure prevents it from doing what Linktree did (getting acquired and killed).
Not a clone. A villain seeking vengeance for the death of a loved one, and its weapon is the pricing model.
Linktree Pro costs (at the time of writing) €54 a year ($4.50 a month). That price does not change based on how many people use Linktree, the more subscribers they have, the more revenue they extract. This is the standard model: grow subscribers, grow revenue, the two are proportional, the company keeps the difference between cost and price forever.
Bhann reverses that relationship. Subscriber growth lowers the price for everyone, including existing subscribers. The product still has to support itself, but any margin beyond that goes back to the people paying for it. Its structure prevents the platform from extracting more value from a captive user base.
02 · The Staircase
The pricing model has 21 tiers. Before any code was written, the staircase lived in a spreadsheet for a month and was redrawn a dozen times. Tier 1, Pioneer, covers the first 99 paying subscribers at €30 per year. At 100 subscribers, the price drops to €26 for everyone and the tier becomes Founder. It falls to €22 at 500, €19 at 1,000, and continues in steps to a minimum of €6 per year at 1 million subscribers. Free accounts do not move the staircase; only paying subscribers count.
Three rules define the model. First, everyone pays the current market price or less, never more. When the platform reaches a new tier, every subscriber gets the lower price. Second, your tier index locks when you subscribe. If you join at €30 and the price falls to €19, you renew at €19, not €30. Third, the lock can only improve. If your locked tier index is ever higher than the current market tier, you pay the lower market price at renewal.
The staircase is implemented in convex/pricing.ts. One stats table tracks the current number of paying subscribers; free accounts never affect it. At each subscription event, the system finds the current tier index and saves it on the user record as lockedTierIndex. At renewal, it charges the lower of the locked price and current market price. Any tie favours the user.
// At subscription time: lock to current tier index. // HIGHER index = LOWER price (better for user). // Keep existing lock if it's already better. const newLockedTierIndex = user.lockedTierIndex !== undefined ? Math.max(user.lockedTierIndex, currentTierIndex) : currentTierIndex; // At renewal: pay whichever is lower, locked or current market. const actualAnnualPrice = Math.min(lockedAnnualPrice, marketAnnualPrice);
There is also a lifetime option at €163.57, a one-time payment, no renewals, no subscriptions. The amount is not round, it is what the model's NPV calculation suggested was fair given projected infrastructure costs and the floor price trajectory, basically projected user cost for the next 10 ish years, after that they cost me money.
Linktree does things Bhann cannot (yet) like social scheduling and a large partner ecosystem. The comparison is not a claim that Bhann beats Linktree across every dimension. It is that for a creator who only needs a link-in-bio page, which is most of them, Bhann paid plan starts at €30 versus €54 and the gap widens every time a new subscriber joins.
03 · The Editor
The profile editor is a drag-and-drop bento grid built with react-grid-layout. Cards come in 4 preset sizes, can go anywhere, and can be styled for their content. Desktop and mobile layouts are stored separately, so the same cards can appear in different positions. Each layout can be designed for its screen instead of making mobile a collapsed desktop view.
The card system supports 67+ distinct types. Social platform links, embedded media, commerce integrations (Gumroad, Ko-fi, Patreon, Stripe), professional portfolio cards (GitHub, Dribbble, Figma, Behance, Calendly), interactive toys (a tone matrix sequencer, an etch-a-sketch, an analogue clock), and a full-length case study card with block content edited in a Tiptap rich text editor. The tone matrix sequencer was built in a single evening, mostly as a joke, and then refused to be cut, it remains one of the most fun interactive cards. The set is large enough to cover almost any creator's real use case while keeping the interface coherent.
Public profiles are server-rendered and edge-cached using Next.js ISR with a 60-second revalidation window. The first request after a cold edge miss hits the Convex backend; every subsequent request within the minute is served from Cloudflare's edge network without touching the database. Profile edits appear within 60 seconds without a redeploy.
// ISR: revalidate every 60 seconds. // First request misses cache → hits Convex → caches at edge. // Subsequent requests served from Cloudflare in <100ms TTFB. export const revalidate = 60; // Edge runtime for sub-100ms cold starts on Cloudflare. export const runtime = "edge"; // LLM-friendly profile data embedded in server-rendered HTML. // AI agents can read public profiles without client-side JS. const llmProfile = generateLLMProfile(profile);
Paid Subscribers can configure profile themes: solid or patterned backgrounds, card border radius, spacing, and a full set of colour tokens. Individual cards can override their background and text colours. A card-theme registry maps named themes to CSS variable sets. A ThemeStyleInjector component applies them at runtime without re-rendering the grid.
The 67+ card types form a traditional component library. Each card has defined variants, a token-based theme contract, and a clear separation between layout and visual style. The ThemeStyleInjector applies CSS variable sets to individual cards without changing the grid, so a profile's full visual language can change without a DOM reflow. The same token architecture controls profile themes and card overrides, much like semantic design tokens manage global and local styles in a mature system. This makes 67 card types feel like one editor instead of 67 separate design problems.
04 · The Platform
The anti-greed foundation only works if it is verifiable. A platform that claims to lower prices as it grows, but does not show you whether it is actually growing, is just a marketing pitch. The staircase only descends if the subscriber count actually climbs, so the climb has to be public and Bhann publishes its financials in real time.
The transparency page shows live MRR, total users, paying users, monthly infrastructure costs, initial build spend (€1,365.17), current balance, and a sustainability gauge as well as the ratio of income to expenses. The data comes directly from the Convex backend and refreshes in real time (every day at midnight). Anyone can see whether the platform is covering its costs before they decide to subscribe.
Analytics are built into every published profile: views, unique visitors, card clicks, top countries, and referrers. Data is stored in a single consolidated record per profile, not one row per event, updated incrementally on each view or click. This keeps query costs proportional to the number of profiles, not the number of events, which matters at scale on a platform where infrastructure cost is part of the pricing argument.
Outcomes
With 130 users and about €80 generated in three months, this launch failed by any standard growth measure. The product's structure is sound, but it entered a crowded category without a marketing strategy. Few people saw it because visibility was never part of the plan.
The numbers do not change one fact: the model works. Staircase pricing is implemented, auditable, and live. The transparency page shows real figures in real time. The platform does what it promised and includes only what the team can maintain, the same principle that kept the social scheduler out of scope. The idea was not the problem. The problem was expecting it to spread by itself.
The lesson is about sequence. A new pricing model needs to be explained clearly and repeatedly to the right audience. The mistake was building the model and assuming its story would spread by itself. The platform will stay live while it remains personally useful and as proof that decremental pricing is practical, not theoretical. If the marketing ever arrives, the product is ready.
Bhann was built with Cursor and Claude Code, including the decremental pricing model, the bento editor's drag-and-drop layout, the ISR caching layer, and the Stripe webhook and tier-lock system. AI did not make the architecture decisions: whether the pricing model was sound, which 67 card types to build and how to combine them, or why transparency supported the anti-greed argument. Without LLMs as implementation partners, a designer without a CS degree could not have shipped a full-stack Next.js + Convex platform. With them, it took four weeks.
Try Bhann