Changelog

What's new in OptiBreak. Latest at the top.

Unreleased

Added

  • Lemon Squeezy hosted licensingLicenseKeyManager now 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 trialEntitlementManager.startTrial() stores trialStartedAt, reflects in .trial ProSource, 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; ManagedKey enum 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 toggleenableCloudSync setting (default on); @Published syncState with 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 UXSettingsManager.enforceEntitlements() now disables (not deletes) custom and Pro breaks on trial/subscription lapse; NSAlert shown 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 supervisedPassword MDM key isn't supplied (was using UUID() → 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() and timeProvider.now() inside a single tick.
  • Hot-plug no longer orphans overlay windows when a display disconnects.
  • entitlementChanged notification now carries wasPro / isPro so the app only alerts on actual Pro→free transitions.

1.2.2

2026-04-13

Removed

  • Remove Accessibility permission requirement — break overlay no longer uses disableProcessSwitching, disableForceQuit, or disableSessionTermination presentation options, resolving App Store rejection for misuse of Accessibility APIs
  • Remove Accessibility permission card from onboarding flow

1.2.1

2026-04-10

Fixed

  • chore: update Xcode project version to 1.2.0 and add sync script for MARKETING_VERSION

1.2.0

2026-04-10

Changed

  • Remove calendar and focus deferral features

Added

  • add idle detection and multi-break trigger functionality

1.1.1

2026-04-07

Removed

  • Removed CI and moved locally

1.1.0

2026-04-07

Added

  • Added macos tests
  • Added public tests
  • Added constants tests

Fixed

  • Wired up widgets

1.0.0

2026-04-04

Added

  • 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-constants package 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