<?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: Lokesh Saravanan</title>
    <description>The latest articles on DEV Community by Lokesh Saravanan (@loki_63c4c2b8).</description>
    <link>https://dev.to/loki_63c4c2b8</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%2F4169373%2Ffe0c0dd5-972f-4064-8b39-65110d17105c.png</url>
      <title>DEV Community: Lokesh Saravanan</title>
      <link>https://dev.to/loki_63c4c2b8</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/loki_63c4c2b8"/>
    <language>en</language>
    <item>
      <title>I Taught a Sloth to Write Its Own Chores (Then Put It in a Cage)</title>
      <dc:creator>Lokesh Saravanan</dc:creator>
      <pubDate>Sun, 25 Oct 2026 14:54:15 +0000</pubDate>
      <link>https://dev.to/loki_63c4c2b8/i-taught-a-sloth-to-write-its-own-chores-then-put-it-in-a-cage-59bk</link>
      <guid>https://dev.to/loki_63c4c2b8/i-taught-a-sloth-to-write-its-own-chores-then-put-it-in-a-cage-59bk</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;Sloth is a single Python file that does file chores from one sentence. You type something like &lt;code&gt;sort everything in Downloads by file type&lt;/code&gt;, a local open-weight model writes a tiny script for it, Sloth shows you the plan, and you press &lt;code&gt;y&lt;/code&gt; once. That is the whole interface.&lt;/p&gt;

&lt;p&gt;I pointed it at my own Downloads folder: 151 loose files, one sentence, one keypress. Afterwards the folder held exactly one file, Sloth itself.&lt;/p&gt;

&lt;p&gt;The rule I built around: &lt;strong&gt;the AI plans, dumb code applies.&lt;/strong&gt; The model's script never touches the disk. It can only call a few helpers (&lt;code&gt;sloth.ls&lt;/code&gt;, &lt;code&gt;sloth.move&lt;/code&gt;, &lt;code&gt;sloth.match&lt;/code&gt;, &lt;code&gt;sloth.read&lt;/code&gt;) that &lt;em&gt;record&lt;/em&gt; what it wants to do. Nothing moves until I approve the preview, and every run goes onto a stackable undo list (&lt;code&gt;--undo&lt;/code&gt;). Save a good script as a "habit" and it reruns later with no model at all.&lt;/p&gt;

&lt;p&gt;Sloth also reads inside PDFs, Word files and screenshots (OCR), so it can sort by &lt;em&gt;meaning&lt;/em&gt;, not just extension. All offline.&lt;/p&gt;

&lt;p&gt;Who gets lazier? Anyone whose Downloads folder has turned into a landfill. That was me.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frirn8q0ucbe9tpm10dq6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frirn8q0ucbe9tpm10dq6.gif" alt="Sloth demo: type a chore, preview the plan, press y, undo" width="719" height="382"&gt;&lt;/a&gt;&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%2Fdzmnnjrhsu6ailddavjv.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%2Fdzmnnjrhsu6ailddavjv.png" alt="The model's script and the plan, before pressing y" width="799" height="445"&gt;&lt;/a&gt;&lt;br&gt;
          &lt;strong&gt;The model’s script and the plan, before I press y.&lt;/strong&gt;&lt;br&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%2Fpztkcwcbmpwfv13kxifn.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%2Fpztkcwcbmpwfv13kxifn.png" alt="After y: 15 files sorted into folders" width="800" height="323"&gt;&lt;/a&gt;&lt;br&gt;
          &lt;strong&gt;After y: 15 files sorted.&lt;/strong&gt;&lt;br&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%2Frydty080zsw3tpaw8ckn.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%2Frydty080zsw3tpaw8ckn.png" alt="After undo: every file is back" width="776" height="682"&gt;&lt;/a&gt;&lt;br&gt;
          &lt;strong&gt;After --undo: every file is back.&lt;/strong&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/lokeshsp2010" rel="noopener noreferrer"&gt;
        lokeshsp2010
      &lt;/a&gt; / &lt;a href="https://github.com/lokeshsp2010/sloth" rel="noopener noreferrer"&gt;
        sloth
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Lazy file chores with local open-weight models
    &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;Sloth&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Lazy file chores with local open-weight models.&lt;/strong&gt; Describe a chore in plain English. A local model writes a tiny script, Sloth shows you the plan, and you press &lt;code&gt;y&lt;/code&gt; once.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/82cbf3f74ebb5022b126b20ae990e497f8035be9728b16cca6ab3c2751165cf5/68747470733a2f2f6465762d746f2d75706c6f6164732e73332e75732d656173742d322e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f7232676136766a6f703236637a6b7835646c66632e676966"&gt;&lt;img src="https://camo.githubusercontent.com/82cbf3f74ebb5022b126b20ae990e497f8035be9728b16cca6ab3c2751165cf5/68747470733a2f2f6465762d746f2d75706c6f6164732e73332e75732d656173742d322e616d617a6f6e6177732e636f6d2f75706c6f6164732f61727469636c65732f7232676136766a6f703236637a6b7835646c66632e676966" alt="Sloth demo: type a chore, preview the plan, press y, undo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Built for the Hacktoberfest Open-Source AI Challenge, Week 3: "Slow and Steady". Everything runs locally through &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;. No cloud, no API key, no per-run cost.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;You type a chore: &lt;code&gt;python sloth.py "sort everything in Downloads by file type"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A local model writes a short script using a small set of helper functions.&lt;/li&gt;
&lt;li&gt;The script runs inside a cage and only &lt;strong&gt;records&lt;/strong&gt; what it wants to do. It never touches your disk.&lt;/li&gt;
&lt;li&gt;Sloth shows a preview table. You press &lt;code&gt;y&lt;/code&gt; to apply, or anything else to cancel.&lt;/li&gt;
&lt;li&gt;Every applied run goes on an undo stack. &lt;code&gt;--undo&lt;/code&gt; reverses it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The idea: &lt;strong&gt;the AI plans, dumb code applies.&lt;/strong&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Requirements&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Python 3.12 (tested on Windows)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt; running locally with…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/lokeshsp2010/sloth" 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;python sloth.py &lt;span class="s2"&gt;"sort everything in Downloads by file type"&lt;/span&gt; &lt;span class="nt"&gt;--show&lt;/span&gt; &lt;span class="nt"&gt;--save&lt;/span&gt; dl
python sloth.py &lt;span class="nt"&gt;--undo&lt;/span&gt;
python sloth.py &lt;span class="nt"&gt;--bench&lt;/span&gt; &lt;span class="s2"&gt;"sort everything in Downloads by file type"&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;Everything runs on models and packages that were already on my laptop. I downloaded nothing new for this project.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;What I used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Writes the script&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;llama3.1:8b-instruct-q4_K_M&lt;/code&gt; via Ollama, temperature 0.1, three few-shot examples&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quick per-file questions&lt;/td&gt;
&lt;td&gt;&lt;code&gt;hermes3:3b&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Matches files to folders by meaning&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;nomic-embed-text&lt;/code&gt; embeddings + cosine similarity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cage for the model's script&lt;/td&gt;
&lt;td&gt;&lt;code&gt;RestrictedPython&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reads files offline&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pypdf&lt;/code&gt;, &lt;code&gt;docx2txt&lt;/code&gt;, &lt;code&gt;rapidocr-onnxruntime&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preview table&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rich&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background mode (&lt;code&gt;--watch&lt;/code&gt;, experimental, not field-tested)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;watchdog&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is the script llama3.1 actually wrote for my chore, printed with &lt;code&gt;--show&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;home&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Downloads&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sloth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sloth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;folder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;kind&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;sloth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The cage is &lt;strong&gt;guardrails, not a fortress&lt;/strong&gt;: RestrictedPython, a home-folder lock, blocked file-writing methods, and the fact that the script only plans. I would not run untrusted code through it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where it broke (the honest part)
&lt;/h3&gt;

&lt;p&gt;Small local models fail &lt;em&gt;confidently&lt;/em&gt;. Here is what went wrong on my real files:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Wrong destination.&lt;/strong&gt; I said "sort Downloads". It moved my files into &lt;code&gt;Documents&lt;/code&gt; and &lt;code&gt;Pictures&lt;/code&gt; instead of folders inside Downloads. Fix: a prompt rule to create new folders inside the folder being sorted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forced guesses.&lt;/strong&gt; I gave &lt;code&gt;match()&lt;/code&gt; three bare labels, so embeddings had to pick one. A bank statement landed in "Resumes". Fix: label descriptions, plus a &lt;code&gt;Review&lt;/code&gt; bucket when two labels score too close. I have not tuned that threshold properly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The silent partial.&lt;/strong&gt; The preview showed 9 actions while my folder held over 100 files. The model's script only handled leftovers (and moved &lt;code&gt;desktop.ini&lt;/code&gt; into "Installers"). I pressed &lt;code&gt;y&lt;/code&gt; anyway. Fix: a "HEADS UP: N other files are NOT touched" warning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My cage was too tight.&lt;/strong&gt; The jail blocked &lt;code&gt;mkdir&lt;/code&gt;, so a correct script failed. Fix: &lt;code&gt;mkdir&lt;/code&gt; became a harmless no-op, since folders are created on apply.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Empty plans.&lt;/strong&gt; Now Sloth tells the model "zero actions, look again" and retries once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Undo leaves empty folders behind.&lt;/strong&gt; Files go back where they were, but the folders Sloth created stay. Known wart, next on my list.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The fix was never a bigger model. It was &lt;strong&gt;preview, a coverage warning and undo&lt;/strong&gt;. When my first runs misfiled things, &lt;code&gt;--undo&lt;/code&gt; put everything back.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;My files stay mine.&lt;/strong&gt; To sort by meaning, Sloth reads the inside of my PDFs, Word files and screenshots. My Downloads folder holds tax and bank paperwork. With a closed API that is an upload. Here, nothing left the machine. I even skipped the &lt;code&gt;:cloud&lt;/code&gt; models in my Ollama list, because they would have broken that promise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I could read what the model decided.&lt;/strong&gt; When it got something wrong, I printed the script and saw why. A closed agent with disk access would just have done it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swapping models is one flag.&lt;/strong&gt; &lt;code&gt;--bench&lt;/code&gt; runs the same chore across four local models and prints a table:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model (local, via Ollama)&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Result (one try, no retries)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;llama3.1:8b-instruct-q4_K_M&lt;/td&gt;
&lt;td&gt;112s&lt;/td&gt;
&lt;td&gt;OK, 15 actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mistral:latest&lt;/td&gt;
&lt;td&gt;169s&lt;/td&gt;
&lt;td&gt;OK, 15 actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hermes3:3b&lt;/td&gt;
&lt;td&gt;61s&lt;/td&gt;
&lt;td&gt;FAIL: broken indentation in its script&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llama3.2:1b&lt;/td&gt;
&lt;td&gt;21s&lt;/td&gt;
&lt;td&gt;OK, 15 actions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same chore on a 15-file test folder. "OK" means the script ran and planned all 15 moves. I did not check every destination by hand.&lt;/p&gt;

&lt;p&gt;The surprise: the tiny 1B model was about 5x faster than the 8B one and passed this simple chore. The 3B model failed on a plain indentation slip. The bench gives one try, but real Sloth retries up to 3 times and feeds the error back to the model. Single runs include model load time, so treat the times as rough.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No bill, no internet.&lt;/strong&gt; It costs nothing per run, and a saved habit does not even need a model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The honest trade-off: a big closed model would probably have written fewer wrong scripts. What I got in exchange was privacy, a script I can read, and a cage I could build around it. For a tool that touches every file I own, I'll take that trade.&lt;/p&gt;

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

&lt;p&gt;I ran it on my real Downloads folder today: 151 files sorted from one sentence. I did not time it, and I'll be upfront: building Sloth took far more effort than sorting once by hand. The payoff is the second run, because a saved habit reruns with no model and no typing.&lt;/p&gt;




&lt;p&gt;What chore would you hand to a sloth?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;AI disclosure: I used Claude to help write and debug the code and to draft this post. The testing, the failures above, and the decisions are from running it on my own machine.&lt;/em&gt;&lt;/p&gt;

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