SYM-Lite is a lean, purpose-built script for executing MDM-agnostic Installomator labels and Homebrew casks / formulas, as well as Jamf Pro-specific policy triggers, all through a unified swiftDialog selection and reporting interface.
|
|
|
|
|
|
✓ Unified execution support — Installomator labels, Homebrew packages, and (optionally) Jamf Pro policies in a single session
✓ Interactive selection UI — User-friendly checkbox dialog with per-item icons; optional install-state labels disable already-installed items and exit cleanly when nothing remains selectable
✓ Alphabetical sorting — All items sorted together by display name in selection dialog
✓ Silent mode — CSV-based automation support
✓ Early Installomator label validation — Configured Installomator labels are verified against the active Installomator file before they can appear or run
✓ Homebrew package support — Approved casks and formulas run in the logged-in user context when brew is available
✓ Inspect Mode monitoring — Rich status updates for Installomator labels and path-based progress for Homebrew/Jamf items
✓ Log monitoring — Parses Installomator.log for intermediate states and captures Homebrew/Jamf output into the main log
✓ Path-based validation — Pre/post-execution checks via file system monitoring
✓ Cache monitoring — Detects in-progress downloads
✓ Completion report — Per-item results summary and optional restart prompt
✓ Graceful interruption — Clean shutdown on SIGINT/SIGTERM with 30-second timeout
Edit the installomatorLabels array near the top of SYM-Lite.zsh:
installomatorLabels=(
"label | Display Name | Validation Path | Icon URL"
)Example:
installomatorLabels=(
"microsoftword | Microsoft Word | /Applications/Microsoft Word.app | https://icon.url"
"googlechrome | Google Chrome | /Applications/Google Chrome.app | https://icon.url"
"zoom | Zoom | /Applications/zoom.us.app | https://icon.url"
)At runtime, SYM-Lite validates each configured label against organizationInstallomatorFile before building the picker or accepting silent-mode CSV input. If a label is missing from that Installomator file, or if the Installomator file is unavailable or unreadable, SYM-Lite logs a warning or error and removes Installomator labels from the current run while leaving other item types available.
Edit the homebrewItems array near the top of SYM-Lite.zsh:
homebrewItems=(
"cask:token | Display Name | Validation Path | Icon URL"
"formula:token | Display Name | Validation Path | Icon URL"
)Example:
homebrewItems=(
"cask:docker | Docker Desktop | /Applications/Docker.app | https://icon.url"
"formula:node | Node.js | /opt/homebrew/bin/node | SF=terminal"
"formula:python@3.12 | Python 3.12 | /opt/homebrew/bin/python3.12 | SF=terminal"
)Important:
- Use
cask:orformula:prefixes in the item ID - Homebrew examples and default validation paths in this repo assume Apple silicon with Homebrew installed in
/opt/homebrew - Homebrew items are hidden for the current run if no working
brewbinary is available - Homebrew items also require a valid logged-in user because package installs run in user context rather than as
root
Edit the jamfPolicyItems array near the top of SYM-Lite.zsh:
jamfPolicyItems=(
"trigger | Display Name | Validation Path | Icon URL"
)Example:
jamfPolicyItems=(
"installRosetta | Install Rosetta 2 | /usr/bin/arch | SF=cpu"
"enableFileVault | Enable FileVault | /Library/Preferences/com.apple.fdesetup.plist | SF=lock.shield"
"configureDock | Configure Dock | /usr/local/bin/dockutil | SF=dock.rectangle"
)Icon Options:
- Full URL:
https://... - SF Symbol:
SF=symbolname,weight=semibold,colour1=auto,colour2=auto
If your environment does not use Jamf Pro, set enableJamfPolicyItems="false" near the top of SYM-Lite.zsh.
When Jamf policy items are disabled:
- Jamf policy items do not appear in the interactive selection UI
- Jamf policy items do not execute
- Jamf binary pre-flight validation is skipped
- Silent mode warns and skips Jamf item IDs in the CSV input
If your environment does not use Homebrew packages through SYM-Lite, set enableHomebrewItems="false" near the top of SYM-Lite.zsh.
When Homebrew items are disabled:
- Homebrew items do not appear in the interactive selection UI
- Homebrew items do not execute
- Homebrew pre-flight detection is skipped
- Silent mode warns and skips Homebrew item IDs in the CSV input
Run the script as root with no parameters:
sudo ~/Downloads/SYM-Lite.zshUser experience:
- Selection dialog appears with all configured items
- User selects one or more items using checkboxes
- Inspect Mode dialog launches showing real-time progress
- Completion report shows one row per selected item
- Optional restart prompt
If the user clicks Cancel in the selection dialog, interactive mode exits cleanly without launching Inspect Mode. If selectionDialogStatusSublabelsEnabled="true" and every remaining valid item is already installed, interactive mode shows an informational dialog and exits without launching Inspect Mode. If no valid items remain after configuration validation, interactive mode exits cleanly with a generic unavailable-items message.
Interactive mode requirements:
- Requires an active logged-in GUI user
- Waits up to 120 seconds for a valid console user before exiting
- If the Mac is at the login window or otherwise headless, use
silentmode instead
Run with Jamf parameters or direct positional arguments:
Via Jamf Policy:
- Parameter 4:
silent - Parameter 5:
microsoftword,cask:docker,formula:node,installRosetta
Direct execution:
sudo /path/to/SYM-Lite.zsh "" "" "" silent "microsoftword,cask:docker,formula:node"Silent mode behavior:
- No selection dialog
- CSV list parsed directly
- No Inspect Mode or completion dialogs
- No restart prompt
- Same pre-flight checks still run, including
swiftDialogvalidation / installation - Installomator labels filtered out during pre-flight validation are warned and skipped in the CSV input
- If Jamf policy items are disabled, Jamf item IDs in the CSV are warned and skipped
- If Homebrew items are disabled or unavailable for the current run, Homebrew item IDs in the CSV are warned and skipped
- Exits with an error if the CSV contains no valid item IDs
- Suitable for automated deployment
- macOS 15+ (required by swiftDialog 3.x)
- Root access — Script must run as
root - swiftDialog 3.0.1.4955+ (auto-installed if missing)
- Installomator — Required only when Installomator labels are configured and available for the current run
- Configured Installomator labels are validated early against the active
organizationInstallomatorFile - If the Installomator file is unavailable or cannot be parsed, Installomator labels are hidden and skipped for that run
- Configured Installomator labels are validated early against the active
- Homebrew Binary — Required only when
enableHomebrewItems="true"and Homebrew items are configured - Jamf Pro Binary — Required only when
enableJamfPolicyItems="true"and Jamf policy items are configured
PRE-FLIGHT CHECKS
├─ Verify root
├─ Check/install swiftDialog
├─ Normalize Installomator labels
├─ Normalize Homebrew item availability and detect brew path
├─ Normalize Jamf item availability from configuration
├─ Verify Jamf binary (if enabled and items configured)
↓
SELECTION INTERFACE
├─ Show dialog (interactive) or parse CSV (silent)
├─ Validate at least one selection
└─ Separate items by type (Installomator → Homebrew → Jamf)
↓
INSPECT MODE CONFIGURATION
├─ Interactive mode only
├─ Build unified JSON config
├─ Merge Installomator + Homebrew + Jamf items
├─ Add cachePaths for download detection
└─ Validate JSON with plutil
↓
EXECUTION ENGINE
├─ Interactive mode launches Inspect Mode dialog (background)
│ └─ Silent mode logs progress without UI
├─ Process items sequentially (Installomator → Homebrew → Jamf)
│ ├─ Installomator: executeInstallomatorLabel()
│ ├─ Homebrew: executeHomebrewItem()
│ └─ Jamf: executeJamfPolicy()
├─ Interactive mode waits for Inspect Mode to close
└─ Silent mode exits when execution completes
↓
COMPLETION & RESTART
├─ Interactive mode shows a completion report for selected items
└─ Interactive mode prompts for restart (if enabled and something was newly installed)
swiftDialog's Inspect Mode uses dual monitoring for comprehensive progress tracking:
Log Monitoring:
- Parses
/var/log/Installomator.login real-time - Uses undocumented
"preset": "installomator"feature - Shows intermediate states: "Downloading...", "Installing...", "Verifying...", "Completed"
File System Monitoring:
- Watches validation path via FSEvents API
- Item marks complete when app appears at specified path
File System Monitoring Only:
- Shows binary states: "Waiting" → "Completed"
- Watches validation path (e.g.,
/Applications/Docker.appor/opt/homebrew/bin/node)
File System Monitoring Only:
- Shows binary states: "Waiting" → "Completed"
- Watches validation path (e.g.,
/usr/bin/arch)
cachePathsmonitoring for in-progress downloadsscanInterval: 2— Checks every 2 seconds- Auto-enable Close button when all items complete
- 30-second timeout if dialog doesn't close naturally
- Pre-check: If validation path exists → skip
- Execute:
Installomator.sh <label>withDEBUG=0 NOTIFY=silent - Inspect Mode: Log parsing + path monitoring
- Post-check: Exit code determines success/failure
- Pre-check: If validation path exists → skip
- Execute:
brew install(or--cask) as the logged-in user - Inspect Mode: Path monitoring only
- Post-check: Exit code + path validation
- Pre-check: If validation path exists → skip
- Execute:
jamf policy -event <trigger> - Inspect Mode: Path monitoring only
- Post-check: Exit code + path validation
| Variable | Default | Purpose |
|---|---|---|
organizationPreset |
"2" |
swiftDialog Inspect Mode preset (1-4) |
organizationInstallomatorFile |
/Library/Management/... |
Path to Installomator.sh |
installomatorLog |
/var/log/Installomator.log |
Installomator log path for monitoring |
jamfBinary |
/usr/local/bin/jamf |
Path to jamf binary |
enableJamfPolicyItems |
"true" |
Show and execute Jamf policy items |
brewPath |
"" |
Optional Homebrew binary override |
enableHomebrewItems |
"true" |
Show and execute Homebrew cask/formula items |
homebrewUpdateBeforeInstall |
"false" |
Run brew update once before the first Homebrew package install |
organizationOverlayiconURL |
swiftDialog logo | Overlay icon URL |
mainDialogIcon |
GitHub raw SYM_icon.png URL |
Main dialog icon |
fontSize |
"14" |
Dialog message font size |
selectionDialogStatusSublabelsEnabled |
"true" |
Show install-state sublabels, disable already-installed items, and exit cleanly if no selectable items remain |
restartPromptEnabled |
"true" |
Show restart prompt after completion |
scriptLog |
/var/log/...log |
Client-side log path |
(The rest of the document — Logging, Troubleshooting, Testing Checklist, Next Steps, and Support — remains unchanged as the reordering was already applied where relevant.)
Version: 1.0.0
Date: 12-Apr-2026
Author: Dan K. Snelson (@dan-snelson)





