Inspiration

Everyone in Kenya already knows how to send money — they do it every day on M-Pesa, over WhatsApp, in plain Swahili. But almost no one saves in Bitcoin, because every path to it demands the same thing: download a strange app, write down a seed phrase, learn a new vocabulary, and trust an exchange that might freeze your funds. We watched family members who run businesses on WhatsApp dismiss Bitcoin entirely — not because they didn't want a harder-to-inflate way to save, but because the on-ramp was built for crypto people, not for them. So we flipped the question: what if saving in Bitcoin felt exactly like sending an M-Pesa? No new app. No seed phrase. Just a message. That's Akiba (Swahili for savings).

What it does

Akiba turns any chat thread into a Bitcoin savings account. A user pairs their phone number to their own Bitcoin Lightning wallet once, then simply messages "Save 200." Akiba sends an M-Pesa STK push (or a Stripe checkout for users paying in dollars, euros, and other currencies), the user enters their familiar PIN, and within seconds real Bitcoin lands in their own wallet — not ours. A small percentage fee per transaction keeps the platform running. The user never sees an address, a seed phrase, or even the word "Bitcoin" unless they want to. Crucially, Akiba is non-custodial at rest: we never hold a user's savings — the sats settle straight into a wallet they control. And because it's open-source with a clean adapter architecture, the exact same core runs on WhatsApp and Telegram, and can swap M-Pesa for Stripe, or Aurpay for any other Lightning provider, just by changing config.

How we built it

The core engine is vanilla PHP + MySQL with an idempotent transaction ledger and a configurable fee layer. Around it we built three swappable adapter layers so nothing is hard-wired:

  • Messaging adapter — WhatsApp Cloud API and Telegram Bot API, behind one receive/send interface.
  • Fiat gateway adapter — M-Pesa Daraja STK push for KES, and Stripe for global currencies (USD, EUR, GBP and more), normalized behind one deposit/verify interface.
  • Bitcoin provider adapter — Aurpay's Bitcoin Lightning Network API.

When a deposit webhook confirms payment, the engine resolves the user's Lightning Address into a Lightning invoice via LNURL-pay, then calls Aurpay's POST /api/bln/withdraw with that ln_invoices string to push sats from our master wallet straight to the user's wallet. For openness, every swap is also published as a Pontmore lifecycle event to a Nostr relay — giving Akiba a public, auditable "proof-of-savings" log that isn't owned by us. The whole thing is MIT-licensed with a README and architecture diagram so anyone can fork it and port it to their own country, currency, and chat app.

Challenges we ran into

The biggest one was the payout leg. Most crypto gateways are built to accept payments and settle to the merchant, not to disburse to thousands of individual user wallets — so we spent real time separating acceptance from disbursement before landing on Aurpay's BLN withdraw endpoint, which pays an arbitrary user invoice from a master wallet. The second was recurring saving: one-off invoices expire, so we moved to Lightning Addresses + LNURL-pay so a saver never has to generate an invoice. Reconciling asynchronous M-Pesa callbacks with idempotency (so a retried webhook never double-pays sats) took careful ledger design. And the hardest non-technical challenge was restraint — every time we wanted to expose a crypto feature, we had to hide it, because the whole point is that a non-Bitcoiner should never feel like they're using Bitcoin. All of this, under 24 hours.

Accomplishments that we're proud of

We got a full loop working live: a real WhatsApp message → a real M-Pesa PIN prompt → real Bitcoin in a real Lightning wallet, in seconds. We proved portability isn't just a claim — the identical core answers on both WhatsApp and Telegram in our demo. We kept it non-custodial at rest, so we're not asking anyone to trust us with their savings. And we shipped it as genuinely open-source infrastructure with a sponsor protocol (Pontmore on Nostr) wired in for transparency, not as a closed app.

What we learned

The hard part of Bitcoin adoption was never the blockchain — it's the last mile of UX. The chain works fine; the friction is entirely in onboarding, vocabulary, and trust. We learned that Lightning Addresses plus LNURL are the real unlock for recurring, app-less saving, and that abstracting providers behind adapters turns a one-country hack into something the whole continent can fork. We also learned how much further an open protocol like Pontmore takes you: making swap state public on Nostr turned "trust us" into "verify us" with almost no extra code.

What's next for Akiba

Recurring auto-savings (DCA): "Save 200 every Friday, automatically" — the natural fit for Kenya's chama and saving culture. Then group savings pools, an off-ramp (sell back to M-Pesa via Daraja B2C), and more rails (Airtel Money, Flutterwave) and channels (SMS, Signal). We want an agent/wakala mode so local mobile-money brokers can serve their communities, a public proof-of-reserves dashboard built from the Nostr event log, and OTP-secured number-to-wallet pairing with a third-party security review before any real-money launch. The mission stays simple: make saving in Bitcoin as easy as sending a text — for the billions who'll never download a crypto app.

Built With

  • crypto
  • lightning
  • mpesa
  • pontmore
Share this project:

Updates