Configuring Nudge
Head on over to the Nudge Github Page, click on Schema/Jamf, then open the JSON file, and copy that large blob of code. Once you’ve done this head on back to Jamf where you will create a macOS Configuration Profile.
Making it work
- Populate your name and category under General
- Scroll over to the Applications & Custom Settings Payload
- Select a source of Custom Schema, enter “com.github.macadmins.Nudge” as your domain
- Click + to add the schema and paste in the JSON file from the wonderful people at MacAdmins and click Save.

You will now be greeted by the following, Non-Configured, options. In order to make the most basic Nudge Configuration Profile, you will need only to configure osVersionRequirements. In order to complete this section, the main question you need to ask yourself is “How many macOS versions do I need to maintain?” Once you’ve decided this, you have the number of osVersionRequirements that you will need to add in this section. Again, to set the most barebones configuration you will need only three configurations.
- targetedOSVersionsRule – Define the macOS version that you are targeting. You can create different completion dates for versions of the same macOS (15.0 vs 15.1 vs 15.2) so that older versions of the macOS will be forced to update earlier than newer ones.
- requiredInstallationDate – Define the deadline for completing the upgrade
- requiredMinimumOSVersion – The minimum acceptable macOS
Once your Configuration Profile is ready scope it to machines along with the latest Nudge release.
Making it more functional for your users
One of the biggest complaints that you probably get from your users is that they are getting bugged about updates in the middle of a meeting or while they are doing something important. Well, its time for you to determine what is important and what isn’t.

Under optionalFeatures there are three settings that will allow you to control what user activity can prevent them from receiving the alert that there is an update for them.
- acceptableApplicationBundleIDs: Obtain the Bundle IDs of the applications via terminal by using codesign -dv /Applications/AppName.app. When these applications are in use, the Nudge app will not take focus away from the application
- acceptableCameraUsage: Nudge app will not activate while the camera is use if this is configured.
- acceptableScreenSharingUsage: Nudge app will not activate while screen sharing is use if this is configured.
Making it better for you
I know, at this point you are thinking “how could I possibly make this any better?” Simple, you can configure grace periods for new devices, windows for frequency of notifications, and deferrals. Doesn’t this make you super excited?
The majority of these settings are under userExperience and so that is where we will begin. Unfortunately there will be no pictures in this section…I know, what a bummer. These are the settings that determine how often your users will receive the Nudge notification. Basically, there are 4 time periods
- Initial (time from deployment of the profile til the first defined period of notifications)
- Approaching, you’re within x number of days till the required installation date
- Imminent, you’re closer to the required installation date
- Elapsed, you’re passed the required installation date
Setting | Definition | Value, if any |
allowGracePeriods | Allows the requiredInstallationDate variable set in the first section to be modified for newly provisioned devices. | n/a |
gracePeriodPath | The Nudge file for tracking the grace period. | /private/var/db/.AppleSetupDone |
gracePeriodInstallDelay | The amount of time in hours Nudge will extend the requiredInstallationDate for newly provisioned devices. | 48 |
gracePeriodLaunchDelay | The amount of time in hours Nudge will bypass launching for newly provided devices | 12 |
initialRefreshCycle | The key for how often to NUDGE your client until the approachingWindowTime has passed. | 18000 (every 5 hours) |
approachingWindowTime | The amount of time in hours Nudge will use to determine that the requiredInstallationDate is “approaching”. | 72 |
approachingRefreshCycle | As the requiredInstallationDate approaches (within the approachingWindowTime), but has not yet arrived, you can NUDGE your clients occasionally. (Seconds) | 7200 (2 hours) |
imminentWindowTime | The amount of time in hours Nudge will use to determine that the requiredInstallationDate is “imminent”. | 48 |
imminentRefreshCycle | As the requiredInstallationDate approaches (within the imminentWindowTime), but has not yet arrived, you can NUDGE your clients occasionally. (Seconds) | 600 (ten minutes) |
elapsedRefreshCycle | Once the requiredInstallationDate has expired, the interface should be set to get noisier and appear more often. | 300 |
Once we’ve defined how often our users will get NUDGE’d we can handle a few more settings for improving the download of updates. These three settings are in the optionalFeatures section.
asynchronousSoftwareUpdate | When disabled, Nudge will wait for Software Update to finish downloading (if any) updates before showing the UI. | False |
attemptToFetchMajorUpgrade | When a major upgrade is required, Nudge will attempt to download it through the softwareupdate binary | True |
enforceMinorUpdates | When enabled, Nudge will enforce minor updates. | True |
Making it look better
Ok, so you’ve gotten this far but your notifications look very generic and your customers are asking you if this is a legit popup. I spent a lot of money on training so that my users don’t trust random popups. How can I brand this so that it is trusted? Branding and wordsmithing. Once again, no pretty pictures here.
Setting | Definition | Value |
fallbackLanguage | If no localized setting is on the device | en (english) or whatever you need can be obtained by running /usr/bin/locale -a in terminal |
forceFallbackLanguage | Force the previous value | False |
iconDarkPath | Default icon is an Apple icon, this would be a dark version of a custom icon | Path to your custom branding files |
iconLightPath | Default icon is an Apple icon, this would be a light version of a custom icon | Path to your custom branding files |
showDeferralCount | Enables or disables the deferral count of the current Nudge event. | True |
singleQuitButton | Only display one quit button regardless of proximity to the due date. | True |
updateElements | Customize the messaging for your clients | Configured |
_language | The targeted language | en (same as previous languages) |
mainContentText | The text that explains to the customer that an update is required, an estimated time required, and anything else to make them feel comfortable that they should click update. | Hey there! We noticed this Mac has available software updates. It is important to keep macOS up to date in order to secure our devices and data. \n\nClicking the “Update Device” button will redirect you to the Software Update System Settings (or System Preferences) pane to run the available updates. Make sure your work is saved and you are ready for your computer to restart. Once there, click the “Update Now” button and follow the prompts to complete the update process. This typically takes 30-45 minutes. \n\nYou will continue to regularly see this prompt until all OS updates have been installed. |
mainHeader | The header that will appear in the window | This Mac requires a security update |
subHeader | The subheader that will appear in the window | A friendly notice from your friendly neighborhood IT Team |
Conclusion
That’s it…you have a nicely configured Nudge implementation. Could it be better by enabling other features? Potentially, that additional configuration is up to you. If you’d like to download a mobileconfiguration of what I’ve done here, the link is below…make it you’re own.