<?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: SarpDoruk06</title>
    <description>The latest articles on DEV Community by SarpDoruk06 (@sarpdoruk06).</description>
    <link>https://dev.to/sarpdoruk06</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%2F4164133%2F1b845bc0-89d1-46b9-b7d9-7b4cfa1de780.png</url>
      <title>DEV Community: SarpDoruk06</title>
      <link>https://dev.to/sarpdoruk06</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sarpdoruk06"/>
    <language>en</language>
    <item>
      <title>Your local lazy file tidier: sloth-tidy</title>
      <dc:creator>SarpDoruk06</dc:creator>
      <pubDate>Mon, 26 Oct 2026 00:09:12 +0000</pubDate>
      <link>https://dev.to/sarpdoruk06/your-local-lazy-file-editer-sloth-tidy-25mh</link>
      <guid>https://dev.to/sarpdoruk06/your-local-lazy-file-editer-sloth-tidy-25mh</guid>
      <description>&lt;p&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;/p&gt;

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

&lt;p&gt;Ever since I bought my first computer, I have had one annoying problem: messy files. I am a bit lazy myself and I hate boring tasks, so I built sloth-tidy.&lt;/p&gt;

&lt;p&gt;sloth-tidy is a small Python tool that tidies a messy folder for me. A local open model (Gemma, running through Ollama) reads each file, picks a suitable folder for it, and gives it a clean, readable name. Uni files go to Uni, receipts go to Receipts, tickets go to Travel, and you can add your own folders. This makes my life much easier, especially when I need to find a document for an application and every file has a messy name.&lt;/p&gt;

&lt;p&gt;It also does a few things I find really useful as a student:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Calendar reminders:&lt;/strong&gt; if a document contains a future date (a flight ticket, a reservation, an exam), it offers to create a reminder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicates:&lt;/strong&gt; if two files are identical, it asks which one to keep, so the folder stays clean. Nothing is deleted; the other copy just moves to a Duplicates folder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Undo:&lt;/strong&gt; it keeps a log of every move, so if I do not like the result, I can undo the last run.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/rEWJ3euYJP8" width="710" height="399"&gt;
  &lt;/iframe&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/SarpDoruk06" rel="noopener noreferrer"&gt;
        SarpDoruk06
      &lt;/a&gt; / &lt;a href="https://github.com/SarpDoruk06/sloth-tidy" rel="noopener noreferrer"&gt;
        sloth-tidy
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A lazy local file tidier powered by Gemma and Ollama for Hacktoberfest
    &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-tidy 🦥&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A lazy, fully local file tidier. Point it at a messy folder (like Downloads) and a
local open-weight model (Gemma, via Ollama) decides which folder each file belongs
in and gives it a readable name. No cloud, no API key, no account.&lt;/p&gt;
&lt;p&gt;Built for the DEV / Hacktoberfest Open-Source AI Challenge, Week 3: "Slow and Steady".&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sorts files&lt;/strong&gt; into folders such as Uni, Receipts, Travel. Photos, installers and
archives are sorted by file type without using the model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offers calendar reminders.&lt;/strong&gt; If a document mentions a future date (a flight, an exam
a deadline), it asks "Create a calendar reminder? [y/N]". Say yes and it makes a &lt;code&gt;.ics&lt;/code&gt;
file with an alert one day before and opens it in your calendar app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finds duplicates.&lt;/strong&gt; If two files are byte-for-byte identical it asks which to keep
The other goes to &lt;code&gt;Duplicates/&lt;/code&gt;. Nothing is ever deleted.&lt;/li&gt;
&lt;li&gt;…&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/SarpDoruk06/sloth-tidy" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Code: &lt;a href="https://github.com/SarpDoruk06/sloth-tidy" rel="noopener noreferrer"&gt;https://github.com/SarpDoruk06/sloth-tidy&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model&lt;/strong&gt;: I used Gemma (gemma3:4b) running locally through Ollama.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; Basically, files like photos and installers are sorted by extension, so no model is needed. For documents, the first page of text goes to Gemma, which answers in JSON: a folder, a short name, and an optional event. I check every answer before anything moves: unknown folders become "Other", and past or invalid dates are dropped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicates&lt;/strong&gt;: SHA-256 hashes, only for files of the same size.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reminders&lt;/strong&gt;: I had the idea to add reminders to make the tool even more useful. The model only &lt;em&gt;suggests&lt;/em&gt; an event, because creating a calendar entry every time it sees a future date would be annoying and risky. A standard &lt;code&gt;.ics&lt;/code&gt; file is created only after I say yes, so a misread date never reaches my calendar on its own. I wanted the tool to be lazy but still under my control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety&lt;/strong&gt;: I wanted to know what the tool will do before it does it, and to never regret anything. So dry run is the default, nothing is ever overwritten or deleted, and &lt;code&gt;--undo&lt;/code&gt; reverts the last run. In my demo test, undo brought back 9 of 9 files. This was the case for most of the test runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests&lt;/strong&gt;: 21 tests with pytest, and GitHub Actions runs them on every push. I also tested the tool on my own folders. In one of the tests, on the first run, a folder with 47 files went through smoothly, and by my last test I had brought the response time down from 301.8 s to 244.2 s. On a second folder of 25 files it took 130.8 s: 8 files sorted by extension, 12 by the model, 5 duplicates, and 2 scans without readable text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI help&lt;/strong&gt;: I built this together with a little help from an AI assistant, Claude. I did a small part of the coding and most of the debugging on my own. I decided what the tool should do, tested everything on my own files, and kept noting down response times, file types, errors and bugs. The problems I found:

&lt;ul&gt;
&lt;li&gt;undo skipped files after an old log was left in the folder&lt;/li&gt;
&lt;li&gt;a scanned PDF with no readable text, which the model could only judge by its file name&lt;/li&gt;
&lt;li&gt;a payment receipt that landed in Travel instead of Receipts&lt;/li&gt;
&lt;li&gt;two reminders for the same trip (a ticket and its receipt). I chose to show both with a warning instead of merging them quietly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The undo problem and the double reminders are fixed. The scans without text are a limit of the tool, because it has no OCR.&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; Important things such as receipts, travel tickets and uni documents never leave my laptop. If you ask why this matters to me: my downloads folder contains documents with personal details, and I would not upload them to a server I do not control. This way I keep full control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works offline and costs nothing&lt;/strong&gt; after the one-time model download. For me this is the major upside with the ridiculous prices of some closed APIs these days. Plus, it helps you learn some coding along the way. No account, no API key, no subscription. For a student this means huge savings and being able to learn new things. Also not worrying about managing your account when you have midterms coming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I can swap the model&lt;/strong&gt;. For this project I only focused on Gemma and didn't use any other models. I tried some versions of it for testing though. The good thing is that sloth-tidy has a built-in --model option, so anyone can try another open model without changing the code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest limits.&lt;/strong&gt; Small models make mistakes. Even when you spend countless hours on a project to perfect it there are bound to be some mistakes. I encountered some myself, such as a payment receipt going to the Travel folder, or some scans without readable text. Another was that in one of my tests I had some python files and I couldn't manage to make the tool sort them into the Uni folder. This is precisely why dry run, undo and confirmation exist.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I tested sloth-tidy on copies of my own folders.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Demo folder, 9 files:&lt;/strong&gt; All 9 were sorted correctly, one duplicate was found, and undo brought everything back. The dry run took 61.9 s. Two reminder ideas were found (an exam and a train ticket) and I accepted one. The files were simple, so the time saved was small: I guess it would take me 2 to 3 minutes by hand.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;47 files:&lt;/strong&gt; My first big test went through smoothly. Over my tests I brought the response time down from 301.8 s to 244.2 s. Normally going through 47 files, looking to each ones content and also adding a reminder if there needs to be one would take more than 20 to 25 minutes. So I would say this program saves me at least 15 minutes by doing a 20-minute job in 4 minutes. I can also do something else while it runs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;25 files:&lt;/strong&gt; Sorted in 130.8 s. 8 files were sorted by file type, 12 by Gemma, 5 were duplicates, and 2 were scans without readable text, so the model could only judge them by file name. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;15 messy files:&lt;/strong&gt; All 15 were sorted correctly, and undo brought everything back. I cannot say for sure how much time it saved me, because the files were not very complicated, only one reminder was needed and 15 files is not really enough to call a folder messy. It took the program about 90 s and I guess it would take me around 3-4 minutes manually.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What went wrong:&lt;/strong&gt; In tests that include many files some were sorted wrongly. A payment receipt landed in Travel instead of Receipts. I left this in the post on purpose: a small local model is not perfect and can still get a messy real-world file wrong, and  that is why dry run, undo and confirmation exist. Although this specific issue was later fixed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also has a &lt;code&gt;--watch&lt;/code&gt; mode: it tidies the folder in the background every few minutes, so I do not have to remember to run it and I can do something else while it runs.&lt;/p&gt;

&lt;p&gt;Sloth-tidy is not perfect: it cannot read scanned PDFs yet (OCR is the next thing I would like to add), and a small model sometimes picks the wrong folder. But it already does what I wanted: it tidies my folders while I do something else, and my files never leave my laptop.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; the whole tool runs on Gemma (&lt;code&gt;gemma3:4b&lt;/code&gt;) locally through Ollama. It uses Gemma to read the documents, pick a folder, suggest a clearer name, and find dates for reminders. Nothing ever leaves my laptop&lt;/p&gt;

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