You export a month of bank transactions as a CSV, open it in a spreadsheet, and stare at 200 rows wondering where the money went. You could sort and sum by hand every month. Or you could have Claude Code build you a small tool that does it in two seconds, once, and keep it forever.
That is a good first project for someone who doesn't code: it's small, you can check the answer yourself, and it ends with a thing you'll use again. This post walks through exactly that, step by step: install, prompt, review, run, break it, fix it.
One honest note about how I made this. I built the project below in a scratch folder and ran it with Python 3.14, and I checked the totals by adding the sample rows up independently. I could not drive a live interactive Claude Code session while writing, so the code shown is what I built and ran, not a recording of Claude Code producing it. Claude Code will write its own version from your prompt, which will differ in details. The steps and checks are the same. Install steps come from Anthropic's quickstart and terminal guide, which I read on 2026-10-08.
What do you need before you start?
- A paid Claude plan (Pro, Max, Team or Enterprise), or a Claude Console account. Those are the account types Anthropic's quickstart lists.
- A terminal, or the Claude Code desktop app, which Anthropic says lets you skip the terminal entirely. I'll use the terminal because it's the same everywhere.
- A bank or card export as a CSV. Don't use your real one first. Use the sample below.
No international credit card? Our post on Claude Code in India without a credit card covers the options.
How do you install Claude Code if you've never used a terminal?
On a Mac, press Cmd + Space, type Terminal, press Enter. On Windows, press Win + X and choose Windows PowerShell (or Terminal). Then paste one line.
macOS, Linux, or WSL:
curl -fsSL https://claude.ai/install.sh | bash
Windows PowerShell:
irm https://claude.ai/install.ps1 | iex
It shows no progress while it downloads, so wait. Then close the window, open a new one, and check:
claude --version
You should see a version number followed by (Claude Code). If your shell says claude isn't found, the install folder isn't on your PATH yet, and Anthropic's terminal guide has a two-line fix for that. Then make an empty folder for the project, go into it, and start Claude Code:
mkdir spend-checker
cd spend-checker
claude
The first run opens your browser to sign in. Once you're in, you type messages and press Enter. You can't click in the terminal. Press Esc to interrupt, /help for commands.
What is a good first prompt?
Vague prompts get vague tools. A usable one names the input, the output, the rules, and the limits. This is the one I'd paste. Put the sample file below in the folder first.
Save this as transactions.csv in your project folder. It's made-up data, 20 rows, negative amounts are money out:
Date,Description,Amount
2026-09-01,SWIGGY ORDER 8841,-412.50
2026-09-02,UBER TRIP HELP.UBER.COM,-286.00
2026-09-02,NETFLIX.COM,-649.00
2026-09-03,BIGBASKET GROCERIES,-1840.25
2026-09-04,SALARY ACME PVT LTD,85000.00
2026-09-05,SWIGGY ORDER 9120,-530.00
2026-09-06,SPOTIFY AB,-119.00
2026-09-07,UBER TRIP HELP.UBER.COM,-342.00
2026-09-09,ZOMATO ORDER,-615.75
2026-09-10,BIGBASKET GROCERIES,-2210.00
2026-09-11,ELECTRICITY BOARD BILL,-1975.00
2026-09-12,AMAZON PAY MARKETPLACE,-3299.00
2026-09-14,SWIGGY ORDER 9877,-298.00
2026-09-15,CHEMIST 24X7,-450.00
2026-09-16,UBER TRIP HELP.UBER.COM,-199.00
2026-09-18,MYSTERY MERCHANT 42,-1250.00
2026-09-20,NETFLIX.COM,-649.00
2026-09-22,ZOMATO ORDER,-702.50
2026-09-25,BIGBASKET GROCERIES,-1995.00
2026-09-28,GYM MEMBERSHIP,-2000.00
Then the prompt:
I'm not a programmer. This folder has transactions.csv, a bank export with columns Date, Description, Amount (negative = money out). Build me a small tool I can run with python3 that reads the CSV and writes report.html showing: total spent, total income, spending by category sorted largest first, and a list of transactions it couldn't categorise. Categories come from a plain-text file categories.txt that I can edit, one line per category like "Food delivery: swiggy, zomato". Matching is case-insensitive on the description. Use only the Python standard library. Create categories.txt with starter rules for what you see in my file. Work only inside this folder. Then run it and tell me in five lines how to use it and how to add a rule.
Why it's built this way: the editable rules file means you never need to touch code to change behaviour; standard library only means nothing to install; work only inside this folder sets a boundary; the uncategorised list makes the tool show you its own blind spots instead of hiding them.
What happens when Claude Code starts working?
It will propose creating files and ask permission before most edits or commands. Anthropic's quickstart says the session's permission mode sets what Claude can do without asking, and that you press Shift+Tab to switch modes. Docs for recent versions (v2.1.283 and later) say auto mode, where a second model reviews actions instead of you, is the built-in starting mode in interactive terminal sessions. What you see depends on your version and plan, so read the status bar rather than assuming.
For a first project, read each request and say yes to the ones in your folder. Say no to anything that touches a path outside it. That habit is worth more than the tool.
What did the finished tool look like?
Mine was a single file, spend_report.py, of about 70 lines, plus categories.txt. Here is the rules file I used:
Food delivery: swiggy, zomato
Groceries: bigbasket
Transport: uber
Subscriptions: netflix, spotify, gym
Bills: electricity
Health: chemist
Shopping: amazon
The core of the script is three small ideas, and you can follow them without knowing Python:
def categorise(description, rules):
text = description.lower()
for name, words in rules:
if any(w in text for w in words):
return name
return None
Lowercase the description. Go through the categories in order. The first category with a matching keyword wins. If none match, return nothing, and the transaction lands in "Could not categorise". The rest of the script reads the CSV, adds up money by category, and writes the HTML.
I ran it:
Wrote report.html: spent 19,822.00, income 85,000.00, 1 uncategorised
How do you check it's right without reading the code?
This is the step most first-time builders skip, and it's the one that matters. Verify with a calculation you can do independently.
Add up one category by hand. Groceries are three rows: 1,840.25 + 2,210.00 + 1,995.00 = 6,045.25. The report said 6,045.25. Food delivery: 412.50 + 530.00 + 615.75 + 298.00 + 702.50 = 2,558.75, which also matched. Then the grand total: the category totals add up to 19,822.00, which is what the report headline said.
Three matching numbers on different slices is decent evidence. It is not proof. It tells you the logic is right on this data, not on every bank's export.
Then ask Claude Code two questions, which cost nothing:
Explain what each file in this folder does, in plain language, in five lines.
What input would break this tool or give a wrong answer? List the three most likely.
The second question is the useful one. It turns the model from author into critic of its own work.
What breaks first, and how do you fix it?
Two things, and I found both before writing a word of fix.
1. The tool couldn't categorise "MYSTERY MERCHANT 42". That is the tool working as designed: it listed the row under "Could not categorise". The fix needs no code. Open categories.txt and add a line:
Unsorted but known: mystery merchant
Run it again and the output became 0 uncategorised. That is the loop you will repeat monthly: run, look at the uncategorised list, add a rule.
2. Keyword matching is a substring match. The keyword uber also matches any description that contains those four letters inside another word. I checked that 'uber' in 'cuberdon cafe' is true in Python, and gym does the same inside GYMKHANA CLUB DUES. So a club's annual dues would be filed under Subscriptions as a gym. Short keywords are the culprit. If you hit this, tell Claude Code:
A transaction for "GYMKHANA CLUB DUES" got filed as Subscriptions because "gym" matched inside a longer word. Change the matching so keywords only match whole words, then re-run on transactions.csv and show me that the totals are unchanged.
That last clause, "show me that the totals are unchanged", is how you make it prove the fix did not break something else. I haven't run that specific change, so do check the totals yourself afterwards.
There's a third problem I did not hit but you will: real bank exports often differ from my sample. Some have separate Debit and Credit columns, some use dates like 05/09/2026, some put thousands separators in amounts. When that happens, paste the first three lines of your real export (with anything private blanked out) into Claude Code and ask it to adapt the tool. Do not paste account numbers.
How do you run it again next month?
Put the new export in the folder as transactions.csv and run:
python3 spend_report.py
On Windows the command is often python or py instead of python3; I only ran it on macOS, so ask Claude Code for the right command on your machine. Then double-click report.html to open it in your browser. You don't need Claude Code open for this. The tool is just a file now.
Two habits that make the tool last: keep a dated copy of each month's export, and when you change categories.txt, change one rule at a time so you know which one moved the numbers.
What should you take from this beyond the tool?
The pattern generalises. Pick a chore where you already know what a correct answer looks like. Describe input, output, rules and limits. Let it build in an empty folder. Verify against numbers you worked out yourself. Break it deliberately, then fix it by changing a plain-text file or giving one precise instruction.
If you do this, you'll quickly see why careless "just build it" prompting goes wrong. Our write-up of vibe-coding anti-patterns lists the failures, and the Claude Code overview lesson explains what the tool is doing under the hood. When you want Claude to remember your preferences between sessions, write a CLAUDE.md, and when you have a task you repeat, turn it into a skill.
One last caution: this tool handles private financial data. It runs locally, but Claude Code sends file contents it reads to Anthropic's API as part of working. If that's not acceptable for your real statements, practise on sample data like the file above, or strip descriptions down to what you need before sharing.



