This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady
What I Built
Every month I promise myself I will go through my bank statement. Every week I promise to clean up the notes I scribble on my phone and the to-do list where "cancel the gym" lives twice. I never do. It is not hard work β it is boring work, and boring work is exactly what gets postponed forever.
So I built Night Butler: an open-weight model that does that boring work while I sleep.
Before bed you drop three kinds of mess into a folder:
- a bank statement as your bank exports it β 100 lines like
SQ *BLUE BOTTLE COFFEE 4421 SAN FRANCISCO CA -6.75; -
quick notes β
call dentist re: crown, they close fri; - a to-do list where the same task hides under two names.
At night the butler works through it, one thing at a time, at the lowest CPU priority of the computer. In the morning you get a short note from it and a page where everything that needs you is one click:
- every merchant named and sorted into a category;
- your subscriptions, and the one that quietly went up (Netflix: $15.49 β $17.99);
- a charge taken twice (Adobe, $59.99 on Sep 12 and again on Sep 14);
- a bill far above its usual (electricity: $142.37, usually about $84);
- every note with a title and tags, and the to-dos hidden in notes pulled out β "before thursday" turned into a real date;
- "Cancel the gym membership" and "cancel planet fitness" merged into one task;
- the tasks you have been ignoring for over a month.
And the part I like most: it knows when it does not know. PAYPAL *JSMITHDESIGN and SQ *KOKO 88 could be anything, so instead of guessing, the butler asks. Three questions, three clicks, and it remembers your answers forever.
Who gets to be lazier? Anyone who has a bank app, a notes app and a to-do list β and a laptop that sleeps less than they do.
Demo
A real run on a made-up month: 100 transactions, 6 notes, 14 tasks. The night log in the video is the actual output, sped up β the whole shift took 6 minutes on an Intel i5-12450H laptop CPU, with no GPU. The second night took 31 seconds, because the butler already knew 47 of its answers.
Code
π Night Butler
My AI is slow. That's why it works the night shift.
Night Butler is a small open-weight model on your own computer that does your boring paperwork while you sleep. At 2 a.m. it goes through your bank statement, your scribbled notes and your to-do list β one thing at a time, at the lowest CPU priority β and in the morning you get a short note from the butler and a page where every open question is one click.
What it does overnight
| Inbox | What the butler does |
|---|---|
bank/*.csv β any bank's CSV |
names every merchant and sorts it into a category; finds subscriptions, a price that crept up, a charge taken twice, a bill far above its usual |
notes/*.md β quick notes |
gives each note a title and tags (reusing yours), pulls out the to-dos hidden in it; "before thursday" becomes a real date |
tasks.md
|
ollama pull qwen2.5:7b
git clone https://github.com/romanrostislavovich/night-butler && cd night-butler
node src/cli.ts demo # a made-up month to try it on
node src/cli.ts shift --dir night-butler-demo # the night shift, right now
node src/cli.ts review --dir night-butler-demo # the morning page
node src/cli.ts schedule --dir ~/butler --at 02:00 --until 07:00 # every night, for real
How I Built It
The model: Qwen2.5 7B Instruct (open weights, Apache 2.0) in Ollama, on the CPU of an ordinary laptop. About 8 seconds per answer. In a chat window that would be painful. At 3 a.m. it does not matter at all β and that turned into the whole design.
Zero runtime dependencies. Node 24 runs the TypeScript directly; Ollama's structured outputs make every answer JSON of a schema I give; node:http serves the morning page. Under 2,000 lines, tests included.
What surprised me is how much of the work was making a small model trustworthy. A few things I learned the hard way:
1. Don't ask a small model how confident it is. My first version asked for a confidence from 0 to 1. Qwen2.5 3B answered "90%" for everything β including filing my salary under Groceries. So I changed the question. The model now first writes what the merchant sells, then answers a yes/no: do you actually know this business? Only then does it pick a category. With the 7B model this gave exactly what I wanted: Netflix, PG&E, Trader Joe's and 19 others were sorted correctly, and the three genuinely unclear ones (a Venmo payment, JSMITHDESIGN, KOKO) became morning questions.
2. Take away the wrong answers. Money in can only be Income, a Transfer or Other β so for incoming money the model is not even offered "Groceries". The JSON schema is the guardrail.
3. The model reads; the code counts. Subscriptions, price rises, double charges, unusual bills β that is arithmetic, and arithmetic is free and exact in plain code. Dates too: given a note written on Wednesday that says "they close fri", the model confidently said Oct 13 β the day before the note was written. Now the model only copies the words ("fri", "before thursday", "by oct 31") and a small function turns them into dates.
4. Give it sentences, not numbers. The morning note first came out as "you have $97 in transactions to review" β 97 was a count. Now the code writes the facts as finished sentences ("Netflix.com went up from $15.49 to $17.99 a month") and the model only retells them warmly. No more invented numbers.
5. Slow and steady, literally. Every answer is saved the moment it arrives, keyed by a hash of the question. Kill the shift, close the lid, run it again β it continues where it stopped. --until 07:00 ends the shift at seven even with work left; tomorrow continues from there. And every answer you give in the morning becomes a rule, so the model is never asked about that merchant again. Every night is faster than the one before.
3B or 7B? On the same data, Qwen2.5 3B was three times faster but unusable for money (it either trusted itself completely or knew nobody) and missed that "Planet Fitness" is a gym. Qwen2.5 7B took 6 minutes instead of 3 and got it right. During the day I would have picked the fast one. At night I picked the right one β that trade is the whole point of this challenge.
Why Does Open Innovation Matter?
Look at what the butler reads: every payment I made for four months, my medical notes ("knee hurts after running again"), my work plans. This is the most private data I have. I would never send it to a cloud API every night β and I don't have to. The model runs on my laptop; the bank statement never leaves it. There is no account, no API key, no bill.
Open weights also made the design possible. With a paid API, every token costs money and every second of latency is a product problem, so you build for speed. With a local model, time is free and tokens are free β so I could build for patience instead: ask the model about every pair of tasks that might be duplicates, re-read every note, let it take 8 seconds per merchant. A closed API would have pushed me to cut exactly the corners that make the result trustworthy.
And it stays mine: the weights don't change under me overnight, temperature: 0 gives the same answer for the same question, and when a better open model comes out, changing one line in night-butler.json makes the butler re-read everything with it.
The Lazy Payoff
On the demo month the butler did, in 6 minutes of a laptop's spare CPU:
- sorted 97 of 100 transactions (the other 3 waiting for one click each);
- found a price rise, a double charge of $59.99 and an electricity bill 70% above usual;
- tidied 6 notes and found 8 to-dos hidden in them, with real due dates;
- merged a duplicate task and surfaced 5 forgotten ones.
My morning part: reading one short note and three clicks β about a minute. Doing the same by hand would take me, honestly, the half hour I never find; and the $59.99 double charge alone would have stayed unnoticed.
And on my own money. This week I ran it on my real data β 344 transactions over four months, exported from my own dashboard. In 14 minutes on my laptop it sorted 307 of them (89%) and asked me about 23 merchants it honestly did not know. My first real night also taught the butler two things the demo never could: a grocery store you visit every week is not a subscription, and two ATM withdrawals on the same day are not a double charge. Both are fixed now β real data is the best code reviewer.
Night Butler is also the first piece of something bigger: it will become the night shift of Personal Dashboard, my self-hosted dashboard of a whole life, where it will tidy every section while I sleep.
Built with open weights, a slow laptop and a lot of respect for laziness. π


Top comments (0)