This release includes breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
+8 more
Summary
AI summaryAuto-start rules editor UX improvements and race‑condition fixes for rapid deletes.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Medium |
ContentDetailAutoStartRules shows inline empty-state guidance when auto-start toggle is on but no conditions are set. ContentDetailAutoStartRules shows inline empty-state guidance when auto-start toggle is on but no conditions are set. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Feature | Medium |
Only start if not complete toggles instantly on Frequency change in auto-start rules. Only start if not complete toggles instantly on Frequency change in auto-start rules. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Feature | Medium |
Tracker editor shares auto-start empty-state UX for conditions list. Tracker editor shares auto-start empty-state UX for conditions list. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Feature | Medium |
Publish button disabled for FLOW content with no steps in useContentPublishState. Publish button disabled for FLOW content with no steps in useContentPublishState. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Performance | Medium |
No flicker when switching Frequency options in auto-start rules due to prop-sync optimization. No flicker when switching Frequency options in auto-start rules due to prop-sync optimization. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Performance | Medium |
ConditionFrequency and ConditionWait sync on content or version switch, avoiding stuck pickers. ConditionFrequency and ConditionWait sync on content or version switch, avoiding stuck pickers. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Tracker editor cancels debounced update when conditions become empty, preventing lost deletions. Tracker editor cancels debounced update when conditions become empty, preventing lost deletions. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Bugfix | Medium |
Version history now shows new draft after publish-then-edit without requiring reload. Version history now shows new draft after publish-then-edit without requiring reload. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Bugfix | Medium |
No-op saves removed from auto-start switch; flipping does not queue save when server state already matches. No-op saves removed from auto-start switch; flipping does not queue save when server state already matches. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Low |
Prevents no‑op saves when toggling auto‑start with no conditions. Prevents no‑op saves when toggling auto‑start with no conditions. Source: granite4.1:30b@2026-05-22-audit Confidence: low |
— |
Full changelog
This release polishes the content-detail editor: clearer empty-state guidance when an auto-start rule isn't yet usable, two end-to-end races around publish-then-edit and rapid-delete eliminated, and the tracker editor brought in line with the auto-start
rules card so they no longer behave differently from the user's side.
What's Changed
🎯 Auto-start rules editor
- "No conditions yet" empty state. When the auto-start toggle is on but no conditions are set, ContentDetailAutoStartRules now surfaces an inline "rule won't activate until you add at least one condition" card. The runtime is never sent an enabled=true
rule with an empty autoStartRules — coerceEnabledForPersist writes enabled=false on the wire even while the local toggle visually stays on, so the user can see what they're configuring without producing an un-actionable server state. - Sibling settings hide while incomplete. Wait / Frequency / "Only start if not complete" / Priority now render only when the rule is on AND has at least one condition. Off-state hides them along with the conditions list; empty-state hides them because
their writes would never reach the wire anyway (and fully-controlled Priority would visibly snap back on click). - No-op saves removed. Flipping the auto-start switch when the coerced enabled value already matches the server no longer queues a save. Previously, turning the toggle on or off with no conditions wrote (false, []) even though the server was already in
that state — and on a published version, that no-op write silently forked a new draft. - "Only start if not complete" responds instantly on Frequency change. Switching Frequency between Once / Multiple / Unlimited used to leave the IfCompleted control hidden for ~1s because its visibility gate read from the setting prop, which goes
through the debounced save / mutation / refetch round-trip. A localSetting mirror in autostart-rules now reflects user edits synchronously; a lastObservedSettingRef with deep-equal compare ignores reference-only prop flips emitted during the save cycle
(where setIsSaving(true) triggers a parent re-render carrying the still-stale version.config). - No flicker on Frequency switch. Switching options no longer triggers a redundant setData re-render in ConditionFrequency that briefly flashed the picker's children. The prop-sync useEffect uses value-equality bailout (isEqual(prev, next)) so the
user's own edit echoing back through defaultValue doesn't cycle the children.
🧪 Tracker editor
- Trigger conditions share the auto-start empty-state UX. Auto-start rules and tracker rules now behave identically when their conditions list is empty: both show "No conditions yet" with the same hint. The showEmptyState gate moved from
showEnabledSwitch && enabled && … to effectiveEnabled && …, so switchless consumers (tracker passes showEnabledSwitch={false}) automatically participate. - Same "don't autosave empty" policy. Tracker's handleAutoStartRulesDataChange now calls debouncedUpdateVersion.cancel() when conditions go empty, mirroring content-detail-settings.tsx. Without this, a rapid delete sequence in the tracker editor had the
same lost-deletion race as the auto-start card.
🚦 Publish gating
- Flow publish requires at least one step. useContentPublishState now keeps the Publish button disabled when content.type === FLOW and version.steps is empty — an empty flow has nothing for the runtime to render. Mirrors the existing
tracker-needs-event-and-conditions check.
🐛 Fixes
- Rapid condition deletion no longer resurrects deleted conditions. A "delete A → delete B → delete C" burst previously left the debounce queue holding the second-to-last value (e.g. [C]), which fired ~500ms after the user emptied the list and re-synced
the server back to that stale state on refetch. Both content-detail-settings.tsx and content-detail-tracker-editor.tsx now call debouncedUpdateVersion.cancel() when conditions become empty. - Version history shows the new draft after publish-then-edit. Editing a just-published content silently forks a new draft version (because ensureEditableVersionId refuses to update a published version in place), but the Apollo listContentVersions cache
wasn't auto-refreshed — so the Version tab kept showing the pre-fork list until reload. processVersion / saveVersionData / saveVersionTheme / saveVersionScheduledAt now detect fork via editableVersionId !== version.id and add refetchVersionList to the
post-mutation Promise.all. - Frequency / Wait pickers sync on content or version switch. ConditionFrequency and ConditionWait previously only read defaultValue for the initial useState value; subsequent prop changes were ignored, so navigating between contents left both pickers
stuck on the prior content's values until the user re-interacted. Both now sync internal state via a prop-sync useEffect on defaultValue change.
Full Changelog: https://github.com/usertour/usertour/compare/v0.7.6...v0.7.7
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About usertour
Usertour is an open-source user onboarding platform. It allows you to create in-app product tours, checklists, and surveys in minutes—effortlessly and with full control.The open-source alternative to Userflow and Appcues
Related context
Related tools
Beta — feedback welcome: [email protected]