Siesta: the anti-todo list that runs Gemma 3 1B in your browser and tells you to do less A developer built Siesta, an open-source anti-todo list that runs Gemma 3 1B (q4, ~0.5 GB) entirely in the browser via Transformers.js v4 on WebGPU with a WASM fallback, requiring no account, server, or API key and working offline once the model is cached. The app takes a free-form pile of tasks and returns at most a few scheduled items, a parking lot, and a drop list, with a deterministic budget engine handling caps, breaks, and deadlines while the model only decides what matters. The developer reports that asking the 1B model for a single-letter verdict (A keep / B park / C drop) produced correct answers on 11 of 11 tasks every run, after batch, per-task, and free-text rationale prompts failed. 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 I deleted eleven tasks and kept two. That was the whole feature. Siesta is an anti-todo list. You paste everything on your mind — eleven lines, no order, half of them already late — and it returns the smallest possible day: at most a couple of things to do, a parking lot, a list of things you are officially allowed to forget, and a permission slip. It runs Gemma 3 1B inside the browser tab . No account, no server, no API key, no bill. Once the tab has downloaded the model, it works with the Wi-Fi off. The task list is arguably the most personal document a person owns after their resume: it is a map of what they are worried about. Siesta is built on the idea that this map should not be uploaded anywhere just to be told what to do with it. Who gets to be lazier? Me, and anyone who has ever opened a to-do app and felt their chest tighten. The app does the deciding — which is the actual chore. Nobody procrastinates because writing "clean the cupboard" is hard. They procrastinate because deciding what deserves today is hard. Live: https://4-thkind.github.io/siesta/ https://4-thkind.github.io/siesta/ That screenshot is a real run, not a mock: eleven tasks in, two scheduled, eight parked, one let go, 3h 45m of tracked effort reclaimed . The permission slip is written by the model; the reasons under each task come from the facts in the line — "deadline is tomorrow", "two hours is too much for today", "didn't fit today's budget". The eleven-line pile is my own test pile, built to have a mix of real deadlines and vague wishes. Every decision and every number in that screenshot came out of the app running on a laptop GPU. https://github.com/4-thkind/siesta https://github.com/4-thkind/siesta — MIT, no dependencies, no build step: index.html the whole UI skeleton src/app.js flow, progress, rendering, markdown export src/parse.js deadlines, estimates, priorities pure, tested src/triage.js verdict protocol, budget engine, scheduler, guards pure, tested src/model.js Transformers.js pipeline, prompts, fallbacks src/store.js weekly ledger in localStorage test/run.mjs 28 assertions, run with: node test/run.mjs The model: onnx-community/gemma-3-1b-it-ONNX https://huggingface.co/onnx-community/gemma-3-1b-it-ONNX at q4 ~0.5 GB , run through Transformers.js v4 on WebGPU with a WASM fallback. First load caches it; after that the tab is offline. One constant swaps the model. The part I did not expect: teaching a 1B model to answer a question. I tried three formats before one worked, and all three failures are written up in AGENT NOTES.md https://github.com/4-thkind/siesta/blob/main/AGENT NOTES.md : | Attempt | What I asked for | What happened | |---|---|---| | 1 | numbered batch in, 3\ | DROP\ | | 2 | one task per call, {% raw %} VERDICT\ | reason | | 3 | ask the model for the why | platitudes: "Focus is key", "Time is a gift" | | 4 | one letter: A keep / B park / C drop | 11 of 11, every run | So the design rule became: the model decides what matters; the code decides what fits, what cannot be dropped, and what the reason is. Dates and arithmetic never touch the model. Reasons are derived from the facts the user actually typed, which is why they can say "didn't fit today's budget" instead of "Focus is key." Two more things had to be fixed by using the app, not by reading it: The budget engine is deterministic: a cap on things 1–4 and a cap on minutes, a five-minute break between items, deadlines inside 24 hours win over both caps with an honest note that the day is over budget and why , and nothing due within three days can be dropped. Each rule has a unit test; node test/run.mjs runs 28 of them in under a second. This was built in one session with an AI coding agent. I chose the product, the constraints local, free, offline and the design direction, and approved each change as it was tested live in the browser. The unedited log — four prompt strategies, the bugs that only appeared when the app ran, and the layout collision that only showed up in a screenshot — is in AGENT NOTES.md https://github.com/4-thkind/siesta/blob/main/AGENT NOTES.md . The real payoff is not the minutes saved; it is the decision avoided. But the numbers are nice too: eleven tasks in, a 1h 55m day out, 3h 45m of tracked effort formally parked or dropped, and one genuinely dead task removed from the list for good. My favourite part is the smallest: the "Let go" column contains exactly one entry — "Update resume — nobody is waiting on this one." That is not a productivity insight. It is permission, and it is the thing a normal to-do app would never give you. Best Use of Gemma — Gemma 3 1B runs fully on-device ONNX q4, WebGPU and is the only component making judgement calls. The model is swappable via a single constant, and the app keeps working with no network after the first load.