#macos #user #declarative #yaml #defaults

app apply-user-defaults

A small utility to set macOS user defaults declaratively from a YAML file

3 releases

✓ Uses Rust 2018 edition

0.1.2 Jan 9, 2020
0.1.1 Dec 14, 2019
0.1.0 Dec 12, 2019

#18 in macOS APIs

36 downloads per month

MIT/Apache and MPL-2.0 licenses

202 lines

Build Status License Crates.io


apply-user-defaults is a small utility to set macOS user defaults declaratively from a YAML file.


To use, simply structure a YAML file like the following:

  # System Preferences > Dock > Automatically hide and show the Dock.
  autohide: true

  # System Preferences > Dock > Minimize windows using: Scale effect.
  mineffect: "scale"

  # System Preferences > Dock > Show indicators for open applications.
  show-process-indicators: false

  # System Preferences > Dock > Size.
  tilesize: 72

Then apply it using:

$ apply-user-defaults path-to-file.yaml

You can also see what commands are being run by enabling verbose output:

$ apply-user-defaults path-to-file.yaml --verbose
==> defaults write com.apple.dock autohide -bool true
==> defaults write com.apple.dock mineffect -string scale
==> defaults write com.apple.dock show-process-indicators -bool false
==> defaults write com.apple.dock tilesize -int 72
Success! Applied defaults.

Template Expansion

Environment variables can also be included using shell parameter expansion syntax. For example:

  # Finder > Preferences > New Finder windows show > Home directory.
  NewWindowTargetPath: "file://${HOME}"

will evaluate to:

defaults write com.apple.finder NewWindowTargetPath -string "file://$HOME"

where $HOME is the value contained in the HOME environment variable.

This only applies when the string in the YAML file begins with a dollar sign and is wrapped in braces (just using $HOME won't work).

To disable, you may pass the flag --no-env or escape the dollar sign, e.g. '\\${VALUE}'.


Pre-compiled binaries are available on the releases page.


If you're using Homebrew, you can install with a custom tap:

$ brew install zero-sh/tap/apply-user-defaults

Cargo Install

To install via Cargo, run:

$ cargo install apply-user-defaults

Building from Source

To build from source:

$ git clone https://github.com/zero-sh/apply-user-defaults.git
$ cd apply-user-defaults
$ cargo run -- path-to-file.yml --verbose


This project is licensed under either the Apache-2.0 or MIT license, at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.


~57K SLoC