Completionist

Try Completionist here!

I've enjoyed the idea of a timer-based to-do app for a while. I find myself using timers very often to manage my time effectively, and avoid spending too much time hyper-focusing on minor tasks that shouldn't take very long.

I also use to-do lists all the time -- but most services (Google Tasks, Todoist) don't really implement time management in the way I prefer.

That's why I built Completionist.


Each task has a title, description, and duration. The left panel displays items in the order they will be completed, and each task can be moved around to reorder them. Users can also sort by duration -- I find this very useful for clearing the smaller tasks that tend to pile up over time.


Implementing the timer was slightly more complex than I initially thought -- I had most of the implementation ready months ago, but ran into an issue with tabbing-out.

The previous implementation had the timer status sharing a home with the main program state, which contained all of the task and timeline data. The timer progression logic was all held in rendered components and used incremental timeout loops, which meant that page inactivity would pause the timer.

Coming back to this project, I built a more sophisticated implementation using timestamps, managed separately from the reducer using a hook.


State is saved in browser sessions using IndexDB, and can be exported/imported to transfer between devices or sessions.