This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady.
The files that drain me are not the hard ones. They are the invoice with a date near the bottom, the meeting note with two follow-ups, and the email I reopen because I cannot remember what I promised. Each one is a minute. The pile grows because every file asks for one more decision.
What I Built
SlothShift is a night shift for that pile.
Point it at a folder, or start with the built-in sample vault. A locally running Gemma model (gemma4:e2b through Ollama) reads supported documents and drafts a short summary, a filename, a category, possible dates, and next steps. You inspect the evidence, edit what you want, then approve or reject. Nothing is “handled” just because a model wrote text.
The export is meant for the next morning, not for a chat window: organized copies of approved originals, Markdown handoff notes, a JSON manifest with source hashes, optional drafts, and calendar reminders only when a date is an explicit YYYY-MM-DD.
The sample vault is synthetic on purpose — an invoice, a meeting follow-up, an expense register, and an email — so a first-time user (or a judge) can try the loop without handing over a real folder. Those files still go through the real local model. The app does not substitute canned AI answers.
Demo
There is no hosted deploy URL. That is on purpose. SlothShift is local-first: a public cloud demo would mean sending the folder to someone else's GPU. The public links judges need are the GitHub repo and the screenshots. Clone it, run npm run dev, click Try a sample vault.
Code: github.com/surajns0033-collab/slothshift
Local UI (this is what the screenshots show):
npm install
npm run dev
Open http://127.0.0.1:5173.
- Click Try a sample vault. You should see four files and a count of
4. - Start Ollama and
ollama pull gemma4:e2bif the settings page says the model is not installed. - Click Run Night Shift. Open one suggestion, edit if needed, then Approve or Reject.
- Export approved downloads a ZIP in the browser, or writes a Lazy Pack from the Electron app.
Desktop shell:
npm start
I am not embedding a model-run recording here. The screenshots are the real UI. A complete Gemma pass needs Ollama running on the machine that records it. If I add a 60–90 second clip later, it will show a live gemma4:e2b run, one review, and the opened export — not a mock.
Code
SlothShift 🌙
Your local AI night worker.
Let the boring work wait less.
SlothShift is a local-first desktop assistant for the files you keep meaning to organize. It scans a folder you choose, asks a locally installed Gemma model to prepare summaries and next-step suggestions, lets you review and approve the results, and exports a tidy collection of copies and useful follow-ups.
Unlike a cloud-first assistant, SlothShift sends document content to Ollama on your own machine. Your original files stay where they are; SlothShift works from a review queue and exports approved copies to a separate destination.
Built for: people who want less repetitive digital admin without handing their documents to a hosted AI service.
At a glance
Product
Local-first AI desktop utility
Modes
Electron desktop app + local browser preview
Desktop shell
Electron
Interface
HTML, CSS, and JavaScript
Model runtime
Ollama
Default model
gemma4:e2b
Inference endpoint
127.0.0.1:11434
Primary
MIT. Tests and syntax checks:
npm test
npm run check
| Piece | Role |
|---|---|
electron/main.cjs |
Folder dialogs, Ollama calls, copy-only export, hashes |
browser-adapter.js |
Same review loop in the browser, ZIP download |
renderer.js |
Queue, review dialog, minutes estimate |
electron/extractors.cjs |
Text, HTML, RTF, EML; Electron also covers PDF / DOCX / XLSX |
electron/safety.cjs |
Path checks, filename sanitizing |
How I Built It
The product is a queue, not a chatbot.
flowchart TD
A[Folder or sample vault] --> B[Local file scan]
B --> C[Extract text]
C --> D[Ollama on localhost]
D --> E[Gemma structured JSON]
E --> F[Human review]
F -->|Approve| G[Copy originals]
F -->|Reject or edit| F
G --> H[Hash check]
H --> I[Manifest, notes, optional ICS]
Two ways in, one model:
-
Browser: Vite on
127.0.0.1:5173,/ollamaproxied to127.0.0.1:11434. Common text, HTML, RTF, EML. Export is a ZIP in this tab. - Electron: Native folder pickers, persistent review state, plus text-based PDF / DOCX / XLSX.
Both send analysis to the local Ollama API, not a hosted LLM. The model returns structured JSON. SlothShift treats the document as untrusted input, checks that the evidence excerpt actually appears in the extracted text, validates export names and paths, copies instead of moving, and compares SHA-256 hashes before export.
Limits are intentional: 300 files per scan, 10 MB per file, 20,000 extracted characters to the model. Scanned-PDF OCR and image understanding are not included. Unsupported files are reported, not guessed.
If Ollama is down, the app says so. It does not invent a summary so the demo still “works.”
Why Does Open Innovation Matter?
These files can be rent, a client invoice, or a work email. Sending the pile to a hosted summarizer just to get a first pass is the wrong trade.
- The pile stays on the laptop. After setup and model download, inference is local.
- The next run is electricity, not a token bill. A folder of deferred admin is a bad place for per-page API pricing.
-
The model is replaceable. Default is
gemma4:e2b. Another installed Ollama tag can be selected. A closed API would lock the product to one vendor’s pricing and one vendor’s refusal to run offline. - Contributors can read the path. Scan, extract, prompt, review, copy. That is the whole loop.
Local is not infallible. Gemma can miss a date or write a plausible wrong summary. That is why approval is explicit and originals stay where they are.
My Agent Session
I built and wrote this with an AI assistant in Cursor. I am not embedding a DevRelay session id I do not have. The repo and the screenshots are the paper trail.
The Lazy Payoff
The dashboard’s “minutes back” number is an estimate from a slider (default: two minutes per analyzed file). It is not a user study.
I will not invent a percentage. The intended payoff is one review sitting instead of reopening the same four files tomorrow. A measured number needs a real Gemma run: files processed, files approved, minutes spent reviewing, and the manual baseline for the same folder. I do not have that recording yet, so I am not padding this section with fake savings.
What I can show now: the sample vault is four files, one click, originals untouched, and a path that refuses to upload them.
Prize Categories
-
Best Use of Gemma — the default analysis model is
gemma4:e2bthrough local Ollama. The UI is wired for that run; a live inference still needs Ollama on the machine.
I am not listing partner categories I did not use. The overall prize does not require them.



Top comments (0)