Better ToDo — a task manager with recurrence that actually works the way you need it to
Hi everyone!
I’d like to share Better ToDo, a custom integration + dashboard card I built because the built-in todo lists (and most todo apps in general) only know one kind of recurrence: a fixed schedule. Real life needs more than that.
A few examples of what “recurrence that actually works” means:
“Pay the bill — due on the 1st of every month.” You pay it on the 10th → the next occurrence is still the 1st of the next month (schedule-based). And if you miss three months, you don’t get three duplicate tasks — you get one task with a “3× due” counter, and you can complete one occurrence or all at once.
“Deep-clean the bathroom — once a month.” You do it 3 weeks late → the next occurrence is one month after you actually did it (after-completion recurrence). No nagging about a stale schedule.
“Cancel the contract before Dec 31.” The task stays invisible until Dec 1 (visible-from date), then shows a live countdown to the deadline.
“Ride the bike once a week.” A weekly habit task that reopens every Monday, tracks your streak (“15 wk streak ”) and how long you’ve been skipping. Deliberately skipping freezes the streak instead of breaking it — skipping is a decision, not a failure.
“Kids take turns carrying out the trash.”Rotating assignment over a freely chosen pool of persons — every completion hands the task to the next person.
What’s in the box
Four task types: one-time (with optional visible-from + deadline countdown), recurring on a fixed schedule, recurring after completion, and weekly/monthly habit tasks with streaks.
Cron-style schedules: every N days/weeks/months/years, multiple weekdays, fixed day of month, last day of month, “2nd Saturday” / “last Wednesday”, yearly — plus optional end date or max repetitions.
Notifications built in — no automations needed: up to 5 per-task reminders and a daily per-person summary of open tasks, pushed by the integration itself (Companion App or any notify service). The summary is smart about habit tasks: “ride the bike once a week” stays quiet until the weekend, and only if you haven’t done it yet. Optionally it also lands in HA’s notification center (the bell).
Assignment for households: assign tasks to one or more person entities, everyone gets their own filtered view via a single card (assigned: me), or use rotation for taking turns.
Standard todo + calendar entities per list — tasks show up in the Companion App, on watches, in voice assistants and the HA calendar. Better ToDo’s own storage stays the single source of truth.
Services and events for automations (better_todo.add_task from any automation, events for created/completed/due/overdue/reminder).
Feature toggles: switch off everything you don’t need — from “dumb list” to full feature set.
Custom card shipped with the integration (auto-registered, no extra install): filters, sorting, drag & drop, visual config editor, 7 languages, fully theme-aware — with an optional monochrome mode that follows your theme.
HACS → ⋮ → Custom repositories → add Timmes123/ha-better-todo (category Integration) — or use the My-link in the README.
Download Better ToDo, restart HA, add the integration.
The card registers itself automatically.
Status & roadmap
Current version is v0.5.1 (marked pre-release while I battle-test it on my own instance — it’s fully functional, install/update via HACS works normally). All data lives in HA storage and is part of normal backups.
On the roadmap: per-list/per-person sensors and statistics, sections & kanban view, actionable notifications (complete/skip straight from the push), and external sync (CalDAV etc.) deliberately last.
I’d love feedback — feature ideas, bug reports, or just whether the recurrence model matches how you’d use it. Issues and discussions are open on GitHub, or reply right here.
I’m not a big To-Do-List user, but I’ll try it out
It might be useful to be able to decide on an item-by-item level, if a notification should be sent (and to whom?) or if it ‘just’ sits in the calendar of the respective list - maybe by using a set of checkboxes for mobile, app, web interface, or all.
Good news: most of that is actually already in there — it’s just maybe not obvious yet:
Whether a notification is sent is decided per task: push notifications only fire for tasks that have a reminder set (e.g. “on the due date” or “1 day before”). No reminder on the task = no notification.
Who gets it follows the assignment: each person can be mapped to their own notify service in the integration options, and assigned tasks only notify the assigned person(s). Unassigned tasks can optionally go to everyone.
What’s not there yet is picking notification recipients per task independently of who it’s assigned to — that’s a fair point, I’ll put it on the list.
Curious to hear how the testing goes — feedback is very welcome!
This is great! It’s been so hard to find a good HA solution for recurring tasks. I added a few feature requests on Github! Sorry for the flood of tickets
Hi Ryan, thanks for giving it a try! I’ve read through your requests on GitHub — all good ideas, and I’m already working on them. I’ll post an update here once they’re in.
As promised: @RyanMakesMovies’s requests are all shipped, and a few other things landed as well. Quick update on what changed since I opened this thread (v0.5.1 back then):
Now stable (v0.6.1)
Lists can be reordered in the “Edit lists” dialog (drag & drop, or arrow buttons on touch devices).
A “logged-in user + unassigned” filter, so a personal card can also show the chores nobody has claimed yet.
“Due only” and a default tag filter can be set as the card’s starting state in the visual editor, plus a horizon (in days) for “show upcoming”.
Years as an interval for after-completion tasks (“1 year after the last time”).
After-completion tasks get today as the first due date by default.
In the current pre-release (v0.7.4) — mostly the requests from GitHub:
Active months for any recurring task, fixed schedule and after completion: “mow the lawn every Saturday, April–September” or “water the lawn 4 days after the last time, May–September”. Outside the season the task just stays quiet, and the repeat badge shows it (“weekly · Apr–Sep”). Weather-dependent chores don’t need a condition engine for this: set them to recur after completion and let a small automation call better_todo.skip_task when rain is forecast.
Every badge on a task can be switched off individually (due date, priority, subtasks, tags, person, reminder, recurrence, streak) — the editor is now grouped into Display / Filters / Badges / Behavior / Advanced.
Hide card when empty: the whole card disappears while nothing is left to do (it stays visible in dashboard edit mode so you can still find it).
Custom CSS field in the editor for anything the theme variables don’t cover, with a stable set of class names documented in the README. The card now renders in a fixed frame, so styles added by theme tools survive updates as well.
New service better_todo.update_task (by task id or title) — change only the fields you pass, e.g. switch a task’s cadence from an automation. The task id is shown with a copy button in the edit dialog.
Pre-releases install via HACS like any other version (tick “show pre-releases” in the download dialog); they become the next stable once they’ve run on my own instance for a while. Feedback on the new bits is very welcome — here or on GitHub.
But I still see the old Better Todo panel, even after restarting HA, reloading the integration, and even trying making a new BetterTodo card from scratch:
That’s most likely your browser cache — the integration is updated, but the old card is still loaded. Hit Ctrl+F5 once (Cmd+Shift+R on Mac). In the Companion App, pulling the page down to refresh does the trick for me.
If it’s still the old one after that, let me know.
Turns out “did you try Ctrl+F5?” is not a great long-term support strategy
v0.7.5 fixes this for good: the card now checks its own version against the integration’s on every update, and if your browser is still running the old one, it shows a small banner with a Reload button right inside the card. No more guessing whether you’re looking at the new version or a ghost from the cache.
One last hard refresh to get 0.7.5 itself — after that, the card will tell you.