Skip to content

1.5.0-beta.1

Pre-release
Pre-release

Choose a tag to compare

@ccpk1 ccpk1 released this 18 Jun 02:38
· 4 commits to main since this release
c06fc56

ChoreOps v1.5.0-beta.1

This release represents months of focused effort — not just writing code, but listening. A lot of listening. Feedback from users has shaped every priority in this update, and the recurring themes were clear: the foundational systems are good, but there were many opportunities to reduce friction. Chore scheduling, notifications, recurrence handling, standby coverage, and vacation management — these are the bones of ChoreOps, and they needed to be rock solid before anything else should be built on top.

There have been plenty of exciting ideas and suggestions around gamification too, and those have not been ignored. But the decision was deliberate: pour the effort into hardening the core experience first. When the foundation is stable and the daily rhythms are seamless, layering on more gamification becomes additive rather than corrective. No rework, no backtracking — just building on something that already works well. That maturity is settling in now, and this release reflects it.

Of course, ChoreOps already ships with a robust gamification engine — streaks, achievements, points, rewards — and those got their own attention here too. But the headline is the core. Let's get into it.

To participate in the discussion about this beta: #188


⚠️ Upgrading from earlier version — Important Changes

Version 1.5.0-beta.1 includes what was previously available as the 1.0.8 beta series. If upgrading from any earlier release, the following changes apply.

Breaking: Dashboard Helper Architecture

ChoreOps intentionally exposes rich, meaningful state directly into Home Assistant instead of hiding everything behind a private backend database or proprietary cards. That flexibility means the dashboard and helper layer must operate within real Home Assistant limits for helper payload size, template evaluation, and frontend rendering. At high chore counts per user, the previous single-helper pattern could hit those limits.

  • High-Density Sharding: Large per-user chore lists are now split across multiple dashboard helper surfaces instead of being forced through one oversized helper. All maintained dashboards have been updated to use the new pattern.
  • chores_by_label Removed: The chores_by_label key is no longer created on the dashboard helper. Labels are still fully supported, but grouped label views must now be rebuilt from chore rows and their labels data.
  • Action Required:
    • All users should re-generate their dashboards after updating. The maintained dashboard templates in the repository have been updated to match.
    • Custom dashboards, template sensors, automations, and cookbook-style snippets that read dashboard helper chore data should be reviewed and updated. The old direct-helper pattern is no longer the safe long-term contract for chore-list access.
    • Around ~40 chores assigned to one user is the point where the new chore-list pattern becomes necessary. Below that range the older inline pattern may still appear to work, but above it chore rows can be split across multiple helpers, so older patterns may silently return incomplete chore lists.
  • Reference: The updated wiki shows the recommended pattern at the Template Cookbook for Chores, Rewards, and Approvals.

Breaking: Removed Sensor Attributes

The time_until_due and time_until_overdue attributes have been removed from chore status sensors. These were recalculated on every update and caused significant Recorder database churn. Dashboards now compute countdowns locally from the underlying due_window_start and due_date fields — same display, no database bloat. Any custom dashboards, template sensors, or automations that read these attributes directly must be updated to use local calculation or the remaining date fields.


👥 Primary-Standby Chores — Accountability With a Backup Plan

Some chores belong to one person, but life does not always cooperate. Primary-Standby chores keep the primary owner accountable while ensuring a backup is always ready to step in — feed the cat, take out the trash, walk the dog — even when the primary is away.

image
  • Permanent Primary + Standby Pool: Assign one primary owner and a list of standby users who can cover when needed.
  • Three Claim Modes for Standbys:
    • Anytime — jump in whenever
    • On Overdue — only claim after the due date passes
    • Manual Only — admin must explicitly activate a standby
  • Always Resets to Primary: Once the chore is completed and approved, responsibility snaps right back to the primary owner. No confusing handoffs, no lost accountability.
  • Standby-Needed Notifications: When a primary-standby chore goes overdue and no standby has claimed it, the system fires a dedicated alert so nothing gets forgotten.
  • Pause-Aware: Pausing the primary automatically activates standbys. Unpausing snaps responsibility back. Seamless.
  • Intelligent Standby Rotation: When the primary is paused and multiple standbys are available, the system rotates through them using simple rotation logic — distributing the workload across all non-paused standbys. The first listed standby assignee always takes the first turn, ensuring a predictable and fair handoff order.
  • Thoughtful Standby Visibility: Standby chores appear in their own separate grouping at the bottom of the standby user's chore list, out of the way of their own responsibilities. That section can be hidden entirely. When a standby chore becomes overdue or is manually assigned to them, it moves up into their overdue list — clearly marked as someone else's chore and available for them to assist.

⏸️ User Chore Pausing — Vacation Mode, Done Right

When a family member needs a break — vacation, camp, illness, or a hectic week — all chores for that user can now be paused. ChoreOps handles the ripple effects intelligently.

image
  • Pause Indefinitely or Set an Auto-Resume Date: Freeze chores with one tap, or schedule the pause to lift automatically when life returns to normal.
  • Intelligent Turn Management: Pausing is not simply "stop everything." For shared-turn chores, the turn automatically advances past the paused person. For primary-standby chores, the standby crew is activated so nothing falls through the cracks. When the pause ends, everything snaps back to normal.
  • Crystal-Clear Visibility: Paused users see a prominent "Chores Paused" on their dashboard. Their chores are blocked from generating overdue warnings, missed notifications, and statistics — truly frozen, not just hidden.

🔄 Smart Resume — No Punishment for Time Away

The real value appears when chores come back online. Without intervention, a week of paused chores would all be past-due the moment they resume, triggering a flood of notifications and overdue flags.

image
  • Resume & Reschedule in One Tap: Three dedicated resume actions pick exactly what to shift forward:
    • Shift Independent Chores — per-person tasks with their own due dates
    • Shift Independent & Primary-Standby — the two per-assignee chore types
    • Shift All (including shared) — everything, full coverage
  • Respects Schedule Logic: Rescheduled chores do not blindly jump to today. They follow their full recurrence rules, applicable days, and time windows — a weekly Monday chore pushed past Friday lands on the next Monday, not Saturday.
  • Safe by Default: The bulk reschedule intentionally skips long-recurrence chores (monthly, quarterly, yearly) so a one-week absence does not accidentally bump an annual task forward an entire year. Power users can opt in with an advanced toggle.

📅 Reschedule from Completion — Date Only Mode

A new scheduling mode solves a subtle but persistent annoyance: time drift when chores are completed late.

  • Date-Only Rescheduling: For chores using the new "Reschedule from completion — date only" frequency, the next due date is calculated from the completion date while preserving the original due time. Complete a chore two days late, and the next occurrence lands exactly one interval from when it was actually done — at the same time of day it was always due.
  • Prevents Time Drift: The old "reschedule from completion" mode used the exact completion timestamp, meaning a chore due at 8 AM but completed at 7 PM would permanently shift to 7 PM going forward. A few late completions could push a morning chore into the evening. The new mode eliminates that drift entirely.

⏱️ Overdue Duration Tracking — Measure What Matters

Knowing a chore is overdue is useful. Knowing how late it typically runs tells a richer story. Overdue duration tracking adds per-chore and per-assignee metrics without any Recorder overhead.

  • Per-Chore Sensor Attributes: Each chore status sensor now exposes two new attributes — Avg Overdue Duration and Longest Overdue Duration — showing the average and peak lateness across all completions for that chore.
  • Assignee-Level Rollups: Overdue duration stats are aggregated at the user level across all standard time periods — today, this week, this month, this year, and all-time.
  • Dashboard & Notification Ready: Rollup fields are published through the existing statistics pipeline, making them available for dashboard cards, conditional styling, and notification triggers.
  • Entirely Event-Driven: All tracking is handled in memory during chore approval events. Nothing is written to the Recorder database, so there is zero impact on database size or commit frequency.

📋 Unified OpsCenter Admin View — Everything in One Place

Managing chores previously meant hopping between cards and sections. The new OpsCenter unifies it all into a single, collapsible command center. Selecting a chore reveals its full management surface in a logical top-to-bottom flow.

👥 One-Click Assign & Remove

The chore detail panel opens with contextual Assign and Remove buttons that detect whether the selected user is already assigned. Unassigned chores show a prefix with co-assignee context, making it possible to scan the list and add someone in one tap — no dropdowns or form fills required.

image

📋 Assignee Roster

Below the assign/remove actions, the full list of currently assigned users is displayed, giving a clear at-a-glance view of who is responsible for the chore.

image

🔀 Primary-Standby Controls

For primary-standby chores, the assignee list is followed by dedicated management controls:

  • Set New Primary: Reassign the primary owner without rebuilding the chore.
  • Activate a Standby: Manually hand off responsibility to a specific standby user.
  • Activate All Standbys: Open the chore to the entire standby pool at once, with a clear visual indicator when all standbys are active.
  • Primary and standby assignee names are displayed inline for full context.

🔄 Rotation Controls

For shared-turn chores, rotation management follows the assignee list:

  • Ordered Assignee Display: The full rotation order is shown with a 👈 current-turn indicator.
  • Set Turn: Manually assign the active turn to any user in the rotation.
  • Move to Front: Reorder the rotation by pulling a specific user to the front of the line.

📅 Bulk Reschedule Chores — Mass Date Shifting

The Reschedule Chores After tool handles pushing everything past a date boundary.

image
  • Pick a Boundary Date: Choose any date, and all chores due before that date jump forward.
  • Three Smart Buttons: Shift independent chores, independent + primary-standby, or literally everything — each with clear labels showing exactly what moves.
  • Long-Recurrence Safety Gate: Only non-recurring chores and those with frequencies of two weeks or less are shifted by default. Monthly, quarterly, and yearly chores stay put unless explicitly allowed. No more accidentally pushing an annual reminder forward a full year.

🧹 Seasonal Chores — Remove All Assignees

Chores previously required at least one assigned user at all times. That restriction is now lifted — every assignee can be removed while keeping the full configuration intact.

  • Seasonal Hibernation: A chore like "Mow the Lawn" can have all assignees removed over the winter. The chore becomes invisible on dashboards, but the name, schedule, recurrence rules, points, and all other settings remain saved and ready.
  • Historical Data Preserved: Removing all assignees does not wipe the slate. Past completion data, streaks, and statistics stay attached to the chore, so reassigning it months later picks up right where things left off. General data retention settings still apply for pruning over longer periods.

🎁 Per-User Rewards — Targeted & Dynamic

Reward management gets a complete overhaul with per-user assignment, seasonal shelving, and instant entity updates — all without reloads.

  • Gated Visibility: Users only see rewards they are actually eligible for. No more scrolling past rewards meant for someone else.
  • Empty Assignment Support: Just like chores, all users can be removed from a reward to temporarily shelve it without deleting the configuration. The reward simply does not appear for anyone until re-assigned.
  • Bulk Assignment: Use the * wildcard to assign a reward to all gamified users at once via the services.

⚡ Dynamic Entity Creation — No More Integration Reloads

Adding, removing, or modifying chores and rewards previously required a full integration reload, which would briefly disrupt dashboards and cause a visible refresh. That friction is gone.

  • Entities Appear Instantly: Creating a chore or reward — whether through the config flow, a service call, or a dashboard button — now creates its sensors and buttons at runtime. No reload, no dashboard flicker, no interruption.
  • Entities Clean Up Automatically: Removing a chore or reward similarly cleans up its entities in the background without touching anything else.
  • Foundation for Frontend Agility: This change sets the stage for a future where common management tasks happen entirely through the dashboard, with no need to visit the backend integration configuration at all. Buttons, scripts, and automations can drive changes that take effect immediately.

🎯 Dashboard Include Filters — Precision Views & Performance

Dashboard filtering previously relied on exclusions — all chores were pulled in, and unwanted items were filtered out after the fact. That approach added noise and, for homes with 100+ chores, could cause noticeable UI slowdowns. The new include filters flip the model.

  • Include Takes Priority Over Exclude: When an include filter is set for labels, groups, or states, only matching chores enter the view. Exclusions still apply on top as a secondary filter.
  • Clean Separation of Concerns: An admin can exclude all "bonus_family_chores" from the normal daily chore list, then create a separate dashboard view that only includes those bonus chores — keeping them accessible without adding noise to everyday priorities.
  • Built-In Performance Enhancement: Because include filters are exclusive by nature, the frontend only processes matching entities from the start. For large households, this dramatically reduces the workload compared to the old exclude-only approach, which pulled in everything and filtered it down late in the pipeline.

🏆 Smarter Gamification & Achievements

The points and streaks system is now more honest, configurable, and respectful of per-user settings.

  • Streaks That Actually Fall: Completion streaks like "On a Roll" and "Unstoppable" now correctly reset after a missed day. No more permanent high scores that do not reflect reality. The system even recalculates streaks on startup, so a day missed while Home Assistant was down is properly accounted for.
  • Gamification-Aware Notifications: When a user has gamification disabled, their notifications no longer mention points — they automatically switch to non-gamified language. No more confusing "You earned 50 Points" for a non-gamified family member.
  • Dashboard-Wide Points Precision: Control decimal display from a single global setting.
  • Consistent Points Label: The configured label (e.g., "Stars," "Coins") now appears everywhere — dashboards, notifications, everywhere.

🔔 Notification & Experience Fixes

  • Shared Chores Go Quiet: Only the current turn-holder receives due/overdue notifications. Standbys and other assignees are now properly silenced at the signal level — no downstream leaks.
  • Clean Logs: Tapping a notification from another Home Assistant integration no longer produces confusing "Failed to parse notification action" errors in the logs.
  • Per-User Deep Links: Set a custom clickAction URL for each user's notifications, so tapping an alert takes them directly to their personal dashboard instead of the last-open screen. Separate URLs available for assignee and approver notifications.
  • Missed Notification Loop Fixed: Custom schedule chores that got "missed and locked" could reschedule themselves into the past and fire endlessly. That loop is now broken, and missed notifications include the chore name instead of falling back to "Unknown Chore."

⚡ Performance & Database Health

  • High-Density Dashboard Support: For households with dozens of chores per person, the dashboard helper now uses a hybrid sharding approach to keep payloads lean and render times snappy. Tested and stable up to 120 chores per assignee. Around ~40 chores per user is the threshold where the new sharded pattern becomes important. [Breaking change — see upgrade notes above]
  • Recorder-Friendly Attributes: The time_until_due and time_until_overdue attributes have been removed from chore sensors. Dashboards now compute countdowns locally from the underlying date fields — same display, no database bloat. [Breaking change — see upgrade notes above]
  • Smarter Config Flow Defaults: Users with admin or approver roles are now automatically marked as assignable during setup, eliminating a common "why can't I assign them?" friction point.

🌍 Community & Developer Experience

  • New Language: Romanian: ChoreOps now speaks Romanian, joining the growing family of supported languages. Currently at 16 and counting!
  • New Crowdin Translations: Fresh translations synced across all supported languages.
  • Developer Tooling Overhaul: New VS Code tasks, dev environment documentation, and a documented daily sync ritual make contributing straightforward. Test runner, linter, and Home Assistant environment refresh are all one click away.

Thank you to everyone who contributed code, translations, bug reports, and feedback. Update to 1.5.0 today and take full control of the household rhythm.

What's Changed

🐛 Fixes

  • fix(choreops): drop per-update countdown attributes by @ccpk1 in #155
  • fix(choreops): missed notification loop by @ccpk1 in #156
  • fix(choreops): use configured points label in notifications by @ccpk1 in #157
  • fix(auth): let linked approvers approve chores and rewards by @ccpk1 in #159
  • Fix label grouping and preserve user-defined exclude states by @ccpk1 in #160
  • Chore reschedule card, DAILY_MULTI iteration fix, long-recurrence gate by @ccpk1 in #163
  • fix(gamification): reset completion-streak achievements after a missed day by @wilcraig in #171
  • fix(notifications): ignore foreign mobile_app_notification_action events by @ccpk1 in #178
  • fix(notifications): suppress rotation non-turn-holder signals by @ccpk1 in #180

✨ Enhancements

  • feat(dashboard): add universal points precision setting by @ccpk1 in #141
  • feat(notifications): add per-user configurable notification clickAction URL by @ccpk1 in #161
  • feat(rewards): per-user assignment with runtime entity sync — no reload by @ccpk1 in #162
  • feat: Add user chore pause feature by @ccpk1 in #166
  • Implement primary-standby rotation criteria and dashboard updates by @ccpk1 in #172
  • chore(dev): Add VS Code tasks, dev environment docs, and sync ritual by @ccpk1 in #176
  • fix(notifications): strip points from messages to non-gamified users by @ccpk1 in #181
  • feat: add "Reschedule from completion - date only" scheduling mode by @ccpk1 in #184
  • feat: track overdue duration statistics by @tedzhouhk in #169

🌐 Localization

  • chore(l10n): sync translations from Crowdin - Adds Romanian by @github-actions[bot] in #130
  • chore(l10n): sync translations from Crowdin by @github-actions[bot] in #173
  • chore(l10n): sync translations from Crowdin by @github-actions[bot] in #185
  • chore(l10n): sync translations from Crowdin by @github-actions[bot] in #186
  • chore(l10n): sync translations from Crowdin by @github-actions[bot] in #187

New Contributors

Full Changelog: 1.0.8-beta.2...1.5.0-beta.1