Flavio Espinoza
Bless calls itself the world's first shared computer -- a global network of everyday devices that contribute idle browser compute back to websites and apps and earn token rewards for it. The model only works if regular people sign up and keep a node running, so the growth problem was not abstract: every user who bounced at the door was compute the network never got.
When I joined (it was still called Blockless then), the front door was the problem -- the old email-and-password-and-verify march, and people gave up halfway. My assignment was four sentences from the CTO: use AI to code, the signup is clunky, the founder wants it fixed, build a single sign-on with Google and Web3Auth. No design, no ticket. So I built it: one "Continue with Google" button behind which Web3Auth federates the OAuth/OIDC login, derives a Solana wallet, signs a server-issued challenge with it, and trades the signature for a session JWT -- one click, a cryptographically verified self-custodial identity, the multi-step march collapsed to a single entry point. The marketing lead, comparing against the prior six months in MailChimp, reported completed signups up roughly 70% and abandonment down around 45% -- the team's own loosely-measured numbers, not instrumented analytics, but the direction was not in doubt.
That fixed acquisition; the next lever was turning one user into more. A flat 10% referral already existed and was underperforming, so rather than replace it I compounded it -- stacked OAuth-verified social and quiz boosts (connect Discord, follow on X, take a quiz) that each add into one live "Total Boost" the user watches climb. Discord was easy; X was a nightmare -- the company had just renamed from twitter.com to x.com, the API was mid-migration, and the docs pointed at endpoints that no longer existed, so I burned real time getting OAuth to complete against a moving target. The founders reported engagement up about 45% (same caveat -- reported, not independently measured), but the mechanism is real and in the code.
That is the loop the whole project ran on, and it is the loop Firecrawl is hiring for: a control (the old signup, the flat referral), a variant (SSO, then stacked boosts), one change at a time, promoted only when the number moved. Bless is also where I started using AI as a daily force multiplier -- the CTO's literal instruction was "use AI to code," and I went from never having touched it to running it as core infrastructure. I owned this end to end and across the stack: the Next.js/React/TypeScript dashboard, the OAuth callback handlers and quiz API in the middle, and the wiring to the Fastify gateway and the Chrome extension. One honest note: the architecture below is quoted directly from the Bless source and is real; the growth percentages are the team's reported numbers reconstructed from memory, not metrics I can certify -- I would rather say that than dress a recollection up as a measured result.
The Architecture
Bless was a small set of focused repos. The growth story lives in two of them: run-dashboard, the Next.js front door where users sign up, refer, and watch their boost climb, and extension-gateway, the Fastify backend that authenticates wallets, tracks nodes, and computes rewards. Three smaller services support them: bless-auth (an email one-time-passcode auth service, still offered alongside the SSO), extension-aux (the auxiliary quiz API), and bless-ui (the shared component library).
Single Sign-On | Web3Auth + OIDC — The onboarding collapse. One button replaces the email/password/verify march, and produces a real self-custodial wallet rather than a database row.
- A.One headless entry point -- uses the Web3Auth no-modal SDK so the login UI is mine, not a third-party popup, while Web3Auth handles the OIDC federation for Google, GitHub, and passwordless email behind a single login(type) call.
- B.Real wallet, invisible to the user -- after federation, the flow derives a Solana wallet, requests its account, and uses it as the user's identity; the person never sees a seed phrase or a wallet prompt during signup.
- C.Challenge-response, not a password -- the client fetches a server nonce, signs it with the derived wallet, and exchanges the signature plus public key for a session JWT, so identity is cryptographically proven instead of credential-based.
- D.Referral capture at the door -- the signup URL's ?ref= code is read off the query string and threaded into the auth challenge, so attribution happens at the exact moment of account creation with no extra step.
The Growth Loop | Referrals, Social Boosts, Achievements — The PLG engine, and the part the recruiter call centered on. When I arrived the referral program already existed -- a 10% bonus with a referral-count tier ladder -- and it was underperforming. My contribution was to compound it: stacked, OAuth-verified social and quiz boosts layered on top, all summing into one live "Total Boost."
- A.The referral that predated me -- a flat +10% ("Blessed User") for referring or being referred, plus a referral-count tier ladder climbing from +5% (1 referral) to +30% (100). This was already in place before I joined; it was the lever that was not compounding, not something I built.
- B.What I built -- the stacked social and quiz boosts: +5% for connecting X (a follow on @theblessnetwork), +5% for connecting Discord, and +5% for completing the quiz, each earned through a real OAuth round-trip (the quiz behind reCAPTCHA), not a self-reported checkbox.
- C.Placeholder teasers, nothing behind them -- the achievements page also rendered four blurred, non-interactive "coming soon" cards (no button, no data, no backend). They are pure visual placeholders for features that did not exist yet -- not live boosts and not logic I wired up.
- D.One number that compounds -- every real boost sums into a single Total Boost rendered at the top of the achievements page; the social and quiz layer I added is what gave users more rungs to actually reach.
- E.The X integration that fought back -- the X/Twitter OAuth client had to be made to work against an API mid-rename from twitter.com to x.com with stale docs; Discord's identify/guilds flow was straightforward by comparison.
Real-Time Dashboard & Node Bridge — The operational surface. A Next.js 14 dashboard that shows live node status, earnings, and rankings, and stays in sync with the user's running node through the Chrome extension.
- A.App Router with auth route groups -- `(auth)` and `(unauthenticated)` route groups cleanly separate protected dashboard pages (home, nodes, referrals, achievements, leaderboard, rewards) from the public login, each with its own layout.
- B.Live node status without backend polling -- the active-node component talks to the Chrome extension over the Runtime messaging API on a 5-second interval, reading node connection state and earnings straight from the user's local node instead of hammering the gateway.
- C.Earnings visualization -- a 14-day rolling stacked-bar chart (Recharts) breaks rewards into base, bonus, and referral so a user can see exactly where their tokens come from.
- D.Pragmatic state management -- React Context holds the Web3Auth session, and SWR owns server data through an authenticated fetcher that injects the JWT on every request, getting caching and revalidation for free.
Extension Gateway | The Backend — The Fastify backend behind the network. It authenticates wallets across chains, registers and tracks compute nodes, computes rewards, absorbs the firehose of node pings, and deploys and invokes the network's serverless functions.
- A.Multi-chain wallet auth -- one challenge-response auth service verifies signatures from MetaMask (EVM), Keplr (Cosmos), Martian (Aptos), and Solana, with chain-specific verification so a signature from one chain can never be replayed on another.
- B.Batched ping ingestion -- node "I'm alive" pings land in an in-memory queue and flush every 15 seconds in 1,000-document chunks into MongoDB time-series collections, so thousands of nodes can report without drowning the database in writes.
- C.Rewards and referral aggregation -- MongoDB aggregation pipelines compute node earnings and roll the 10% referral bonus across a user's referred network, which is the server-side truth the dashboard's boost UI reflects.
- D.Secrets encrypted by default -- function environment variables and third-party credentials are stored AES-256-CBC encrypted with a per-field initialization vector, and HashiCorp Vault is integrated to inject external secrets at invocation, so credentials are never persisted in plaintext.
- E.Built to run lean -- a three-package monorepo with multi-stage Docker builds, GitHub Actions CI/CD publishing to ghcr.io and npm, and deployment onto Akash decentralized cloud behind a Caddy reverse proxy with Cloudflare DNS for automatic TLS.
Achievement Quiz Service | extension-aux — A standalone Fastify service, separate from the main gateway, that powers the achievement quiz behind the +5% quiz boost. I built the quiz feature end to end in February 2025, in parallel with the run-dashboard -- the front-end form, the reCAPTCHA, and the scoring wiring -- on top of a service scaffold I did not stand up myself.
- A.The quiz front end -- the QuizForm on the client renders the survey, collects answers, and submits them to the aux API, then refreshes the achievements page so the user sees the boost land.
- B.Bot-proofed solo, end to end -- a Google reCAPTCHA v2 widget on the client issues a token, and the aux API verifies it server-side against Google's siteverify, rejecting any submission without a valid token so bots cannot farm the boost.
- C.Two endpoints, both JWT-gated -- one reports whether the user has already completed the quiz (driving the "Take Quiz" vs "Done" state), and the other validates the captcha, scores the answers, and persists the result to MongoDB.
- D.Deliberately decoupled -- it runs at its own auxiliary URL, off the core gateway, so the quiz and its bot protection deploy and scale independently of auth, nodes, and rewards.
Design System & Responsive Side Nav | bless-ui — The shared front-end library -- a shadcn/Radix + Tailwind set of building blocks published as its own Docsify-documented package. Most of it is standard component parts; the piece worth calling out is the responsive side navigation, which the founders were exacting about.
- A.A device-aware state machine, not a CSS toggle -- a Zustand store (my first time using Zustand) holds device, isExpanded, and width, and snaps the nav to one of three widths: 260px expanded on desktop, a 72px icon-only rail on tablet, and 0 (hidden) on mobile.
- B.Breakpoint-driven -- a custom useSidenav hook listens to window resize and maps width to device (<=640 mobile, 641-1024 tablet, >1024 desktop), so the rail collapses to a skinny bar exactly at iPad width and re-expands on desktop, automatically.
- C.The layout breathes with it -- the main layout resizes the content region via calc(100% - {width}px) with a 300ms transition, and the nav labels fade out when collapsed, so the page reflows smoothly instead of snapping.
- D.Active-route aware -- the nav reads the Next.js pathname to highlight the current page and keeps it in sync as the user navigates.
- E.Documented as a real library -- the components ship with their own Docsify docs site so the rest of the team could consume them as a design system.
Landing Page & Docs — The public front of bless.network. Beyond the app, I rebuilt the company's top-of-funnel surface from scratch. (From my account; the landing page itself is not in the repo snapshot -- the Docsify docs are.)
- A.Redesigned the main bless.network landing page end to end -- the prior site was little more than two links (into /dashboard and into /docs); I rebuilt it into a real marketing and conversion front door, the first thing a prospective node operator sees.
- B.Rebuilt /docs in Docsify -- migrated the documentation into a maintainable Docsify site, the same approach used for the bless-ui component docs, so docs could be updated in plain markdown.
Supporting Services — One last piece, for completeness. bless-auth -- a Go + Vite email one-time-passcode service (login, verify, JWT issuance). It still ships on the live login page as the "BlessAuth" tab alongside the Web3Auth SSO that now leads.