How We Built
Tang's Bank
Dad had an idea. He typed it to a computer. Five days later you had a bank. This is what actually happened in between — including all the bits that went wrong.
Seven stages
Almost every piece of software is built in the same seven stages. Ours were not neat — stages 4, 5 and 6 kept sending us back to stage 3 — but they were all there.
Decide what it's for
Draw it
Build it in pieces
Try to break it
Put it somewhere real
Use it, and fix what annoys you
Write down how it works
It started with one sentence
1 Decide what it's for"I am trying to build a bank pwa for my kids so that they can develop concept of money."
So we agreed the big idea first: Dad is the bank. The app doesn't hold any money. It's a notebook that both of you can see, and the real notes stay in his wallet.
We drew it before we built it
2 Draw itSeventeen pictures of screens, before a single button worked. Dad looked at them and said what he thought.
"The wireframe designs look boring to kids."
"What is Jar? I still don't get how it works."
Both fair. The drawings were grey and flat, so they were thrown away and drawn again in the yellow-and-navy stickers you use now.
And "jars" — a saving idea we'd designed — got deleted before it was ever built, because if Dad couldn't explain it, you were never going to enjoy it.
A thing worth noticing
The best decision in the whole project was removing something. Building more is easy. Knowing what to leave out is the hard part.
The rules were the point
3 Build it in piecesEvery rule in the bank exists to make a lesson cost something, instead of just explaining it.
Interest pays on your lowest balance
Not what you end the month with. Dip into your money on the 20th and you earn as if you'd been that poor all month. That one rule teaches patience better than any sentence could.
Every trade costs a fee — both ways
Buy and sell on the same day at the same price and you are visibly poorer. HK$100 in, HK$98 back. The fee gets its own line in your record, because a hidden cost teaches nothing.
Nothing is ever rubbed out
Not even by Dad. If he makes a mistake he has to add a line that undoes it, and you get to see both. A bank you can't check isn't a bank.
Then things broke
4 Try to break itThis is the honest part. Building something isn't typing it correctly the first time. It's finding what's wrong, over and over.
The PIN screen did nothing
You could type your four numbers and the app just sat there. No error, no message. Nothing.
What was wrong: the code asked itself "am I busy?", and the act of saying "yes, I'm busy" cancelled the very thing it was busy doing. It cancelled itself, every single time.
Your record showed the wrong balance
Every line said what your money was before that thing happened, instead of after. The newest line always read zero.
How it was found: by looking at a picture of the screen. Not by any test.
The fee was 8 times too big
The smallest fee was meant to be one Hong Kong dollar. When you bought something American, the app charged one US dollar instead — nearly eight times as much.
A US$2 share showed as instantly down 50%.
Dad spotted it in a screenshot, in about two seconds.
Bitcoin appeared to crash 87%
One morning the chart showed Bitcoin falling off a cliff. It hadn't moved at all.
What was wrong: half the prices were saved in Hong Kong dollars and half in US dollars, and the chart drew them on the same line. Like measuring half a race in metres and half in feet.
Four bugs, one cause. All four happened because the app was built when there was only one kind of money, and adding a second one quietly broke every place that had assumed there was only ever one.
Dad said "no" a lot
6 Use it, and fix what annoys youMost of the five days was not building new things. It was Dad looking at something, saying what was wrong with it, and it being made again.
"The explainer is way too long."
"You can still see a trace of unfinished loading. It looks cheap."
"No more purple in the PWA please."
"Hey, why is Kid A's balance inflated?"
That last one was fair too — money left over from testing had been sitting in the account, and it should have been cleaned up.
The plan card alone was rebuilt four times. The saving explainer, three. The first version of almost everything was wrong.
The five days
- Drew every screen, twice
- Built the record, the passcode and the PINs
- Added saving, investing and points — all in one day
- Named it Tang's Bank and put it on the internet
- Rebuilt the record so each day groups together
- Made deleting a plan keep its promise to whoever was already in it
- Wrote down how the whole thing works, so it can be rebuilt from nothing
- Made tapping between tabs feel instant
- Wrote down three ideas for later: borrowing, bills, sending money to each other
- Stopped the loading flicker that "looked cheap"
- Changed the greeting from your last spend to what your money earned this month
- Added US dollars, and a way to change money at the real daily rate
- Made saving plans work in either currency
- Let you ask for new things to invest in
- Removed every last bit of purple
- Built the tour you saw when you first opened it
The whole conversation
Everything Dad typed, in order, with what happened after each one. His words are in the yellow bubbles — those are real. The grey lines are what got built or found.
Day 1 — Tuesday 2 September
The whole bank, start to finish“I am trying to build a bank pwa for my kids so that they can develop concept of money. Please help me design it.”
First question back: who is it for and what should change? Two kids, 9 to 12, in Hong Kong. The answer shaped everything after.
Wrote a design brief. The big rule: Dad is the bank. The app never holds money — it is a shared notebook, and the real notes stay in his wallet.
“There are some things I want to include. Parents create interest rate plans from time to time, and kids choose which one to put money into — so they learn the market changes and not to put everything in one basket.”
“Investment. I want to include crypto and some stocks. To keep it simple, use the daily closing price.”
“And points they can redeem, to use in another app. I won't let them earn money directly for things they do — but they can use their money to buy points. The rate floats.”
Three big ideas in one message. Each became a whole part of the app.
“Show me the design first to confirm.”
Made a design page describing every screen before writing any code.
“Let me have the wireframe first.”
Drew 17 phone screens as pictures. Kid screens and parent screens.
“The wireframe page is extremely hard to use and see.”
Fair — the first version was inside a fiddly drawing tool. Rebuilt as one plain page you just scroll.
“The wireframe designs look boring to kids. Also for the points redeem, I want the option to turn it off, as I want to make it limitedly available.”
Threw away the grey drawings and redrew all 17 in the yellow-and-navy stickers you use now. Added a switch so the points shop can be shut.
“What is Jar?”
A jar was a savings goal — money set aside for one thing.
“I still don't get how it works. Locked fund with no interest?”
Deleted jars entirely. If Dad could not explain it, a kid was never going to enjoy it. One of the best decisions of the whole project, and it was a decision to build less.
“Go.”
Hit a wall immediately: the database service only allows two free projects and both were used. Paused an old unused one to make room, with Dad's permission first.
Built the record. Names, PIN numbers, and the list of every movement of money. Made the database itself refuse to ever change or delete a line.
Tested it and found two bugs. The PIN screen did nothing at all when you typed four numbers. And every line of the record showed the wrong balance.
Built saving. Plans Dad publishes, weekly allowance that pays itself, and interest that lands on the first of the month.
Built investing. Real shares and crypto, real prices fetched every night, a fee on every buy and every sell.
Built points. A price that drifts each day, and a shop Dad can open and shut.
“Rename it to Tang's Bank, and change the link to use the pokermon.dev domain.”
Renamed everything a kid sees and moved it to bank.pokermon.dev.
“Send to Pearl.”
Sent the link and the passcodes to Mum on WhatsApp.
“The Passbook page is not very intuitive. Transactions on the same day can be put under the same date section.”
Rebuilt it. One date heading per day, each day showing what it ended with, and a picture on every line so you can tell allowance from a trading fee before reading a word.
“Change the tab Save to Saving. Add a brief explainer at the top telling the kid how the plan works.”
Wrote a three-step explainer.
“The explainer is way too long.”
Cut it to one line.
“Lock your money to earn extra bonus!! Now choose your plan!”
Used Dad's own words instead. They were better.
Day 2 — Wednesday 3 September
Making it make sense“The saving plan card — rearrange the information so it is more intuitive.”
The card led with "6% a month", which means nothing to a nine-year-old.
Rebuilt it around a worked example: Put in HK$100 → Get back HK$106, with an arrow between. Now two plans can be compared without doing any maths.
“The parent has no way to edit or delete an existing saving plan.”
Built editing and deleting.
“I don't want to make it complicated.”
Cut it back.
“Just don't need to edit the plan.”
Removed editing entirely. Delete only.
“We should still honour any plan that is deleted. Just delete the plan from showing on the kids' screen.”
This was the important one. A real delete would have stranded money the app could no longer work out the value of.
Made "delete" mean hide. Anyone already in the plan keeps their exact payout and exact date. Tested it: a kid promised HK$21.20 on 3 October still saw exactly that after the plan was deleted.
“Write documentation to the repo.”
Wrote 1,500 lines of notes so the whole thing could be rebuilt from nothing — and an honest audit listing eight things still wrong with it.
Day 3 — Thursday 4 September
Making it feel fast“The loading speed of swapping from tab to tab is a bit slow.”
Measured it before changing anything. Tapping a tab did nothing visible for about half a second.
Found two causes. The app was asking the database who you are five times before a tab even started loading. And there was no loading picture, so the old tab just sat there looking frozen.
Fixed both. A tap now changes the screen in about 50 thousandths of a second instead of 900.
“Suggest a module to add. We have saving, investment, and points.”
Suggested borrowing. The kids only ever earn interest — they have never paid any. Most adult money trouble is debt, not failing to invest.
“Save these to the backlog: borrowing, recurring bills, and transfers to family members.”
Wrote all three down, with what each teaches and what could go wrong. Transfers, for example, need care — one sibling could lean on the other.
“Now update the docs.”
Updated everything, including two diagrams showing how the pieces connect.
“On the Saving page, switching between Plans and Locked feels sluggish.”
Those two tabs were reloading the whole page from the internet — for information the phone was already holding. Now it switches in 32 thousandths of a second and asks the internet for nothing.
Day 4 — Saturday 6 September
Small things that matter“Hey, why is Kid A's balance inflated?”
Because of me. I had added HK$200 during testing and not cleaned it up. Showed the entire list of what was mine and what was real.
“Is there any deleted plan? I cannot see it in Dad's account.”
Correct, and it was a real hole. Kid A had HK$20 locked inside a deleted plan, and Dad had nowhere at all to see that.
Added a red "Deleted, but still owed" section, showing who has money inside a deleted plan and when it pays out. It empties itself once everyone is paid.
“The plan card: put the percentage beside the days at the top. Remove "that's 10% a month". Make the bottom line shorter and more pronounced.”
All three.
“Revamp the locked money card the same way.”
Made it mirror the plan card exactly, with a bar that fills as the days pass.
“On the home tab, change the top speech bubble to show performance this month, instead of the last thing that happened — which is usually negative and doesn't motivate the kids.”
A very good catch. The bubble had been greeting a child with a red number every single time they opened their bank.
Changed it to what their money earned this month. It counts only interest and bonuses, so it can never be a negative number. If they have earned nothing yet it nudges instead: "Lock some money away and it starts earning all by itself."
“The loading between tabs is fast now, but I can still see a trace of unfinished loading. It looks cheap and unfinished.”
Right again. The loading picture was flashing up and vanishing inside a third of a second, which reads as a glitch rather than as feedback.
Made it wait 420 thousandths of a second before appearing, so a normal tap never shows one at all. Instead the tab itself lights up the moment you touch it.
Day 5 — Sunday 7 September
Two kinds of money“For US assets, display in USD. So we need a currency exchange — let them convert HK dollars to US dollars, show US dollar cash, but show total assets in HK dollars. Use the last day's closing rate.”
The biggest single change of the week. Three questions had to be settled first: which money pays the fee, can you change back, and does changing cost anything.
Dad chose: fee in US dollars, changing works both ways, and changing money is free. Free on purpose — the rate moving is already the lesson, and a fee on top would put a kid off ever trying.
“Also, design the code to prepare for more kinds of currency exchange.”
Rebuilt it so nothing in the app names a specific pair of currencies. Adding Japanese yen later is one row in a list, not a rewrite.
Then found four bugs, all the same mistake: code written when there was only one kind of money had quietly assumed there always would be. Two of them Dad spotted himself, just by looking at the screen.
“For US assets, set the transaction fee to 0.1 USD.”
Gave each currency its own smallest fee, so it stays a round number instead of drifting with the exchange rate.
“When the kids buy US shares without enough USD, the app should prompt them to convert first. And the convert function should be available when they tap HK dollar cash on the home page.”
Built both. Being short of a currency now offers a Change money button instead of just refusing.
“Make sure the change money flow is consistent across different scenarios.”
Checked every screen. Found five places saying the same thing five different ways — and one telling a kid to change money on a page the changer had moved off.
Made all five go through one piece of code. Three wordings for one situation teaches a child that the app is arbitrary.
“The bottom wish card colour sucks. No more purple in the PWA please.”
Deleted purple from the app's list of colours entirely, so nothing can reach for it again. It was in nine places, including Dad's own avatar.
“Make "earn extra bonus" say "earn extra interest", and make it stand out. And prepare for saving plans in different currencies — from time to time I want to offer a higher or lower interest rate on US dollar deposits.”
Gave every plan its own currency. Dad can now offer 10% a month on HK dollars and 2% on US dollars at the same time, and change either one alone.
“I need an introductory tour for the kids who first use the app. Suggest me the skeleton before we develop it.”
Offered a choice: bubbles pointing at the real app, which teaches better but breaks when things get redesigned — or a safe sequence of cards that teaches less.
“Option A.”
Built the tour over the real app. Then extended it to actually point at the plan card, the lock button and a share, using labels stuck to those elements — so a future redesign makes a step slightly weaker instead of breaking it.
“Build a webpage that shows the conversation of us. I want to show my kid how I developed this bank with you.”
This page.
What to take from this
Nobody gets it right first
Forty-two saves in five days. Most of them were fixing or improving something that already existed.
Saying what's wrong is a real skill
"This looks boring" and "I don't understand jars" changed the app more than any clever code did. You don't need to know how to build something to make it better.
Look at the actual thing
The two worst bugs were found by a person glancing at the screen and noticing a number that looked wrong. Not by any test. Just by looking.
Built with Claude Code between 2 and 7 September 2026. Every quote on this page is something Dad actually typed. Every bug described here really happened.