-
-
Two ways in: prepared sandbox data in one click, or Log in with PayPal.
-
Your payments as weekly chapters. A sandbox purchase just became a new one.
-
Every sentence shows the PayPal payments behind it.
-
Tell Soul what it got wrong, and it rewrites the chapter.
-
Memory: everything Soul believes, and the payments behind each belief.
-
Chat answers with your correction in mind, and lists its payments.
Inspiration
My PayPal history is a long list of rows. It's accurate, but it doesn't tell me much. I can't see that I've been buying groceries for my mum every week, that morning coffee quietly became a habit, or that one payment last month was much bigger than usual. And when I ask a chatbot about my spending, it answers once and forgets me by the next question.
I wanted something that reads my payments the way a friend would: it notices things, says what it thinks, and changes its mind when I tell it it's wrong. Because every transaction has a meaning behind it.
What it does
Soul connects to a PayPal sandbox account and turns its payments into a story, one chapter per week.
- Story. Each chapter is a few sentences about that week. Every sentence is tied to the real sandbox payments behind it. Tap one and you see them, with their PayPal transaction IDs.
- Noticing. Soul opens with something it noticed: a habit forming, or a payment much bigger than usual. For an unusual payment it asks you instead of guessing.
- Corrections. If Soul gets something wrong, you tell it ("those groceries are for my mum"). It updates what it believes, rewrites the weeks that belief touches, and shows you what changed. You can undo it. A one-off ("that was a birthday gift") stays a one-off.
- Memory. One page with everything Soul believes about you and the payments behind each belief. Edit a belief, tell Soul to stop using it, or tell Soul something about yourself.
- Chat. Ask about your money in plain words. Chat answers from your payments and from what you've told Soul, and lists the payments it used.
- Actions. Buy Something Small and Send Money, both in the sandbox. You always confirm on PayPal, and the new payment becomes a new chapter.
- Your data stays yours. No sign-up. Each visitor gets a private copy, and Delete My Data removes everything.
Try it in one click with prepared sandbox data, or Log in with PayPal and connect your own sandbox personal account.
How we built it
- Next.js 16 (App Router), TypeScript and Tailwind 4, hosted on Vercel.
- The browser only talks to Soul's own server routes. Those call PayPal, Supabase and the AI models, so no key ever reaches the browser.
- Supabase Postgres with row level security. Every visitor is an anonymous Supabase user, so nobody can read anyone else's rows.
- PayPal developer platform (sandbox):
- Consent through a Platform app, so a person can let Soul read their own sandbox account
- Transaction Search to import payments, reading only what's new since last time
- Balances, read live when Chat is asked
- Orders API with capture, for Buy Something Small and Send Money
- Webhooks with signature checks, so a payment finished in another tab still lands in the story
- Sandbox subscriptions, which gave the prepared account a real day-by-day history
- AI through OpenRouter:
- Claude Haiku 5.5 sorts payments into categories, writes each chapter from figures code has already worked out, reads corrections, and words Chat's answers.
- Claude Opus 5.5 plans Chat's answers: it picks from 25 read-only functions (totals, people, categories, habits, balance), and code runs them on the person's data.
- Payment text is always passed to the models as data, never as instructions.
- A daily job captures approved orders, imports new payments and cleans up visitors who left 30 days ago.
- About 285 automated tests with Vitest, many against a real Supabase project.
- Built with Claude Code as a coding assistant.
Challenges we ran into
- Keeping AI honest about money. A model that invents a total is worse than useless. Code computes every figure, the model only words it, and every amount in an answer is checked against the data before it's shown.
- Corrections that don't break everything. "That was a gift" should change one payment, not who I am. Telling a one-off apart from a broader correction took a lot of tests.
- Sandbox data has real dates. You can't bulk-create a three-week habit. The prepared history comes from daily sandbox subscriptions charging on real days.
- Reading someone else's sandbox. Letting a judge connect their own sandbox needed a Platform app, PayPal's consent flow, and a Check Connection step for when the return trip fails.
Accomplishments that we're proud of
The correction moment. You tell Soul it's wrong, and you watch the chapter rewrite itself with the change marked. It feels like being listened to.
What we learned
Memory is what makes an assistant feel personal, and memory only works when you can see it and fix it.
What's next for Soul
- Production access from PayPal, so it can work with real accounts (today it's sandbox only, on purpose)
- Monthly and yearly chapters
- More actions, always confirmed by the person on PayPal
Built With
- claude
- claude-code
- nextjs
- openrouter
- paypal
- paypal-orders-api
- paypal-rest-api
- paypal-webhooks
- postgresql
- react
- supabase
- tailwindcss
- typescript
- vercel
- vitest


