Skip to content
HK.
All projects

TodayOnlyToDo

Most to-do apps become a permanent backlog you scroll past for weeks.

2026KotlinJetpack ComposeMVVM

A small offline Android to-do app that deliberately can't hold yesterday's tasks. Everything clears at the start of a new day, so the list never becomes a backlog.

01

What I built

  • Built the app fully offline, with local persistence that survives restarts but clears on a new day.
  • Used MVVM to keep the date logic, storage, and UI state in separate, testable pieces.
02

Key decision

Hard-scope to today. Tasks persist locally (offline, survive restarts), but the view only ever shows the current date, and a date check on launch clears anything older. MVVM keeps the date logic, storage, and UI state separated so the 'what day is it' rule lives in one place.

03

What this project taught me

  • Removing features can be a product decision too: a deliberately restrictive rule ('today only') creates clearer behavior than giving the user unlimited flexibility.

The full reasoning

The problem, options, and constraints

Problem

A to-do list that keeps everything turns into a list you stop reading. Last week's unfinished items sit at the bottom, and nothing gets done because the list itself is discouraging.

Observation

I wanted a to-do app that didn't turn into another permanent backlog. The 'today only' rule forces me to decide what actually matters now instead of endlessly moving unfinished tasks forward.

The question

What if the list simply couldn't hold yesterday: a clean slate every morning, with 'today' as the only scope?

User need

Someone needs to capture what they'll do today, check it off, and start tomorrow fresh, with no sync, no account, and it working with no signal.

Constraints

  • Small solo project
  • Fully offline: no network at all
  • Local persistence that survives app restarts but clears on a new day

Options considered

OptionTrade-off
A normal persistent to-do list with a 'today' filterFamiliar, but the backlog still exists and still weighs on you; the filter is cosmetic
Hard-scope to today: previous days clear automaticallyOpinionated and loses history, but the constraint is the entire point
Architecture
Add task --> local store { text, done, date = today }
App launch --> if stored date < today: clear --> fresh list
View --> tasks where date == today, offline, no network

This page explains the why. GitHub has the proof of what was built.

View full repository