Back to Home

Changelog

All notable changes to CYNC, ordered by release date.

1.0.5

Latest

  • Domain migration: Updated all service URLs from cync.it-baer.net / cync-license.it-baer.net to cync365.com / license.cync365.com. Affects the fallback activation server URL in ActivationClient, the version/download URLs in UpdateChecker, and the website link in the About page.

1.0.4

  • Manual sync trigger not working: Fixed a semaphore waiter leak in the Worker's WaitForNextCycleAsync that caused manual sync triggers from the admin UI to silently fail. Each scheduled sync cycle left an orphaned WaitAsync in the semaphore queue; Release() would satisfy stale waiters instead of the current one. Both the timer and trigger tasks now share a cancellation token so the loser is properly cancelled after each race.

1.0.3

  • Invalid mailbox detection: Mailboxes rejected by Graph API as "invalid" (e.g. resource/room accounts, decommissioned shared mailboxes) are now gracefully skipped, matching the existing handling for "inactive" mailboxes. Previously these were counted as errors, causing false-positive PartialSuccess notifications.

1.0.2

  • Contact photo sync: Entra ID profile photos are now synced to Exchange Online contacts. Enable with the Sync Photos toggle in Configuration. Photos are fetched concurrently (10x throttle) and uploaded via PUT /users/{id}/contacts/{contactId}/photo/$value for all matched contacts — including existing ones with no field changes.

1.0.1

Added

  • License limit exceeded notification: When the number of enabled target users exceeds the license limit, a notification is sent to configured channels (Teams, Slack, Telegram) — even when the global notification toggle is off.
  • Dashboard InfoBar: Persistent warning banner on the Dashboard when enabled users exceed the license capacity. Disappears automatically when user count is within limits.
  • Free tier exceeded payload: The LicenseValidator now returns a free-tier payload (MaxUsers = 10) when no license key is present and users exceed the free tier, so the UI can display the correct limit instead of 0.

Changed

  • License page display: When no license key is present, the License page now shows status "Free" (blue) instead of "Missing" (gray), making it clear the service is on the free tier.
  • Sync result enrichment: SyncResult now includes LicenseLimitExceeded, LicenseMaxUsers, and EnabledUserCount fields so callers can react to license limit violations.
  • NotificationService refactor: Extracted SendToAllChannelsAsync helper to reduce duplication across notification methods.

Fixed

  • Accurate notification message: The license limit exceeded notification now correctly distinguishes between "sync blocked" (no license) and "sync capped" (over license limit), instead of always saying users will be synced.

1.0.0

  • Initial release: Entra ID contact sync engine with Graph API v5, gRPC service, WinUI 3 admin client, and SQLite database.
  • [Unreleased]: https://github.com/IT-BAER/cync/compare/v1.0.14-beta...HEAD
  • [1.0.14-beta]: https://github.com/IT-BAER/cync/compare/v1.0.13-beta...v1.0.14-beta
  • [1.0.13-beta]: https://github.com/IT-BAER/cync/compare/v1.0.11-beta...v1.0.13-beta
  • [1.0.11-beta]: https://github.com/IT-BAER/cync/compare/v1.0.8-beta...v1.0.11-beta
  • [1.0.8-beta]: https://github.com/IT-BAER/cync/compare/v1.0.7-beta...v1.0.8-beta
  • [1.0.7-beta]: https://github.com/IT-BAER/cync/compare/v1.0.6-beta...v1.0.7-beta
  • [1.0.6-beta]: https://github.com/IT-BAER/cync/compare/v1.0.0...v1.0.6-beta
  • [1.0.0]: https://github.com/IT-BAER/cync/releases/tag/v1.0.0

1.0.15-beta

Pre-release

  • No changelog entry for version 1.0.15-beta.

1.0.14-beta

Added

  • Cancel Sync: New CancelSync gRPC RPC and UI button (OrangeRed) to gracefully cancel a running sync via CancellationTokenSource.
  • Per-contact real-time stats: Dashboard summary cards (Created / Updated / Deleted / Errors) update live after each individual contact operation during sync, not just per-mailbox.
  • ExcludeContactsWithoutPhone filter: New configuration toggle to skip Entra users that have no business or mobile phone number — matches legacy EWS script behaviour.

Changed

  • Restart Service button is disabled while a sync is running.
  • Sync progress phase names are now human-readable (e.g. "Syncing Mailboxes" instead of "SyncingMailboxes").

Fixed

  • Dashboard summary cards no longer flicker during an active sync (status refresh skips card updates while state is "Syncing").

1.0.13-beta

  • No changelog entry for version 1.0.13-beta.

1.0.11-beta

  • No changelog entry for version 1.0.11-beta.

1.0.10-beta

  • No changelog entry for version 1.0.10-beta.

1.0.9-beta

  • No changelog entry for version 1.0.9-beta.

v1.0.8-beta

  • No changelog entry for version 1.0.8-beta.

v1.0.7-beta

Added

  • Check for Updates: About page now has a "Check for Updates" button that queries the service for the latest available version and offers a download link when an update is found.
  • Dashboard update banner: The dashboard shows an informational banner when a newer version is available, with a direct download link.
  • Version check API: The service can now check for new releases via the CheckForUpdate gRPC RPC, backed by the UpdateChecker singleton service.
  • Notification testing: New TestNotification gRPC RPC and NotificationService for validating notification delivery.

Changed

  • About page update section reworked — removed developer-oriented "Update UI" and "Update Remote Service" buttons in favor of the production-ready "Check for Updates" flow.
  • Dashboard update banner only checks once per app session and respects dismissal (no longer reappears on page re-navigation).
  • GitHub release workflow now names releases by version only (e.g. 1.0.7-beta instead of CYNC 1.0.7-beta).

Fixed

  • Resolved SYSLIB0057 warnings by replacing deprecated new X509Certificate2(bytes, password, flags) with X509CertificateLoader.LoadPkcs12.
  • Removed unnecessary System.IO.Pipes.AccessControl package reference (built into .NET 10).
  • Suppressed CA1416 platform compatibility warnings at project level (service is inherently Windows-only).
  • UpdateChecker now validates response content-type before JSON deserialization, gracefully handling non-JSON responses.