<?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: Hiteshi Kukreja</title>
    <description>The latest articles on DEV Community by Hiteshi Kukreja (@hiteshi).</description>
    <link>https://dev.to/hiteshi</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%2F4156647%2Fff190cc0-1392-4d7b-8861-8765b87b56a6.png</url>
      <title>DEV Community: Hiteshi Kukreja</title>
      <link>https://dev.to/hiteshi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hiteshi"/>
    <language>en</language>
    <item>
      <title>File-Tidier: My Folders Are a Crime Scene. So I Built a Tool to Clean Up the Mess.</title>
      <dc:creator>Hiteshi Kukreja</dc:creator>
      <pubDate>Sat, 24 Oct 2026 16:12:37 +0000</pubDate>
      <link>https://dev.to/hiteshi/file-tidier-i-like-an-organised-computer-i-just-dont-want-to-spend-my-time-organising-it-2bm1</link>
      <guid>https://dev.to/hiteshi/file-tidier-i-like-an-organised-computer-i-just-dont-want-to-spend-my-time-organising-it-2bm1</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;I like keeping my files and folders organised. I want to open my Downloads folder and know where things are. I want files to have names that tell me what's inside them, instead of &lt;code&gt;document.pdf&lt;/code&gt;, &lt;code&gt;final_v2.txt&lt;/code&gt; or &lt;code&gt;IMG_001.jpg&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The problem is that keeping everything tidy is easy only until new files start arriving.&lt;/p&gt;

&lt;p&gt;A PDF for a project. A receipt I might need later. Notes from something I'm learning. A document downloaded in a hurry and forgotten five minutes later. The Downloads folder grows, files pile up, and the organisation I worked to maintain slowly disappears.&lt;/p&gt;

&lt;p&gt;And then comes the worst part: you urgently need a file, but you don't know which document contains the information you're looking for. You start opening files one by one, trying to work out what each one is. Sometimes the file has the information you need, but its name tells you absolutely nothing.&lt;/p&gt;

&lt;p&gt;I could organise everything manually. I just don't want another small, repetitive task taking time away from the work I actually want to do.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;File-Tidier&lt;/strong&gt;, a local AI file organiser powered by Gemma 3 4B through Ollama.&lt;/p&gt;

&lt;p&gt;It reads supported file content, suggests a meaningful filename and a suitable folder, and helps organise files into categories such as Study, Personal, Receipts, Travel, Photos and Work. When there's nothing it can read, or it can't make sense of a file, it goes to Needs-Review instead. You can also archive anything older than a threshold you choose, such as six months.&lt;/p&gt;

&lt;p&gt;The idea is simple: &lt;strong&gt;spend less time organising your files, and less time searching for them later.&lt;/strong&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%2F3l1nzve3yrrd9ukg0wc2.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%2F3l1nzve3yrrd9ukg0wc2.png" alt="File-Tidier previewing a stress-test run" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few real results from my tests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;bill_final.txt&lt;/code&gt; became &lt;code&gt;Receipts/rent_receipt_may_2026.txt&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;flight_ticket.pdf&lt;/code&gt; was really a restaurant bill, so it became &lt;code&gt;Receipts/restaurant_bill_example.pdf&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A blank image went to &lt;code&gt;Needs-Review/IMG_001.jpg&lt;/code&gt; with its name untouched, because the tool couldn't honestly say what it was&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;p&gt;Watcher demo (lazy mode):&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/ys9RGrQ7zRk" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&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/Kuki-09" rel="noopener noreferrer"&gt;
        Kuki-09
      &lt;/a&gt; / &lt;a href="https://github.com/Kuki-09/file-tidier" rel="noopener noreferrer"&gt;
        file-tidier
      &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;File-Tidier&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A local AI file organizer that understands file contents, gives files meaningful names and sorts them without taking control away from you&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Demo: &lt;a href="https://youtu.be/tXRiyng47rw" rel="nofollow noopener noreferrer"&gt;Main Demo&lt;/a&gt; · &lt;a href="https://youtu.be/ys9RGrQ7zRk" rel="nofollow noopener noreferrer"&gt;Watcher Demo&lt;/a&gt; · Evaluation: &lt;a href="https://github.com/Kuki-09/file-tidier/eval/EVAL.md" rel="noopener noreferrer"&gt;eval/EVAL.md&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;File-Tidier uses Gemma 3 4B through Ollama to organize messy folders on your own computer. Instead of relying only on filenames, it reads supported documents and images, proposes descriptive names and sorts files into Study, Personal, Receipts, Travel, Photos, Work, or Needs-Review.&lt;/p&gt;
&lt;p&gt;It also supports &lt;strong&gt;optional age-based archiving:&lt;/strong&gt; choose an age threshold, such as six months and older files can be moved into Archive/ while preserving their category folders.&lt;/p&gt;
&lt;p&gt;A generic bill_final.txt can become Receipts/rent_receipt_may_2026.txt and flight_ticket.pdf, which was really a restaurant bill, became Receipts/restaurant_bill_example.pdf. A misleading filename does not have to dictate where a file goes. If a file cannot be read reliably, it can be routed to Needs-Review rather than treated as something the model understands.&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Kuki-09/file-tidier" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
scan -&amp;gt; read a short snippet -&amp;gt; Gemma names and sorts -&amp;gt; code checks the name

     -&amp;gt; preview -&amp;gt; confirm -&amp;gt; move -&amp;gt; undo log

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Gemma suggests, code decides
&lt;/h3&gt;

&lt;p&gt;A tidier moves real files, so a confident wrong answer costs more than a slow one. My rule was: Gemma proposes, and code has the last word.&lt;/p&gt;

&lt;p&gt;For each file, Gemma sees the first 1,500 characters of a document (images are shrunk to 896 px) and returns JSON that pydantic validates. It gets one retry, and if that fails the file goes to Needs-Review. Around the model, ordinary code does the safety work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It never overwrites a file; a name clash gets &lt;code&gt;_2&lt;/code&gt;, &lt;code&gt;_3&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It logs every folder it creates, so undo removes only those.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It never reads or moves files with sensitive names (&lt;code&gt;.env&lt;/code&gt;, keys, passwords, passport). That's a name check in code, not a model judgment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It scans the top level only and skips symlinks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If there's nothing to read (a blank image, an empty or broken file, a format it can't open), it doesn't ask the model at all. The file goes to Needs-Review with its name unchanged.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The bug that taught me where the model belongs
&lt;/h3&gt;

&lt;p&gt;My first prompt told Gemma to rename every file it processed. It did, even the files that already had good names.&lt;/p&gt;

&lt;p&gt;So I added an instruction: check whether the original name is already meaningful. That failed in a stranger way. For a file called &lt;code&gt;some.pdf&lt;/code&gt;, Gemma wrote a good name, &lt;code&gt;relu_activation_script&lt;/code&gt;, and still answered &lt;em&gt;keep &lt;code&gt;some.pdf&lt;/code&gt;&lt;/em&gt;. It was good at naming a file from its content and unreliable at judging the old name.&lt;/p&gt;

&lt;p&gt;I tightened the prompt and added a check in code: the old name is kept only if the model says keep &lt;strong&gt;and&lt;/strong&gt; at least 60% of the old name's words appear in the new name. After both changes, &lt;code&gt;some.pdf&lt;/code&gt;, &lt;code&gt;ticket_scan_7&lt;/code&gt; and &lt;code&gt;ticket_scan_77&lt;/code&gt; all came out clean.&lt;/p&gt;

&lt;p&gt;Gemma writes the name. Code gets the last word on keeping the old one.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Baseline (30 files)&lt;/strong&gt;: Every file landed in the right category (30/30). Three runs gave the same folder and filename for all 30, and undo restored all 30 byte-for-byte. I should be honest about this. I wrote the answer key after earlier runs, and I measured it before the Personal folder and Needs-Review changes without repeating it on the final version. Repeatability also isn't correctness. So treat it as a sanity check, not a benchmark.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First stress test: What worked, and what didn't?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built a set to break it: generic and misleading names, a double extension, empty and corrupt files, blank images, a scanned PDF, an &lt;strong&gt;.xlsx&lt;/strong&gt;, an &lt;strong&gt;.mp3&lt;/strong&gt;, sensitive filenames and a nested folder. All contents are made up.&lt;/p&gt;

&lt;p&gt;The first stress test contained 28 files and one folder containing another file. File-Tidier processed 26 of the 28 files. The remaining two, &lt;strong&gt;.env&lt;/strong&gt; and &lt;strong&gt;passwords.txt&lt;/strong&gt;, were intentionally left untouched by the security rules in the code. The nested folder was also left untouched because the current implementation only processes top-level files.&lt;/p&gt;

&lt;p&gt;It exposed both things File-Tidier handled well and cases where it still needed improvement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some of the most important behaviours worked as intended:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Empty and unreadable files:&lt;/strong&gt; &lt;strong&gt;broken_document.pdf&lt;/strong&gt; and the blank &lt;strong&gt;document.pdf&lt;/strong&gt; were sent to &lt;strong&gt;Needs-Review&lt;/strong&gt;. The empty &lt;strong&gt;final_v2.txt&lt;/strong&gt; and blank &lt;strong&gt;untitled.docx&lt;/strong&gt; were also sent there, keeping their original names rather than inventing descriptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content over filenames:&lt;/strong&gt; &lt;strong&gt;flight_ticket.pdf&lt;/strong&gt; actually contained a restaurant bill. File-Tidier identified the content, renamed it &lt;strong&gt;restaurant_bill_example.pdf&lt;/strong&gt;, and placed it under &lt;strong&gt;Receipts&lt;/strong&gt;. Similarly, &lt;strong&gt;meeting_minutes.docx&lt;/strong&gt; contained a cooking recipe and was renamed &lt;strong&gt;cooking_recipe_data.docx&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Useful categorisation:&lt;/strong&gt; The &lt;strong&gt;course completion certificate&lt;/strong&gt; went to &lt;strong&gt;Study&lt;/strong&gt;, the &lt;strong&gt;EV charging invoice&lt;/strong&gt; went to &lt;strong&gt;Receipts&lt;/strong&gt;, and the &lt;strong&gt;weekend packing checklist&lt;/strong&gt; went to &lt;strong&gt;Travel&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unreadable or unsupported content:&lt;/strong&gt; &lt;strong&gt;scanned_document.pdf&lt;/strong&gt; was sent to &lt;strong&gt;Needs-Review&lt;/strong&gt; rather than being confidently classified without usable content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The run also revealed some limitations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blank images were still classified as photos.&lt;/strong&gt; Both &lt;strong&gt;IMG_001.jpg&lt;/strong&gt; and &lt;strong&gt;untitled_image.png&lt;/strong&gt; went to &lt;strong&gt;Photos&lt;/strong&gt;, even though they were blank. The model needed a better way to distinguish an actual photograph from an empty image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unsupported files received confident classifications.&lt;/strong&gt; &lt;strong&gt;podcast_recording.mp3&lt;/strong&gt; went to &lt;strong&gt;Study&lt;/strong&gt; and &lt;strong&gt;monthly_budget.xlsx&lt;/strong&gt; went to &lt;strong&gt;Receipts&lt;/strong&gt;, even though neither format was supported. Both should have gone to &lt;strong&gt;Needs-Review&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some categories were too broad.&lt;/strong&gt; At this stage, &lt;strong&gt;Personal&lt;/strong&gt; hadn't been introduced, so &lt;strong&gt;personal reminders&lt;/strong&gt; and &lt;strong&gt;private notes&lt;/strong&gt; ended up in &lt;strong&gt;Study&lt;/strong&gt;. Other mismatches included a &lt;strong&gt;grocery list&lt;/strong&gt;, &lt;strong&gt;plant-care instructions&lt;/strong&gt; and an &lt;strong&gt;employment checklist&lt;/strong&gt; being placed under &lt;strong&gt;Study&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last group of errors helped me identify a limitation in the original category structure. Not every document belongs to a traditional folder like Study, Work or Receipts, and a file can have a perfectly reasonable name while still being placed in the wrong category.&lt;/p&gt;

&lt;p&gt;These findings shaped the subsequent changes, including more cautious handling of files without usable content and the introduction of a Personal category. The goal wasn't just to make the demo look cleaner; it was to make File-Tidier more careful about the decisions it couldn't reliably make.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second stress test:&lt;/strong&gt; Better handling, but not every decision was right&lt;/p&gt;

&lt;p&gt;The second stress test contained 29 files and one folder containing another file. This set included a newly added .tar.gz file, alongside the same .env and passwords.txt files from the first test. File-Tidier processed 27 files; the two security-sensitive files were intentionally left untouched. As in the first test, the nested folder wasn't processed because the current implementation only scans top-level files.&lt;/p&gt;

&lt;p&gt;The run took &lt;strong&gt;108 seconds for 27 processed files&lt;/strong&gt;, averaging about &lt;strong&gt;4 seconds per file&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Several things improved:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blank images:&lt;/strong&gt; &lt;strong&gt;IMG_001.jpg&lt;/strong&gt; and &lt;strong&gt;untitled_image.png&lt;/strong&gt; were now sent to &lt;strong&gt;Needs-Review&lt;/strong&gt; instead of being classified as &lt;strong&gt;Photos&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unsupported files:&lt;/strong&gt; &lt;strong&gt;podcast_recording.mp3&lt;/strong&gt; was sent to &lt;strong&gt;Needs-Review&lt;/strong&gt; rather than being assigned to &lt;strong&gt;Study&lt;/strong&gt;. The unsupported &lt;strong&gt;.tar.gz&lt;/strong&gt; file was also routed to &lt;strong&gt;Needs-Review&lt;/strong&gt; and placed under &lt;strong&gt;Archive&lt;/strong&gt; because it met the six-month age threshold.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personal files:&lt;/strong&gt; Introducing the &lt;strong&gt;Personal&lt;/strong&gt; category helped place &lt;strong&gt;grocery_list.txt&lt;/strong&gt;, &lt;strong&gt;cooking_recipe.docx&lt;/strong&gt;, &lt;strong&gt;pasta_recipe.pdf&lt;/strong&gt;, &lt;strong&gt;personal_reminders.txt&lt;/strong&gt;, and &lt;strong&gt;private_notes.docx&lt;/strong&gt; in more appropriate locations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Empty or unreadable documents:&lt;/strong&gt; &lt;strong&gt;document.pdf&lt;/strong&gt;, &lt;strong&gt;final_v2.txt&lt;/strong&gt;, &lt;strong&gt;notes.txt&lt;/strong&gt;, &lt;strong&gt;broken_document.pdf&lt;/strong&gt;, and &lt;strong&gt;untitled.docx&lt;/strong&gt; were sent to &lt;strong&gt;Needs-Review&lt;/strong&gt;. The scanned document was also routed there because its content couldn't be reliably extracted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Misleading filenames:&lt;/strong&gt; &lt;strong&gt;flight_ticket.pdf&lt;/strong&gt; was again recognised as a &lt;strong&gt;restaurant bill&lt;/strong&gt;, while &lt;strong&gt;receipt.pdf&lt;/strong&gt; was renamed to reflect its &lt;strong&gt;rental-agreement&lt;/strong&gt; content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;But the second run still exposed some problems:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;monthly_budget.xlsx&lt;/strong&gt; went to &lt;strong&gt;Needs-Review&lt;/strong&gt; because the tool can't read spreadsheets yet. That's the honest outcome for this version, though a person would file it under &lt;strong&gt;Personal&lt;/strong&gt;. Reading .xlsx is on my list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three files drifted back to Study.&lt;/strong&gt; &lt;strong&gt;plant_care.txt&lt;/strong&gt;, &lt;strong&gt;short_story.docx&lt;/strong&gt; and &lt;strong&gt;healthy_lifestyle_guide.pdf&lt;/strong&gt; had been in &lt;strong&gt;Personal&lt;/strong&gt; in an earlier run (I ran the set once between the two tests, with only the Personal folder added). I reworded the category descriptions in the same change as the review handling, and I didn't test the two separately. The boundary between Study, Personal and Work is fragile for a 4B model, and more prompt text doesn't reliably fix it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;recipe.txt&lt;/strong&gt; contained an &lt;strong&gt;employment checklist&lt;/strong&gt; but was placed under &lt;strong&gt;Personal&lt;/strong&gt;. I'd expect &lt;strong&gt;Work&lt;/strong&gt;, though Personal is defensible.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your files stay on your machine.&lt;/strong&gt; Downloads is full of invoices, rental agreements and IDs. With a local model, none of it goes to a third-party API. For a tool that reads your files, this is the strongest reason to go open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No per-file cost.&lt;/strong&gt; There are no usage charges for classification. Your laptop spends some electricity, and that's all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works offline.&lt;/strong&gt; After setup and the model download, it runs without internet. I tested it with Wi-Fi off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No server to maintain.&lt;/strong&gt; Both the organiser and the watcher run on your own computer, so nothing can be shut down or repriced.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control.&lt;/strong&gt; I could change the prompt and put a code check around the model's answers, and the &lt;code&gt;some.pdf&lt;/code&gt; problem needed exactly that. In principle I could also swap the model, though I didn't get to compare larger Gemma sizes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where a closed model would be better:&lt;/strong&gt; reading. A larger hosted model would handle scanned PDFs and spreadsheets, and misread fewer image details. It would also be faster on a modest laptop. It would still need the same safeguards, because a confident wrong rename is just as damaging. The preview, the never-overwrite rule and undo exist for that reason, whichever model sits behind them. I think trading some accuracy for private files and no per-file cost is right for this job, but you should weigh it yourself.&lt;/p&gt;

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

&lt;p&gt;The theme was laziness, so I made the lazy path the main path. Run it once, look at a table and press confirm. Or start the watcher, and it tidies new files once they stop growing, with every batch undoable. It only touches files that arrive after it starts, because lazy mode has no confirm step, so it must never be able to damage something it wasn't asked about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did It Actually Save Time?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I also compared one File-Tidier run with a manual sorting attempt on the same 30 files.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Recorded time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;File-Tidier, first pass&lt;/td&gt;
&lt;td&gt;~5 min 44 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual sorting&lt;/td&gt;
&lt;td&gt;10 min 49 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In this trial, File-Tidier finished its first pass about five minutes sooner.&lt;/p&gt;

&lt;p&gt;That is promising, but it's only one attempt for each method, not a controlled productivity study. Results will vary with file types, computer performance, and how someone sorts manually.&lt;/p&gt;

&lt;p&gt;The longer-term benefit I want to explore is reducing the repeated effort of keeping a folder organised as new files continue to arrive.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma 3 4B runs locally through Ollama and does the naming and sorting in the app, and reads the images. I measured where it fails, which was judging names and anything it couldn't read, and built code around those failures.&lt;/p&gt;

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