DEV Community

Cover image for I built a sloth that sorts my to-do list. It sent my toothache to Delay.
Ch Yasaswini
Ch Yasaswini

Posted on

I built a sloth that sorts my to-do list. It sent my toothache to Delay.

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

What I Built

Every to-do list pretends all of its tasks are urgent. Zzzdo is a pixel sloth that disagrees.

You paste your list, one task per line, and optionally add deadlines. The sloth sorts every task into three lanes and gives each one a short, sleepy reason:

  • Do Today: a real deadline, a real person waiting, or a real consequence. Capped at three.
  • Delay: it matters, but nothing bad happens if it waits.
  • Drop: guilt tasks, "someday" tasks, and perfectionism nobody asked for.

It saves the effort of deciding what deserves a place in today. The sloth does the first pass. You still get the final say: every card has a dropdown to move it to another lane, agree and nah buttons, and the whole result exports to a text file.

Zzzdo sorting an 8-task list into Do Today, Delay and Drop

The sloth is confidently wrong, which is the best part

On my first 8-task list, the sloth got rent and a file someone was waiting on right. Rent came with the reason "The landlord's patience is as thin as a dandelion's wish." Then it put "Reorganize my desktop folders" in Do Today and sent "Book a dentist appointment for the tooth that hurts" to Delay, with the reason: "Ignoring a throbbing molar is a remarkably poor strategy."

It wrote the argument against its own decision and filed the task under later anyway. The agreement counter at the bottom of the screen says 2 of 3.

On a second, deliberately dramatic list, it dropped "Plan my entire year" and gave "Learn Rust properly this time" a verdict of "Rust is a language that evolves faster than moss." It also filed "Text mom back" under Delay, because "She's probably already forgotten what she was saying." Sorry, Amma.

Zzzdo sorting a second list of deliberately dramatic tasks

Demo

Zzzdo runs locally, so the demo is the screenshots above. To try it yourself you need Node.js and Ollama:

ollama pull gemma3:4b
npm install
npm run dev
Enter fullscreen mode Exit fullscreen mode

Then open the local URL Vite prints.

Code

GitHub logo Yasaswini-ch / Zzzdo

A local AI that tells you what to drop

Zzzdo

A local AI that tells you what to drop.
Paste a list. Let a pixel sloth sort it into Do Today, Delay, and Drop

React, TypeScript, Vite, Ollama, local model, no cloud API

Zzzdo sorting a sample task list into three lanes

Features

  • Sorts each task into Do Today, Delay, or Drop.
  • Uses optional deadlines as context without changing task text.
  • Lets you move tasks between lanes. Do Today stays capped at three.
  • Saves one agree or nah vote per task and shows the agreement count.
  • Exports the sorted list and reasons as zzzdo-results.txt.
  • Remembers your task list, deadlines, and votes in this browser.

The three lanes






















Lane How the sloth uses it
Do Today A real deadline, person waiting, or consequence. Maximum three tasks.
Delay It matters, but waiting causes no immediate trouble.
Drop Nobody will notice if it never happens.

Run it locally

You need Node.js and Ollama installed.

In one terminal, start Ollama:

ollama serve
Enter fullscreen mode Exit fullscreen mode

In another terminal, install the…




How I Built It

React, TypeScript and Vite, with Gemma (gemma3:4b by default) running through a local Ollama instance. There is no backend, no cloud AI API, no account and no API key. The browser talks to Ollama through a Vite dev proxy.

The model returns structured JSON, and code checks it before anything is shown:

  • Tasks the model invented are removed.
  • Tasks it forgot go back into Delay, so nothing silently disappears.
  • Do Today is capped at three in code, not just in the prompt.

I did this because a small model will happily put everything in Do Today, or lose a task, if you only ask nicely. The sloth's personality is the model's job. Keeping your list intact is the code's job.

The sloth sprite is a text grid rendered as SVG pixels, so there are no image assets. I built the project with Codex from an AGENTS.md brief that kept the scope small.

It is not perfect. A 4B model misjudges tasks, as the toothache and the text to mom show. That is why every verdict can be overridden and why the agree and nah buttons exist.

Why Does Open Innovation Matter?

A to-do list is personal. It has doctor appointments, awkward replies and things you have been avoiding for months. With an open-weight model running locally, none of that is sent to a server I don't control. It works offline, costs nothing per sort, and I can swap the model by changing one setting to any model Ollama can run.

A closed API would have made the sloth smarter on day one. It would also have made my guilt list someone else's data.

Prize Categories

  • Best Use of Gemma

Top comments (0)