Skip to main content

Declarative Device Management (DDM)

Apple's modern device management framework for autonomous policy enforcement.

The device enforces settings on its own. No more waiting for MDM commands.

What is DDM?โ€‹

Declarative Device Management (DDM) is Apple's next-generation approach to managing devices. Instead of the MDM server telling the device what to do step-by-step, DDM tells the device the desired state, and the device figures out how to get there on its own.

Think of the difference this way:

Traditional MDM (Command-Based)

The MDM server sends commands to the device. The device does exactly what it's told, then waits for the next command.

Like a recipe: "Step 1: Preheat oven. Step 2: Mix ingredients. Step 3: Bake for 30 minutes." The device follows each step when told.

DDM (Declarative)

The MDM tells the device "here's what should be true." The device continuously ensures those things stay true, even without further commands.

Like a thermostat: "Keep it 72 degrees." The device handles everything needed to maintain that state, automatically adjusting when conditions change.

Why DDM Mattersโ€‹

๐Ÿ“ฑ
Device-DrivenThe device enforces policies autonomously. It doesn't wait for the MDM server to tell it what to do.
โšก
Instant ResponseChanges take effect immediately. No polling intervals or waiting for the next check-in.
๐Ÿ”„
Self-HealingIf a user changes a managed setting, the device automatically reverts it. Compliance is maintained without MDM intervention.
๐Ÿ“‰
Reduced LoadLess back-and-forth communication. The device handles enforcement, freeing up your MDM server.

DDM vs Configuration Profilesโ€‹

You might wonder: "How is DDM different from the configuration profiles we already use?" Here's the key distinction:

Configuration Profiles are installed on the device and enforced by macOS. They work great, but the MDM has to install them, and the MDM decides when to check on things.

DDM Declarations go a step further. The device itself becomes responsible for maintaining the declared state. It reports its status to the MDM proactively, and it reacts to changes immediately without waiting for an MDM command.

Practical Exampleโ€‹

Let's say you want to require a 12-character password:

With Traditional Profiles:

  1. MDM pushes a profile with password requirements
  2. macOS enforces the requirement
  3. If you want to change to 14 characters, MDM removes old profile and pushes new one
  4. Device waits for MDM to initiate the change

With DDM:

  1. MDM sends a declaration: "Password must be 12 characters"
  2. Device acknowledges and enforces
  3. If you update declaration to 14 characters, device immediately knows and enforces new requirement
  4. Device proactively reports its compliance status to MDM

What MACE Generatesโ€‹

When you enable DDM in MACE's build options, it creates three types of files:

โš™๏ธ

Configurations

JSON files that define the actual settings you want on devices. These are the "desired state" declarations.

Example: A configuration declaring that screen lock must activate after 5 minutes of inactivity.

โœ…

Activations

JSON files that control when configurations apply. They can enable configurations based on conditions or device properties.

Example: An activation that enables security configurations only on devices in a specific group.

๐Ÿ“ฆ

Assets

Supporting files that configurations reference including scripts, certificates, or other resources the device needs.

Example: A script asset that a configuration references to run a compliance check.

Inside a DDM Declarationโ€‹

DDM declarations are JSON files with a specific structure. Here's what a configuration declaration looks like:

{
"Type": "com.apple.configuration.screensaver.settings",
"Identifier": "com.mace.screensaver.askpassword",
"ServerToken": "1.0.0",
"Payload": {
"askForPassword": true,
"askForPasswordDelay": 0,
"loginWindowIdleTime": 300
}
}

Type: The kind of configuration. Apple defines these types, similar to profile payload types.

Identifier: A unique ID for this declaration. Each declaration needs a unique identifier.

ServerToken: A version string. When you update this, the device knows the declaration changed.

Payload: The actual settings. This is where you define what you want configured.

How Activations Workโ€‹

Activations are like switches that turn configurations on or off. Here's an example:

{
"Type": "com.apple.activation.simple",
"Identifier": "com.mace.activation.security",
"ServerToken": "1.0.0",
"Payload": {
"StandardConfigurations": [
"com.mace.screensaver.askpassword",
"com.mace.firewall.enable",
"com.mace.passcode.requirements"
]
}
}

This activation says: "Turn on these three configurations." The device receives the activation and immediately begins enforcing those configurations.

How Assets Workโ€‹

Assets provide external resources that configurations can reference:

{
"Type": "com.apple.asset.data",
"Identifier": "com.mace.asset.compliance-script",
"ServerToken": "1.0.0",
"Payload": {
"DataURL": "https://your-server.com/compliance.sh",
"ContentType": "application/x-sh",
"Hash-SHA-256": "abc123..."
}
}

The device downloads the asset and makes it available for configurations to use.

Output Structureโ€‹

After building with DDM enabled, you'll find this structure in your build folder:

declarative/
โ”œโ”€โ”€ configurations/
โ”‚ โ”œโ”€โ”€ screensaver-settings.json
โ”‚ โ”œโ”€โ”€ passcode-requirements.json
โ”‚ โ”œโ”€โ”€ firewall-settings.json
โ”‚ โ””โ”€โ”€ ...
โ”œโ”€โ”€ activations/
โ”‚ โ”œโ”€โ”€ security-activation.json
โ”‚ โ””โ”€โ”€ ...
โ””โ”€โ”€ assets/
โ”œโ”€โ”€ compliance-script.json
โ””โ”€โ”€ ...

Each folder contains JSON files that show the exact settings and values for each declaration.

Deploying DDMโ€‹

MDM GUI Configuration Required

Currently, no MDMs support directly importing DDM JSON declaration files. All MDMs require you to configure DDM settings through their own graphical interface.

The JSON files MACE generates serve as a reference showing you the exact configuration values needed. Use these files to understand what settings to configure, then enter those values manually in your MDM's DDM section.

What Happens on the Macโ€‹

When your MDM sends DDM declarations to a device:

๐Ÿ“ฅ
Device receives the declaration

During check-in, the MDM sends declarations to the device.

โœ…
macOS validates and applies

The device validates the declaration format and immediately applies the settings.

๐Ÿ“ค
Device reports status

The device proactively reports its compliance status back to the MDM.

๐Ÿ”„
Continuous enforcement

The device maintains the declared state autonomously, even when offline.

MDM Compatibilityโ€‹

DDM is supported by major MDM solutions. Each MDM has its own interface for configuring DDM settings:

๐ŸŸข
Jamf ProDDM configuration in Devices โ†’ Declarative Device Management
๐Ÿ”ต
Microsoft IntuneDDM via Settings catalog for supported settings
๐ŸŸฃ
MosyleDDM configuration through management console
๐ŸŸ 
KandjiDDM integrated into library items
โšซ
Workspace ONEDDM support for macOS devices

Check Your MDM's Documentation: DDM is still evolving. Each MDM implements DDM differently and supports different declaration types. Always check your specific MDM's documentation for current capabilities.

DDM Requirementsโ€‹

๐Ÿ’ป
macOS 13 (Ventura) or later

DDM was introduced in macOS 13. Older Macs running macOS 12 or earlier cannot use DDM. Use configuration profiles instead.

๐Ÿ“ฑ
MDM Enrollment

Devices must be enrolled in an MDM that supports DDM. Unenrolled devices cannot receive declarations.

๐Ÿ”’
Supervision (for some features)

Certain DDM capabilities require the device to be supervised. User-enrolled devices may have limited DDM functionality.

๐ŸŒ
Network Connectivity

Devices need network access to receive declarations. However, once received, enforcement continues offline.

When to Use DDM vs Profilesโ€‹

DDM isn't a replacement for everything. It's another tool in your toolbox:

โœ…Use DDM when...You need immediate enforcement, self-healing, or want to reduce MDM server load
โœ…Use DDM when...Your MDM and macOS version support the specific setting you need
๐Ÿ“‹Use Profiles when...You're managing older Macs (macOS 12 or earlier)
๐Ÿ“‹Use Profiles when...The setting you need isn't available as a DDM declaration
๐Ÿ“œUse Scripts when...You need to check/audit settings that can't be managed by profiles or DDM

Most deployments use a combination. DDM for what it supports, profiles for broader coverage, and scripts for auditing and edge cases. MACE can generate all three from the same rule set.

Best Practicesโ€‹

๐Ÿงช
Test on Pilot Devices First

DDM behavior differs from profiles. Always test declarations on a small group before broad deployment.

๐Ÿ”ข
Version Your Declarations

Use meaningful ServerToken values. Increment them when you make changes so devices know to apply updates.

๐Ÿ‘๏ธ
Monitor Declaration Status

Check your MDM's reporting regularly. DDM provides detailed status about each declaration's state on each device.

๐Ÿš€
Start Simple

Begin with a few declarations for well-understood settings. Expand as you gain confidence with DDM behavior.

๐Ÿ“‹
Have a Fallback Plan

Keep your profiles and scripts ready. If a DDM declaration doesn't work as expected, you can fall back to traditional methods.

Troubleshooting DDMโ€‹

Common issues and solutions:

Declaration Not Applying
  • Verify the device is running macOS 13 or later
  • Check that the device is enrolled in your MDM
  • Confirm the declaration type is supported by your MDM
  • Look for errors in the MDM's declaration status report
Declaration Shows as "Failed"
  • Check the JSON syntax is valid
  • Verify the declaration Type is correct
  • Ensure required Payload keys are present
  • Check if the setting requires supervision
Settings Revert After User Changes Them
  • This is expected DDM behavior. The device enforces the declared state
  • If you need users to modify the setting, remove the declaration
Conflict with Existing Profile
  • DDM declarations and profiles can conflict if they manage the same setting
  • Remove conflicting profiles before deploying DDM for the same settings
  • Choose one method per setting: DDM or profile, not both