Inspiration

I was tired of doomscrolling, and I knew the only way to make it hurt was to make it hit my pockets. Locking apps isn’t new, but every blocker I found way's around it. I wanted the unlock to cost something real, and then I wanted that money to be useful instead of just gone.

What it does

Spendy locks the apps you can't put down. To open one, you pay by card. Crossmint delivers that payment as USDC to a Coinbase CDP wallet, and the wallet pays it over x402 to unlock your apps for a short window before they lock themselves again. The idea is that the money sits in a smart contract time vault for two weeks before coming back, so the habit has a consequence. The rest of your USDC is a budget for an AI agent. Instead of paying fees to move money back to your bank, you tell the agent what to buy. If a merchant supports x402, it pays in USDC directly. If it doesn't, the agent creates a one-time virtual card capped at the item's price, cancelled after one use, so it never holds your real card.

How we built it

SwiftUI with Apple’s Screen Time and Family Controls APIs for the lock, and a DeviceActivity extension for the automatic re-lock. A Node, TypeScript and Express backend. Coinbase’s CDP SDK and x402 for payments on Base Sepolia, for both the unlock and the agent’s purchases. Crossmint’s staging onramp for card-to-USDC. Stripe Issuing in test mode for the one-time cards, with Playwright filling the merchant checkout. Claude through the Anthropic API as the agent, with spend limits enforced in code.

Challenges we ran into

I called Bridge at 5:30 in the morning before my flight to see if I could get into a sandbox they have with Visa for stablecoin-backed cards. I couldn't get access, so I built my own version with Stripe Issuing instead. Stripe then rejected the documented financial_account parameter, and I only found the fix by reading the request my own dashboard had sent, which used financial_account_v2. Coinbase's setup took a while too, with 401s and a wallet secret that's separate from the API key. Screen Time doesn't work in the simulator at all, so every lock test needed a real iPhone. And the server stopped starting entirely at one point, which turned out to be a corrupted node_modules.

Accomplishments that we're proud of

It works end to end on a real phone. The payments are real on Base Sepolia and visible on the explorer. The one-time card gets declined on its second use, which I can show live. And I shipped the whole money path, card to USDC to x402 to a card-only merchant, in one weekend, alone.

What we learned

Have teammates.

What's next for Spendy

Hopefully, It can come to the real world after this weekend.

Built With

Share this project:

Updates

Submission history