0
0 Comments

How I shipped a multi-chain crypto wallet across 54 chains as a solo founder

Hey Indie Hackers 👋

I'm Seb, solo founder from Arendal, Norway. I've spent a long stretch building MyFriendlyWallet — a non-custodial wallet that sends stablecoins (USDC, EURC, USDT) to anyone, across 54 chains and 156 tokens, in under 5 seconds. No app install, no seed phrase drama, no gas fees for the user.

The pitch is simple: for everyone, as simple as sending to @username. The 54 chains underneath only show up if you flip on power mode. Crypto payments that just work.

I want to share the technical and product decisions that made shipping this solo actually possible, because most of them weren't obvious and I had to learn them the hard way.

## The constraints I started with

- Solo. No co-founder, no engineering team.

- Non-custodial. I refuse to touch user funds.

- Multi-chain from day one. Users shouldn't care whether their USDC is on Base or Solana — it just works.

- Payments-first. Not a portfolio tracker, not a DeFi aggregator. Just "send money."

## What the stack actually looks like

Frontend: A single-file React PWA. The entire app is one minified index.html that gets edited via Python string replacement with assert count==1 guards — a discipline I adopted after losing a full day to a misplaced brace in a minified bundle. Every change passes node --check before I push. It's weird, but it works.

Backend: Cloudflare Workers, end to end. RPC proxying for 54 chains, fee enforcement, gas relayers, broadcast orchestration. Sub-100ms cold starts at every edge. The whole multi-chain footprint runs on edge compute that wouldn't exist on traditional infra at any sane price.

Gasless UX: On Base (USDC/EURC) and Solana (USDT), I run a pool of relayer wallets. User signs an intent, Worker picks a relayer that's not mid-nonce-lock, relayer pays the gas and broadcasts. User sees "$50 sent" in ~3 seconds, no gas math, no native token juggling.

Keys: Generated and stored on the device only. The Worker never sees a private key. Which means I can leave this running for anyone forever without being in the custody business.

## Free embeddable widgets

This part I'm especially proud of. MFW ships with a small library of free, embeddable payment widgets that any creator, freelancer or small business can drop onto their site in two minutes. No account, no API key, no SDK install — just paste an HTML snippet:

- Coffee shop / tip jar — accept a $5 (or any amount) stablecoin tip

- Donate button — for nonprofits, side projects, GitHub READMEs

- Checkout — fixed-price product or service payment

- Pay button — generic CTA that opens the MFW send flow pre-filled

- Invoice — single-use payment link with a fixed amount and reference

Recipient enters their @username once in the widget builder at myfriendlywallet.io, gets the snippet, pastes it in their site. Payer doesn't even need to be an MFW user — the widget handles onboarding. Receiver still pays nothing; we only take the 0.25% on the sender side.

## For developers

There's a small developer + partner API layer for people who want to do more than just embed a button:

- Developer API — programmatic access to send and receive flows, fee quoting across chains, balance lookups, payment intent generation. REST, simple bearer auth.

- Partner API — for fintechs, exchanges, and platforms that want to embed MFW under their own brand. Includes per-partner fee splits, custom branding, and account-level reporting.

- Webhook events — for payment received / payment confirmed / payment failed, so partner backends can update orders, fulfill goods, or trigger downstream automations without polling.

- Docs at mfw-developers.html on the marketing site — kept deliberately short and copy-pasteable. No 200-page reference manual no one reads.

The whole layer is the same Cloudflare Worker that powers the consumer app, so partners get the same edge performance and uptime characteristics.

## The hard-won lessons

1. Multi-chain is a UX problem, not a technical one. Technically, adding a chain is a weekend. Making that chain feel identical to the 53 others — same send flow, same fee display, same confirmation UX, plus the developer tools and embeddable widgets that wrap each chain — takes real, careful work per chain. I did it anyway because the alternative (chain switchers, separate wallets per chain) is what makes normal people bounce.

2. Surgical edits over rewrites. On a minified single-file app, every change is a scalpel cut. I never "refactor." I change the one thing that needs changing and leave the rest untouched. Slower per-change but massively faster overall — no regressions, no "spent the week rewriting and broke Solana."

3. Stablecoin-first beats token-list-first. Most wallets show you 50 tokens and ask you to pick. I default to USDC/EURC/USDT because that's what people actually want to send. The 156 other tokens are there when needed, but never in your face.

4. Cloudflare Workers changed what a solo person can run. I wouldn't have started this project on AWS. Edge compute + instant cold starts + cheap pricing is what makes "54 chains, solo" a thing that can exist.

5. Free widgets > paid integrations. I made every embeddable widget free, no signup, no rev share. The bet: distribution > short-term margin. Someone pasting a tip jar on their newsletter is a thousand future MFW users that no paid acquisition channel could touch.

## Where I am now

- Live at myfriendlywallet.io and app.myfriendlywallet.io

- Free widgets live at myfriendlywallet.io

- Developer docs at the same domain (mfw-developers.html)

- Launching on Product Hunt soon

- Native iOS/Android coming later this year (currently a PWA, works on every phone without install)

Happy to answer questions in the comments — architecture, widgets, the developer API, multi-chain UX, anything. I'm not a fast chatter but I read every reply. Feedback genuinely valued.

Seb

posted toAvatar for product MyFriendlyWallet
MyFriendlyWallet