At the beginning of 2025, I mentioned in a number of places that I thought during 2026 we’d get to the point where building your own highly competitive self-custody bitcoin wallet would be doable with an LLM during the year.

Sadly, what mostly happened instead is that wallet developers continued to double-down on fully trusted and custodial platforms, further centralizing Bitcoin and bringing pervasive censorship on Bitcoin closer to reality.

Still, we did (almost) deliver the software required to bring the original claim to bear, with a full graduated wallet in a simple library allowing wallets to offer highly competitive fees and overall UX being close to ready…if anyone wanted it.

I spent a few days over the holidays testing it out, having an LLM build me a native iOS graduated wallet, and it nearly entirely works, basically only missing some bugfixes and the ability to store and display transaction descriptions. At least we built it.

Reply to this note

Please Login to reply.

Discussion

Explain graduated wallet?

In order to ensure competitive fees, balances under some threshold (eg $20) are stored in a trusted/custodial wallet (in this case Spark, but it could equally be Liquid or Arkade or whatever) and as soon as you receive more you get a channel from an LSP and the coins are stored in self-custody.

Would be cooler with ecash.

Who’s gonna run the mint

Who runs Spark or Liquid or an Ark server?

Companies willing to take on the regulatory risk of being kinda-custodians or multisig-custodians.

Lol. "Kinda custodians"

You mean trustodial?

Yes

I would use your wallet if I could use ecash instead of spark. I’m willing to take on the risk for my first 20 dollars.

Trying to understand the difference between Spark and ecash in this 20 dollars case. Why wouldn't you use Spark?

Dogma.

Privacy is dogma?

The ā€œprivacyā€ update here refers to Lightspark no longer publishing all user payments by providing an opt-out api for wallet to their public explorer.

But even after this update Lightspark’s operators still see all payment data. A far cry from the privacy of ecash.

Yes, the trade-off being the custodial trust requirement. If you want maximum privacy (aside from what the mint can see), ecash is an obvious choice for short durations. The issue is that novice users don’t understand what mints are, may not move to self custody, and are more at risk of losing funds if the mint disappears without any notice.

Just stating my personal preference as a user.

As a wallet developer using the graduated SDK I would preconfigure three popular mints in the wallet and preselect one.

The risk of being rugged for the first 20 dollars is there and it needs to be explained in the docs. But this setup would make private bitcoin payments extremely user friendly.

Ecash tokens have mint info encoded in them

Graduated wallets move users to self custody with balance increase. User needs not understand what a mint is.

I prefer privacy, open protocols, and no vendor lockin

As I know, Spark works like Bitcoin, it's an open protocol and no vendor lockin.

Where is the Spark Service Provider source code? Without it third party Spark Entities are not gonna happen.

But above all I’d prefer to not share payments data for first my 20 dollars. Especially when I get LDK’s privacy once I open a channel.

Ok, it's all about tradeoffs, but I think most normal people, a Spark kind solution make more sense. Ecash providers will not want to have the responsibility to keep a lot of peoples money and many providers will have an incentive to steal the money if is too much. And if the police finds one provider and arrest them, other will fear and stop providing the service. It's what I think.

Most normal people use banks, fintechs and credit cards. Even if fiat were to disappear and they had to use bitcoin, why would they change to a wallet?

Re ecash providers getting arrested… we have yet to see evidence of all mints shutting down due to legal risks. I would not operate a mint myself but am happy to pay a fee to someone that does.

I would too, but I don’t know how to configure a wallet by default for a user who doesn’t know anything about ā€œecashā€. Give me the mint URL I can hard-code that we’re both confident will still work in a year and I’ll change it.

To be clear, the underlying code already supports cashu as well as spark. I’d absolutely love to change it, I just need a mint URL…

I’d preconfigure three popular mints and preselect one in settings. Then inform users in the docs. It has a rug risk ofc but would also present a massive UX boost for private bitcoin payments.

No, specifically, which one. Please give me a URL and a description of who operates it and why you think they’ll still be operating it in a year or two.

Minibits is as good as any. That wallet also preconfigures its own mint. There is no guarantee it will be around in two years obv.

Then I don’t see how I can reasonably set that as a default targeting end-users who shouldn’t have to have any idea what ā€œecashā€, let alone ā€œlightningā€ or any other weird Bitcoin jargon means. Let me know when there’s a real mint option and I can use that.

Can the wallet developer preconfigure spark and let advanced users set an ecash mint?

There’s tons of wallets for advanced users to do all kinds of things. I’m not super interested in building another.

Fair enough. It makes sense to have the reference wallet for the graduated sdk use spark. And kudos for demonstrating a native wallet can be vibe coded with the sdk. Definitely a security win over react native. FWIW I hope someone builds a cashu version.

The mint URL is in the Cashu tokens so whomever is sending them sats first would set the default.

Except then you’re building a cashu wallet not a bitcoin wallet. If you want to display a standard receive QR code that every bitcoin wallet can deal with (ie lightning), you have to pick the mint.

Fair.

Trust me I really want to flip the switch and use Cashu not Spark, but the available mints are just not that compelling.

I’m mainly excited this is the product of a few days vibing.

Could you elaborate on the bugs encountered?

bip177 ftw

I was pressured into it

You have 32000 Bitcoin in a test wallet?

Boy I wish.

Shave me off the 57

Well, I tried, but damus won’t let me copy the invoice and primal won’t let me open an outside wallet at all. You got whatever was in my custodial primal wallet tho lol.

42 Sats out of 30000 bitcorns.

Cheapskate

A realize it’s 30k *sats*, right?

Of course šŸ˜…šŸ˜…

Using the bitcoin currency symbol for sats is going to introduce many unnecessary issues in the ecosystem.

To be fair it would probably cause less issues with new adopters.

is the graduated wallet sdk released yet?

It’s still a private gh repo while a few more bits are finished.

In Phoenix they solve the low value wallet problem with JIT/zero conf. I'm curious how Spark compares to that solution. Phoenixd also handles low sat payments with a custodial credit system so maybe that's the biggest difference. You can receive but not resend low values.

Phoenix refuses first-receives under a threshold and generally has relatively high fees due to liquidity allocation and on-chain costs. Graduated wallets allow the LSP to allocate substantially less liquidity and allow the first receive to be as low as a zap. It’s a much better UX if you get all the pieces working.

The phoenixd server handles small first receives differently than mobile app Phoenix. The fee credit system might be interesting as a comparison, with the main caveat that small receives are only accumulated until they can be used to open a channel.

https://share.google/dRjeZArKO0HquEL0m

I don’t find the ā€œfee creditā€ system interesting for a consumer product at all (and I guess ACINQ broadly agrees given they don’t use it in Phoenix). The first payment is *the* experience that a wallet has to get right (and then every other payment but the first one matters a lot). If the first payment is just ā€œthanks for the money, we’re keeping this to pay for fees in the futureā€ I don’t buy that people would keep using that wallet.