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

> Source: <https://dev.to/suraj_srivastav/i-gave-my-forgotten-files-a-night-shift-without-uploading-them-17d6>
> Published: 2026-10-25 14:40:33+00:00

*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady](https://dev.to/challenges/hacktoberfest-week3-2026-10-19).*

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.

**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](https://ollama.com/)) 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.

**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](https://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](http://127.0.0.1:5173).

`4`.` ollama pull gemma4:e2b` if the settings page says the model is not installed.
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.

**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.

| **Product** | Local-first AI desktop utility | 
| **Modes** | Electron desktop app + local browser preview | 
| **Desktop shell** | Electron | 
| **Interface** | HTML, CSS, and JavaScript | 
| **Model runtime** | [Ollama](https://ollama.com/) | 
| **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 | 

The product is a queue, not a chatbot.

``` php
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:

`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.
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.”

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.

`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.
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.

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 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.

I am not listing partner categories I did not use. The overall prize does not require them.
