DEV Community

Cover image for I Gave My Forgotten Files a Night Shift—Without Uploading Them
suraj srivastav
suraj srivastav

Posted on

I Gave My Forgotten Files a Night Shift—Without Uploading Them

Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady Submission 🦥

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.

The SlothShift home screen: choose a folder or try the sample vault

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
Enter fullscreen mode Exit fullscreen mode

Open http://127.0.0.1:5173.

  1. Click Try a sample vault. You should see four files and a count of 4.
  2. Start Ollama and ollama pull gemma4:e2b if the settings page says the model is not installed.
  3. Click Run Night Shift. Open one suggestion, edit if needed, then Approve or Reject.
  4. Export approved downloads a ZIP in the browser, or writes a Lazy Pack from the Electron app.

Desktop shell:

npm start
Enter fullscreen mode Exit fullscreen mode

Synthetic Sample Vault — four files ready, no personal folder required

Local model settings: Gemma via Ollama on this machine, no cloud inference

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.

CI Electron Local AI MIT License

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
Enter fullscreen mode Exit fullscreen mode
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, /ollama proxied to 127.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:e2b through 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)