v2.4 splits the Dashboard into focused views, closes several data-integrity gaps found during a deep architecture review, and polishes Setup, Sync, Devices, Export, and the environment sidebar.
Dashboard focus modes
- The Dashboard is now three views instead of one: Default (today's mixed ABM/ASM + Jamf reconciliation), Apple (everything scoped to your ABM/ASM-sourced fields), and Jamf Pro (everything scoped to Jamf-sourced fields) — pick a focus from the menu next to Run Sync
- Each focus mode has its own facet filter bar (source, coverage, managed status, device type, FileVault, check-in freshness, product family, purchase source, and more) — filtering the Dashboard never touches the Devices tab's own filters
- Every number on every card is tappable — it drills straight into the Devices tab pre-filtered to exactly what was counted, with any active facet carried along
- New chart types: donut charts (product family, device type, FileVault), horizontal bar charts (purchase source, OS version), and a year-over-year trend chart (devices added to org) — all Swift Charts, animated, light/dark aware
Security & data integrity
- Cached tokens are now scoped to a SHA-256 identity (origin + client ID) — one environment can no longer load another's cached Apple or Jamf token, and a stale token can't survive a host or client-ID change within an environment
- Jamf write-back now re-validates the serial→device mapping whenever the Jamf URL or client ID changes — previously a changed Jamf connection could silently PATCH warranty data onto the wrong physical machine using a stale cached mapping
- Sync runs report one of four honest outcomes — Success, Partial, Failed, or Cancelled — instead of always looking like success even when part of a run failed
- Environment deletion now quiesces before it deletes — any in-flight sync is stopped and Core Data is cleanly detached before files are removed, closing a race that could corrupt a store mid-delete
- AxM device fetch commits each batch to disk before advancing its resume checkpoint, so an interrupted large fetch can never silently skip a page of devices on resume
- v1→v2 migration verifies the copied credentials and device count before deleting the originals — a failed migration now leaves your original data completely untouched and retries next launch
Setup, Sync, Devices, Export, Sidebar
- Setup: credentials save automatically as you type — no more "Save to Keychain" checkbox — with a status line showing when each set was saved and last verified, and a masked Key ID next to your loaded private key
- Sync: a redone Last Run Summary (Apple devices, Jamf devices, coverage checked, Jamf updated, Jamf failed, duration — each with a Mac/Mobile split), a resizable log pane that only auto-scrolls while you're already at the bottom (with a Jump to Latest button when you've scrolled up), a log Clear button, and a Warn+ log filter
- Devices: search now also matches username, Jamf ID, AppleCare agreement number, MDM server, order number, and model identifier; select multiple devices at once to copy their serials or export just that selection; every device offers Copy Serial / Copy Jamf ID / Open in Jamf Pro from a right-click or the detail panel
- Export: four new presets (Expiring in 30/31–60/61–90 Days, Write-back Failed), drag-to-reorder columns whose order and selection now actually persist across launches (previously silently didn't save at all), a Show in Finder button after export, and filenames that include the environment name
- Sidebar: environment rows are now natively keyboard-navigable, show sync recency instead of a redundant scope label, and support inline rename (double-click the name, or press Return) — the delete icon only appears on hover
- New Help → Export Diagnostics… — bundles app/environment metadata, a per-environment settings summary (never credentials or server hosts), and every log file into a zip, for sharing when troubleshooting
Upgrade Notes
No migration required. Existing credentials, cache, and preferences carry over unchanged.
SHA-256: 2da7bd18b123a43b5fa899599fa5d5f542ae9d8741c1529ca568654e268786a3