<?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: Raymonds Mason</title>
    <description>The latest articles on DEV Community by Raymonds Mason (@billythompsons).</description>
    <link>https://dev.to/billythompsons</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%2F4199299%2Fb7713203-318d-4065-8dd7-abf938a116a3.png</url>
      <title>DEV Community: Raymonds Mason</title>
      <link>https://dev.to/billythompsons</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/billythompsons"/>
    <language>en</language>
    <item>
      <title>DonePile: I Let an Open-Weight Model Do the Task I Dread Most — Sorting My Messy Notes</title>
      <dc:creator>Raymonds Mason</dc:creator>
      <pubDate>Thu, 22 Oct 2026 09:29:58 +0000</pubDate>
      <link>https://dev.to/billythompsons/donepile-i-let-an-open-weight-model-do-the-task-i-dread-most-sorting-my-messy-notes-10ge</link>
      <guid>https://dev.to/billythompsons/donepile-i-let-an-open-weight-model-do-the-task-i-dread-most-sorting-my-messy-notes-10ge</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the Hacktoberfest "Slow and Steady" Challenge — Week 3: Open Source AI, on DEV.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;DonePile — Notes to Done List.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everyone has the pile. Mine looks like this: half-finished meeting notes,&lt;br&gt;
a brain-dump typed at midnight, "sarah said she can fix it by friday??",&lt;br&gt;
"renew the domain before it expires on the 28th!!", "CALL THE DENTIST".&lt;br&gt;
The dreaded task isn't doing the tasks — it's the 20+ minutes of re-reading,&lt;br&gt;
rewriting, assigning and prioritising it takes to turn that pile into a list&lt;br&gt;
you can actually act on. So I automated exactly that dreaded step.&lt;/p&gt;

&lt;p&gt;DonePile takes a messy pile of notes and returns a clean, prioritised&lt;br&gt;
done-list: every actionable item extracted, with an &lt;strong&gt;owner&lt;/strong&gt;, a &lt;strong&gt;due&lt;br&gt;
day/date as written in the notes&lt;/strong&gt;, and a &lt;strong&gt;priority&lt;/strong&gt; (High / Medium / Low),&lt;br&gt;
grouped and checkbox-ready in Markdown or in a tiny local web UI.&lt;/p&gt;

&lt;p&gt;And it does it &lt;strong&gt;entirely on my own machine, on CPU, with an open-weight&lt;br&gt;
model&lt;/strong&gt;. No cloud, no API key, no account, no per-token meter — because&lt;br&gt;
meeting notes and brain dumps are precisely the text I don't want to paste&lt;br&gt;
into someone else's cloud.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📦 Code: &lt;a href="https://github.com/billythompsons/donepile" rel="noopener noreferrer"&gt;https://github.com/billythompsons/donepile&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;▶️ Live demo / demo output: &lt;a href="https://github.com/billythompsons/donepile/blob/main/evidence/SMOKE-TEST.md" rel="noopener noreferrer"&gt;https://github.com/billythompsons/donepile/blob/main/evidence/SMOKE-TEST.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fastest demo (one command, on the bundled messy sample):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python demo.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Real input (excerpt, from &lt;code&gt;samples/messy-notes.txt&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ok so website landing page hero text is still wrong, sarah said she can fix it by friday??
mike: api keys are expiring, he needs to rotate them before monday or the demo breaks
renew the domain before it expires on the 28th!! costs like $12 just do it
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Real output: the smoke test in the repo (&lt;code&gt;evidence/SMOKE-TEST.md&lt;/code&gt;) saves the&lt;br&gt;
exact raw model output and the rendered done-list from an actual run —&lt;br&gt;
&lt;strong&gt;13 tasks extracted locally&lt;/strong&gt; (about 40 seconds on a small 2-core VM; a typical&lt;br&gt;
laptop is faster), including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rotate API keys&lt;/strong&gt; — Owner: Mike · Due: monday · High&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send invoice to client&lt;/strong&gt; — Owner: Priya · Due: wednesday · High&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Renew domain&lt;/strong&gt; — Owner: Me · Due: 28th · High&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team lunch order&lt;/strong&gt; — Owner: Alex · Due: thursday morning · Low&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's also a local web UI if you prefer paste-and-click:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python app.py   &lt;span class="c"&gt;# then open http://127.0.0.1:8765&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full recorded demo output: see &lt;code&gt;demo-output.md&lt;/code&gt; and &lt;code&gt;evidence/SMOKE-TEST.md&lt;/code&gt; in the repo — both are files, captured from a real run, not mock-ups.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/billythompsons/donepile" rel="noopener noreferrer"&gt;https://github.com/billythompsons/donepile&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/billythompsons/donepile
&lt;span class="nb"&gt;cd &lt;/span&gt;donepile
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt   &lt;span class="c"&gt;# builds llama-cpp-python (needs a C compiler + cmake)&lt;/span&gt;
python demo.py                    &lt;span class="c"&gt;# first run downloads the model once (~1.07 GB)&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; donepile.cli your-notes.txt &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Project layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;donepile/engine.py   # local inference: model download, llama.cpp load, extraction prompt, JSON parsing
donepile/render.py   # deterministic formatting only: dedupe, priority sort, Markdown/text, effort-saved estimate
donepile/cli.py      # command-line interface
app.py               # local web UI (Python standard library only)
demo.py              # one-command demo on the bundled sample
samples/messy-notes.txt
tests/               # helper tests (no model needed)
evidence/SMOKE-TEST.md  # real input -&amp;gt; raw model output -&amp;gt; rendered list
&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;Open-weight model at the core:&lt;/strong&gt; Qwen2.5-1.5B-Instruct (Apache-2.0), in&lt;br&gt;
GGUF Q4_K_M format (~1.07 GB). Small enough to run happily on an ordinary&lt;br&gt;
laptop CPU, capable enough to read a messy pile and understand "he needs to&lt;br&gt;
rotate them before monday" means &lt;em&gt;Mike owns the API keys, due Monday&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open-source AI harness:&lt;/strong&gt; llama.cpp, via &lt;code&gt;llama-cpp-python&lt;/code&gt; (MIT). It loads&lt;br&gt;
the GGUF weights, runs chat-completion inference on CPU threads, and after&lt;br&gt;
the one-time model download the whole thing works &lt;strong&gt;fully offline&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The technique is mostly a strict prompt + honest plumbing:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A system prompt that demands &lt;em&gt;only&lt;/em&gt; a JSON array of
&lt;code&gt;{task, owner, due, priority}&lt;/code&gt; objects — every actionable item, nothing
invented, no prose — plus one small worked example.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chunking:&lt;/strong&gt; the pile is fed to the model 4 lines at a time. I first
tried one big call (and a 0.5B model); owners and dates drifted to the
wrong lines. Small models keep them attached far more reliably on short
inputs — that one change took the output from mush to a list I'd
actually use.&lt;/li&gt;
&lt;li&gt;Low temperature (0.1), because this is extraction, not poetry.&lt;/li&gt;
&lt;li&gt;A tolerant parser that validates each item and normalises priorities.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;An honesty note I want in the open:&lt;/strong&gt; the extraction — the actual reading&lt;br&gt;
and understanding — is the model's work. The only deterministic code after it&lt;br&gt;
drops &lt;em&gt;exact&lt;/em&gt; duplicates, sorts High → Medium → Low, and formats the output.&lt;br&gt;
There is no rule-based fallback dressed up as AI; if the model isn't there,&lt;br&gt;
DonePile says so and tells you how to download it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitations, plainly:&lt;/strong&gt; a 1.5B model is still a small brain. In my smoke&lt;br&gt;
test it extracted 13 solid tasks but skipped the groceries line and folded&lt;br&gt;
"the Q4 slides" into "Get chart from Ben", and it can pick a priority I'd&lt;br&gt;
set differently. I treat&lt;br&gt;
the output as an excellent first draft that takes me from &lt;em&gt;dread&lt;/em&gt; to &lt;em&gt;list&lt;/em&gt;&lt;br&gt;
in about a minute of CPU time — then I skim and adjust. Dates are extracted as written&lt;br&gt;
("friday", "the 28th"); it doesn't set calendar reminders. Yet.&lt;/p&gt;

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

&lt;p&gt;DonePile exists only because two open things met: a capable&lt;br&gt;
instruction-tuned model published under &lt;strong&gt;Apache-2.0&lt;/strong&gt;, and a community&lt;br&gt;
harness (&lt;strong&gt;llama.cpp&lt;/strong&gt;, MIT) that makes open weights run anywhere — including&lt;br&gt;
a modest CPU with no GPU and no cloud bill.&lt;/p&gt;

&lt;p&gt;That changes who gets to build what. "AI that quietly does the boring parts&lt;br&gt;
of life" shouldn't require an API key, a subscription, or handing a company&lt;br&gt;
your private notes. Open weights mean the tool can be inspected, run&lt;br&gt;
offline, forked, and improved by anyone — and a weekend Hacktoberfest&lt;br&gt;
project by one person can stand on the same model a large company uses.&lt;br&gt;
That's the whole spirit of open source, now applied to AI itself: the&lt;br&gt;
capability is shared, so the laziness can be too.&lt;/p&gt;

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

&lt;p&gt;My estimate is deliberately transparent (it's a formula in&lt;br&gt;
&lt;code&gt;donepile/render.py&lt;/code&gt;, not marketing): manually sorting a pile costs roughly&lt;br&gt;
&lt;strong&gt;1.5 minutes per item + 5 minutes of initial sorting&lt;/strong&gt;. A typical 14-item&lt;br&gt;
pile is &lt;strong&gt;~24.5 minutes saved — every single time the pile forms&lt;/strong&gt;, plus the&lt;br&gt;
bigger, unmeasurable payoff: the pile stops being a thing I dread and&lt;br&gt;
avoid, so the tasks on it actually get done.&lt;/p&gt;

&lt;p&gt;Less time re-reading my own mess. More time doing — or, in the spirit of&lt;br&gt;
Slow and Steady, &lt;em&gt;not&lt;/em&gt; doing. 🦥&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;Submitting for the Hacktoberfest Week 3 "Slow and Steady" Open Source AI&lt;br&gt;
Challenge overall / featured consideration — a brand-new project built with&lt;br&gt;
an open-weight model and open-source AI tooling at its core, automating a&lt;br&gt;
dreaded task and rewarding a little well-earned laziness.&lt;/p&gt;

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