Changelog
What's new in OptiBreak. Latest at the top.
Unreleased
Added
- Lemon Squeezy hosted licensing —
LicenseKeyManagernow calls LS's public license API directly (/v1/licenses/activate,/validate,/deactivate). LS handles checkout, webhooks, key issuance, key emailing, seat limits, and key rotation; no first-party backend or database required. - 7-day free trial —
EntitlementManager.startTrial()storestrialStartedAt, reflects in.trialProSource, hourly expiry check, menu bar chip showing days remaining, Preferences badge. - Onboarding trial CTA — primary "Start 7-day free trial" button on Pro step (shown when trial hasn't been used).
- Supervised-mode recovery code — 16-char recovery code generated at password set, hashed separately in Keychain, "Forgot password?" unlock flow; rate-limits failed attempts (5 within 5 min → 60s lockout).
- MDM managed indicator — "Managed by your organization" banner in Preferences; Lock button disabled under MDM;
ManagedKeyenum tracks overridden settings. - Team license device display — "Used on X of Y devices" row in Preferences when a team license is active; populated from LS
activation_usage/activation_limit. - iCloud Sync toggle —
enableCloudSyncsetting (default on);@Published syncStatewith live status chip in Preferences; graceful degradation when provider unavailable. - Emergency escape on break overlay — triple-Escape within 2s force-dismisses (production); logged for audit.
Changed
- Payments + licensing migrated to Lemon Squeezy — replaces the planned Paddle + first-party backend stack. Removed
apps/optibreak-backend,packages/licensing-core,.github/workflows/backend-{ci,nightly}.yaml, and the docker-compose backend service. LS is now the merchant of record + hosted licensing provider for direct downloads. - Silent-downgrade UX —
SettingsManager.enforceEntitlements()now disables (not deletes) custom and Pro breaks on trial/subscription lapse;NSAlertshown with "Upgrade" or "Continue" actions when pro→free transitions. - Onboarding Pro step — no longer calls
enforceEntitlements()on "Maybe Later"; user completes onboarding on their chosen break config. - BreakScheduler — adds 60s focus-session grace window for mildly-overdue breaks; severely-overdue (>5min late) breaks still fire immediately; 2s post-trigger cooldown as belt-and-suspenders.
- ScreenLockManager — gracefully ends the break session if a hot-plug leaves no active screens, rather than leaving the app in a phantom-locked state.
- `ProSource` enum — collapsed legacy provider-specific cases into
.license+ new.trial; Preferences badge shows "Pro via {org}" when a team name is present. - MDM forced supervised mode — refuses to lock if
supervisedPasswordMDM key isn't supplied (was usingUUID()→ permanent lockout). - License key flow — direct purchases open the LS hosted checkout on the website, buyer pastes the emailed key into
LicenseKeySheet; client persists LS instance ID in Keychain for revalidation/deactivation.
Fixed
- Scheduler no longer mixes
Date()andtimeProvider.now()inside a single tick. - Hot-plug no longer orphans overlay windows when a display disconnects.
entitlementChangednotification now carrieswasPro/isProso the app only alerts on actual Pro→free transitions.
1.2.2
2026-04-13Removed
- Remove Accessibility permission requirement — break overlay no longer uses
disableProcessSwitching,disableForceQuit, ordisableSessionTerminationpresentation options, resolving App Store rejection for misuse of Accessibility APIs - Remove Accessibility permission card from onboarding flow
1.2.1
2026-04-10Fixed
- chore: update Xcode project version to 1.2.0 and add sync script for MARKETING_VERSION
1.2.0
2026-04-10Changed
- Remove calendar and focus deferral features
Added
- add idle detection and multi-break trigger functionality
1.1.1
2026-04-07Removed
- Removed CI and moved locally
1.1.0
2026-04-07Added
- Added macos tests
- Added public tests
- Added constants tests
Fixed
- Wired up widgets
1.0.0
2026-04-04Added
- macOS App: Native SwiftUI desktop application with menu bar integration
- Break System: 22 break types across categories (meditation, desk exercises, stretches, journaling, and more)
- Pro Tier: 22 extended break types gated behind Pro subscription with 7-day free trial
- Widgets: 4 macOS widgets — streak counter, break countdown, daily stats, weekly heatmap
- Analytics & Insights: Mood tracking, heatmap calendars, break history timeline, annual recap, health score, trend analysis
- Calendar Integration: Automatically skips breaks during meetings
- Idle Detection: Defers breaks when user is idle for 5+ minutes
- Focus Mode Awareness: Respects macOS Do Not Disturb / Focus modes
- Supervised Mode: Locked mode with Keychain password protection for enterprise/parental use
- MDM Support: Mobile Device Management configuration for enterprise deployment
- Data Export: CSV and JSON export of break history and analytics
- Spotlight Search: Quick access to breaks and settings via Spotlight
- Sound Effects: Configurable notification sounds and preferences
- Payments: RevenueCat (App Store) and Lemon Squeezy (direct distribution) integration
- Marketing Website: Next.js landing page with pricing, product info, and download flows
- Localisation: Multi-language support with translation management
- Shared Constants:
@strkkltd/optibreak-constantspackage for cross-platform consistency - CI/CD: GitHub Actions for lint, type-check, build, deployment, and macOS notarisation
- Auto-Updates: Sparkle framework for direct distribution updates
Removed
- HealthKit Integration: Removed HealthKit entitlements and stand/mindful minutes tracking — too limited on macOS to justify the review friction
Fixed
- Onboarding Permissions: Accessibility permission now updates in real-time without requiring app restart
- Onboarding Calendar: Added calendar permission request to onboarding flow
- Build: Added missing LicenseKeyManager and LicenseKeySheet to both Xcode targets