Type everything rattling around your head. Get back a short list you can print and cross off.
Live at overwlmd.com.
A Cloudflare Worker that takes an unstructured brain dump and returns structured, printable tasks — grouped by effort, with the worry behind each one, and with feelings kept separate from chores.
Feelings are not tasks. The single most important design rule. "I feel like
I'm drowning" goes in not_tasks and is never rewritten into an action item.
Converting someone's anxiety into a to-do list makes overwhelm worse, not better.
One ordered list, not effort buckets. The model sequences the tasks: real dependencies first (if you can't book movers until you've decided about the house, the decision comes first), then quick wins, then the big items. Leading with two-minute tasks is where most of the felt relief comes from, so ordering preserves that without needing separate buckets. Effort is shown as a tag.
You can rearrange it. The model's order is a starting point, not a verdict — drag a row, or use the ▲▼ buttons (which keep keyboard focus and work on touch).
Your dump stays on your device. The brain dump, the task list, and your
manual ordering are saved to localStorage — nothing is stored server-side.
Refreshing keeps your work; Clear dump and Clear tasks are separate
buttons so wiping one never destroys the other.
Printing gives you tasks only. The "not tasks" section is deliberately excluded from print — a printout of your anxieties is not a useful object. A checkbox opts it back in.
Free to run, with a hard ceiling. Inference is Cloudflare Workers AI, whose free tier is 10,000 Neurons/day and — on the Workers Free plan — cannot incur overage. Exceeding it fails the request rather than billing anyone. That property is why it's Workers AI and not a paid API: the app can be offered for free without the operator carrying open-ended cost risk for whatever people type.
Model: @cf/meta/llama-3.3-70b-instruct-fp8-fast at 26,668 neurons per M input
tokens and 204,805 per M output tokens. Output is ~7.7× the cost of input, so
MAX_OUTPUT_TOKENS is the highest-leverage cost lever in the codebase — more
than the model choice.
With the caps in src/index.js (4,000 input chars, 1,200 output tokens):
| Neurons | Requests/day on the free tier | |
|---|---|---|
| Worst case | ~290 | ~35 |
| Typical dump | ~105 | ~90 |
That is the real constraint: this is a low-volume free service, roughly 35–90 conversions per day. Fine for personal use or a small audience; not a launch that survives a front-page day.
Both were measured on the same input:
| Model | Latency | Quality |
|---|---|---|
llama-3.3-70b-instruct-fp8-fast |
~18s | Correctly deduped a repeated worry; no fabrication |
llama-3.1-8b-instruct |
~2.2s | Faster and cheaper, but invented a feeling absent from the input, and flattened every effort estimate to 30min |
The 70B won on the thing that matters. An app that puts words in someone's mouth about their own anxieties is worse than no app. The 18s wait is covered by staged progress messages in the UI rather than a silent spinner.
MODEL is a single constant, and unwrap() handles both response shapes Workers
AI returns, so swapping is a one-line change.
| File | Purpose |
|---|---|
src/index.js |
Routing, caps, the Workers AI call |
src/prompt.js |
The extraction system prompt — most of the product's judgment lives here |
src/schema.js |
Requested JSON Schema and server-side validation |
src/page.js |
Single-page frontend with a print stylesheet |
Workers AI does not guarantee schema adherence, so validate() in schema.js
is load-bearing, not defensive decoration. It drops individual malformed tasks
rather than failing the whole response — a partial list still helps. It also
renumbers order densely from 1, because models emit gaps and duplicate values.
page.js exports the whole page as a single template literal. A stray
backtick anywhere inside it — including in a code comment — silently terminates
the string and breaks the build. npm run check guards against this.
The page is served cache-control: no-cache on purpose. The entire app ships
inside that one document, so any caching serves stale application code after a
deploy.
npm i -g wrangler # or npx wrangler
wrangler dev # local, hits real Workers AI
wrangler deployNo secrets or API keys — the AI binding in wrangler.jsonc is the only
configuration.
- No abuse controls. No captcha, no per-IP quota. The free tier's hard cap means abuse costs nothing financially, but one scripted loop can exhaust the daily allocation for everyone. Turnstile plus a KV-backed per-IP counter is the fix if this ever gets shared widely.
- ~18s latency, inherent to the 70B model.
- No persistence. Refreshing loses the list. Print it.