-
BusyMirror 1.5.1 Stable
released this
2026-05-27 13:50:24 +00:00 | 0 commits to main since this releaseBusyMirror 1.5.1
Bug fixes
-
Mirror index written on every sync —
MirrorRecord's synthesized equality check included anupdatedAttimestamp that is always set to the current date when a record is constructed. This meant every sync run marked the index as dirty and rewrote it toUserDefaults, even when no mirror events changed. Fixed with a custom==that ignoresupdatedAt. -
Mirror URLs corrupted by special characters in calendar IDs — Calendar and source IDs placed into the
mirror://URL were not percent-encoded before joining with;. An ID containing;would cause the URL to be mis-parsed on the next sync, potentially losing the link between a placeholder and its source event. IDs are now encoded withmirrorURLComponentEncode(already present and tested since 1.4.0) and the URL path is assigned viapercentEncodedPathto prevent double-encoding. -
Calendar picker jumped during route cleanup — Running "Cleanup Placeholders" over saved routes changed the source/target picker selection for each route. Cleanup no longer mutates the UI selection.
-
--exitflag was always implied — Using--routesor--run-saved-routesalways terminated the app, making--exitredundant. The app now exits only when--exitis explicitly passed.
Improvements
-
Live calendar refresh — The calendar list now updates automatically when the system calendar database changes (new account added, calendar renamed, etc.), without requiring a manual "Refresh Calendars" press.
-
AppLogStoreextracted into its own file; deprecatedFileHandleAPI replaced with the modern throwing variant. -
Block.span(start:end:)convenience factory added toBlockMath, eliminating repetitive nil-field construction. -
Redundant
MainActor.run {}wrappers removed fromMirrorEngine(already running on@MainActor).
Downloads
-
-
BusyMirror 1.5.0 Stable
released this
2026-05-27 10:51:28 +00:00 | 1 commits to main since this releaseRemoved
- Mark Private feature: removed the non-functional server-side "Private" flagging for mirrored events. The Objective-C runtime hack never worked reliably and would have blocked App Store review.
Changed
- Extracted mirror engine: the ~500-line
runMirrorandrunCleanuplogic has been moved fromContentView.swiftinto a newMirrorEngine.swiftclass. MirrorRecord, mirror index persistence, andSAME_TIME_TOL_MINnow live in the engine module.calLabelmoved toMirrorUtils.swiftso it can be shared between UI and engine.
Build
- Bump version to 1.5.0 (build 19).
Downloads
-
BusyMirror 1.4.0 Stable
released this
2026-05-27 09:00:29 +00:00 | 2 commits to main since this releaseFixes
- Sandbox: add LaunchAgent temporary-exception entitlement
- Mirror URL: fix broken buildMirrorURL (URLComponents with ; separator)
- Cleanup: add bounds check to prevent crash on missing source
- State safety: pass MirrorConfig instead of mutating global @State
- KVC: remove misleading do-catch around setValue:forKey:
- Log cap: limit in-memory log to 2000 lines
- CLI: fix race with calendar loading
- launchCtl: separate stdout/stderr pipes
Features
- Cancel button for long-running mirrors
- Progress indicator for multi-route runs
- Target event cache across routes
Code Quality
- Extract BlockMath, MirrorUtils, EventFilters, MirrorConfig
- Add 45 unit tests across 3 test files
- Refactor mergeGapMin to computed property
- Make log editor read-only
Downloads
-
BusyMirror 1.3.9 Stable
released this
2026-04-09 13:55:31 +00:00 | 3 commits to main since this releaseBusyMirror 1.3.9 - 2026-04-09
Changes
- Add a menu bar extra with
Sync Now,Open BusyMirror, andQuit BusyMirror. - Route menu bar sync requests through the same mirroring flow as the main window, opening the window automatically when needed.
- Run BusyMirror as a menu bar-only app so it no longer appears in the Dock.
Build
- Version bump to 1.3.9 (build 17).
Downloads
- Add a menu bar extra with
-
BusyMirror 1.3.8 Stable
released this
2026-04-08 09:56:11 +00:00 | 4 commits to main since this releaseBusyMirror 1.3.8 - 2026-04-08
Changes
- Fix release packaging so the ZIP contains
BusyMirror.appat the archive root. - Apply an ad-hoc bundle signature before packaging so the distributed app bundle verifies correctly after unzip.
- Strip resource fork sidecars from release archives to avoid malformed download contents.
Build
- Version bump to 1.3.8 (build 16).
Downloads
- Fix release packaging so the ZIP contains
-
BusyMirror 1.3.7 Stable
released this
2026-03-24 09:36:54 +00:00 | 5 commits to main since this releaseBusyMirror 1.3.7 - 2026-03-24
Changes
- Fix mirrored event tracking on providers that do not preserve BusyMirror's custom event URL metadata.
- Track source events using stable EventKit identifiers and a local mirror index so moved and deleted source events update target calendars reliably.
- Detect title and notes changes during reconciliation instead of only updating mirrors when times change.
Build
- Version bump to 1.3.7 (build 15).
Downloads
-
BusyMirror 1.3.6 Stable
released this
2026-03-13 08:08:35 +00:00 | 7 commits to main since this releaseBusyMirror 1.3.6 - 2026-03-13
Changes
- Add in-app scheduling controls so BusyMirror can install and remove its own
launchdLaunchAgent. - Support hourly saved-route runs in addition to daily and weekday schedules.
- Ship a generated macOS app icon set for the app bundle and exported releases.
Build
- Version bump to 1.3.6 (build 14).
Downloads
- Add in-app scheduling controls so BusyMirror can install and remove its own
-
released this
2025-10-13 09:43:05 +00:00 | 9 commits to main since this releaseFix: Auto-delete mirrored placeholders when the source event is removed.
Triggers even if no source instances remain in the selected window.
Also cleans legacy mirrors without mirror URLs by matching exact times.Release checksum:
SHA-256: 74ff7e649348ee68129a326ef18c0e37462e34ca2f05de0e22046f5e52a6d3feDownloads
-
BusyMirror v1.3.0 Stable
released this
2025-10-10 07:58:05 +00:00 | 11 commits to main since this release- Mark Private option: mirror events with your prefix + real title while marking them Private on supported servers (e.g., Exchange). Co‑workers see the time block but not the details.
- Per-route and global toggles for Mark Private; persists in settings and export/import.
Fixes & improvements
- More reliable calendar loading after permission grant (reinit EKEventStore).
- Concurrency:
@MainActoron permission/refresh methods. - Accepted‑only filter via current user attendee
participantStatus. - Settings autosave and restore (including source/target selections by IDs).
- Mirror Now enabled when calendars available; routes or manual selection used as appropriate.
Build
make build-releasemake package→ BusyMirror-1.3.0-macOS.zip and .sha256
Downloads
-
released this
2025-10-10 06:52:47 +00:00 | 14 commits to main since this releaseFixes
- Mirror Now is enabled when routes are defined, even if nothing is checked in the main window. This allows fully route-driven runs without requiring a temporary manual selection.
Build
make build-releasemake package→ BusyMirror-1.2.4-macOS.zip and .sha256
Downloads