<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Roman</title>
    <description>The latest articles on DEV Community by Roman (@svobodarabstvo).</description>
    <link>https://dev.to/svobodarabstvo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F953916%2Faea29b7a-314d-4d45-b0cf-ea7c7c4a062f.jpeg</url>
      <title>DEV Community: Roman</title>
      <link>https://dev.to/svobodarabstvo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/svobodarabstvo"/>
    <language>en</language>
    <item>
      <title>My AI Is Slow. So I Gave It the Night Shift 🌙</title>
      <dc:creator>Roman</dc:creator>
      <pubDate>Wed, 21 Oct 2026 13:42:57 +0000</pubDate>
      <link>https://dev.to/svobodarabstvo/my-ai-is-slow-so-i-gave-it-the-night-shift-28a1</link>
      <guid>https://dev.to/svobodarabstvo/my-ai-is-slow-so-i-gave-it-the-night-shift-28a1</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;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 &lt;em&gt;boring&lt;/em&gt; work, and boring work is exactly what gets postponed forever.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Night Butler&lt;/strong&gt;: an open-weight model that does that boring work while I sleep.&lt;/p&gt;

&lt;p&gt;Before bed you drop three kinds of mess into a folder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;bank statement&lt;/strong&gt; as your bank exports it — 100 lines like &lt;code&gt;SQ *BLUE BOTTLE COFFEE 4421 SAN FRANCISCO CA -6.75&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;quick notes&lt;/strong&gt; — &lt;code&gt;call dentist re: crown, they close fri&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;to-do list&lt;/strong&gt; where the same task hides under two names.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;every merchant named and sorted into a category;&lt;/li&gt;
&lt;li&gt;your subscriptions, and the one that &lt;strong&gt;quietly went up&lt;/strong&gt; (Netflix: $15.49 → $17.99);&lt;/li&gt;
&lt;li&gt;a charge &lt;strong&gt;taken twice&lt;/strong&gt; (Adobe, $59.99 on Sep 12 and again on Sep 14);&lt;/li&gt;
&lt;li&gt;a bill &lt;strong&gt;far above its usual&lt;/strong&gt; (electricity: $142.37, usually about $84);&lt;/li&gt;
&lt;li&gt;every note with a title and tags, and the &lt;strong&gt;to-dos hidden in notes&lt;/strong&gt; pulled out — "before thursday" turned into a real date;&lt;/li&gt;
&lt;li&gt;"Cancel the gym membership" and "cancel planet fitness" &lt;strong&gt;merged&lt;/strong&gt; into one task;&lt;/li&gt;
&lt;li&gt;the tasks you have been ignoring for over a month.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the part I like most: it &lt;strong&gt;knows when it does not know&lt;/strong&gt;. &lt;code&gt;PAYPAL *JSMITHDESIGN&lt;/code&gt; and &lt;code&gt;SQ *KOKO 88&lt;/code&gt; could be anything, so instead of guessing, the butler asks. Three questions, three clicks, and it remembers your answers forever.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Sa6IFCooxe4" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;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 &lt;strong&gt;6 minutes on an Intel i5-12450H laptop CPU, with no GPU&lt;/strong&gt;. The second night took 31 seconds, because the butler already knew 47 of its answers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm8b9mchwlaqfxjswkmed.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm8b9mchwlaqfxjswkmed.png" alt="The morning page" width="799" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/romanrostislavovich" rel="noopener noreferrer"&gt;
        romanrostislavovich
      &lt;/a&gt; / &lt;a href="https://github.com/romanrostislavovich/night-butler" rel="noopener noreferrer"&gt;
        night-butler
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌙 Night Butler&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;My AI is slow. That's why it works the night shift.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/romanrostislavovich/night-butler/docs/morning.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fromanrostislavovich%2Fnight-butler%2FHEAD%2Fdocs%2Fmorning.png" alt="The morning page"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does overnight&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Inbox&lt;/th&gt;
&lt;th&gt;What the butler does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;bank/*.csv&lt;/code&gt; — any bank's CSV&lt;/td&gt;
&lt;td&gt;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&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;notes/*.md&lt;/code&gt; — quick notes&lt;/td&gt;
&lt;td&gt;gives each note a title and tags (reusing yours), pulls out the to-dos hidden in it; "before thursday" becomes a real date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;tasks.md&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/romanrostislavovich/night-butler" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull qwen2.5:7b
git clone https://github.com/romanrostislavovich/night-butler &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;night-butler
node src/cli.ts demo                              &lt;span class="c"&gt;# a made-up month to try it on&lt;/span&gt;
node src/cli.ts &lt;span class="nb"&gt;shift&lt;/span&gt; &lt;span class="nt"&gt;--dir&lt;/span&gt; night-butler-demo     &lt;span class="c"&gt;# the night shift, right now&lt;/span&gt;
node src/cli.ts review &lt;span class="nt"&gt;--dir&lt;/span&gt; night-butler-demo    &lt;span class="c"&gt;# the morning page&lt;/span&gt;
node src/cli.ts schedule &lt;span class="nt"&gt;--dir&lt;/span&gt; ~/butler &lt;span class="nt"&gt;--at&lt;/span&gt; 02:00 &lt;span class="nt"&gt;--until&lt;/span&gt; 07:00   &lt;span class="c"&gt;# every night, for real&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The model: Qwen2.5 7B Instruct (open weights, Apache 2.0) in Ollama&lt;/strong&gt;, 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero runtime dependencies.&lt;/strong&gt; Node 24 runs the TypeScript directly; Ollama's &lt;em&gt;structured outputs&lt;/em&gt; make every answer JSON of a schema I give; &lt;code&gt;node:http&lt;/code&gt; serves the morning page. Under 2,000 lines, tests included.&lt;/p&gt;

&lt;p&gt;What surprised me is how much of the work was making a &lt;em&gt;small&lt;/em&gt; model trustworthy. A few things I learned the hard way:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Don't ask a small model how confident it is.&lt;/strong&gt; My first version asked for a confidence from 0 to 1. Qwen2.5 3B answered "90%" for everything — including filing my salary under &lt;em&gt;Groceries&lt;/em&gt;. So I changed the question. The model now first writes what the merchant sells, then answers a yes/no: &lt;em&gt;do you actually know this business?&lt;/em&gt; Only then does it pick a category. With the 7B model this gave exactly what I wanted: Netflix, PG&amp;amp;E, Trader Joe's and 19 others were sorted correctly, and the three genuinely unclear ones (a Venmo payment, &lt;code&gt;JSMITHDESIGN&lt;/code&gt;, &lt;code&gt;KOKO&lt;/code&gt;) became morning questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Take away the wrong answers.&lt;/strong&gt; Money &lt;em&gt;in&lt;/em&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The model reads; the code counts.&lt;/strong&gt; 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 &lt;em&gt;before&lt;/em&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Give it sentences, not numbers.&lt;/strong&gt; The morning note first came out as "you have $97 in transactions to review" — 97 was a &lt;em&gt;count&lt;/em&gt;. 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Slow and steady, literally.&lt;/strong&gt; 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. &lt;code&gt;--until 07:00&lt;/code&gt; 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. &lt;strong&gt;Every night is faster than the one before.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3B or 7B?&lt;/strong&gt; 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Look at what the butler reads: &lt;strong&gt;every payment I made for four months, my medical notes ("knee hurts after running again"), my work plans.&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;Open weights also made the &lt;em&gt;design&lt;/em&gt; 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 &lt;em&gt;might&lt;/em&gt; 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.&lt;/p&gt;

&lt;p&gt;And it stays mine: the weights don't change under me overnight, &lt;code&gt;temperature: 0&lt;/code&gt; gives the same answer for the same question, and when a better open model comes out, changing one line in &lt;code&gt;night-butler.json&lt;/code&gt; makes the butler re-read everything with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;On the demo month the butler did, in 6 minutes of a laptop's spare CPU:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sorted 97 of 100 transactions (the other 3 waiting for one click each);&lt;/li&gt;
&lt;li&gt;found a price rise, a double charge of $59.99 and an electricity bill 70% above usual;&lt;/li&gt;
&lt;li&gt;tidied 6 notes and found 8 to-dos hidden in them, with real due dates;&lt;/li&gt;
&lt;li&gt;merged a duplicate task and surfaced 5 forgotten ones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My morning part: reading one short note and &lt;strong&gt;three clicks — about a minute&lt;/strong&gt;. 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And on my own money.&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;Night Butler is also the first piece of something bigger: it will become the night shift of &lt;a href="https://github.com/romanrostislavovich/personal-dashboard" rel="noopener noreferrer"&gt;Personal Dashboard&lt;/a&gt;, my self-hosted dashboard of a whole life, where it will tidy every section while I sleep.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built with open weights, a slow laptop and a lot of respect for laziness.&lt;/em&gt; 🌙&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
