Powerful, declarative settings management for your Mac, with
speed.
cutler aims to simplify your macOS setup experience into an "almost" one-command procedure. Define your settings once, then easily apply, track, and revert changes across your system—think of it as infrastructure-as-code for your Mac.
This website is just an overview of what cutler can do. In order to get a comprehensive guide on what cutler can do, please read the official README.
If you like this project, consider ⭐ starring it! :D
Just a single brew command and you're ready to go!
brew install hitblast/tap/cutler
Or, use one of the following:
# Using cargo
cargo install cutler
# Using mise
mise use -g cargo:cutler
The prebuilt binaries are compiled and shipped from macOS 14 on arm64. Intel Macs will require a manual compilation of the project.
In order to setup a comprehensive example on your Mac automatically, use this command:
cutler init
Or, create a config.toml file within one of the
locations listed below and write your preferred settings following
the defaults syntax. Check out the
example configuration files
to get started quickly!
$XDG_CONFIG_HOME/cutler/config.toml~/.config/cutler/config.toml~/.config/cutler.tomlconfig.toml (current directory)Always keep your system settings on track with the automatic shell prompt by putting this command in your shell configuration:
cutler status --prompt
# Bash
cutler completion bash > cutler.bash
mv cutler.bash ~/.bash-completion.d/
# Zsh
cutler completion zsh > _cutler
mv _cutler ~/.zfunc/
# Other shells like powershell, elvish and fish are also available.
cutler apply
# or, skip external commands (see reference below)
cutler apply --no-exec
This command applies all settings from your config file and restarts necessary system services.
cutler status
Compares your configuration with current system settings.
See Shell Integrations for another use case of this command in your terminal.
cutler unapply
Removes all settings applied by cutler.
cutler reset --force
Resets every defaults domain written in the config file to factory settings.
NOTE: This should ONLY be used as a fallback option to
cutler unapply.
# Shows the contents of the configuration file
cutler config show
# Unapplies and deletes the configuration file
cutler config delete
cutler check-update
When you run
cutler apply, a snapshot file
.cutler_snapshot is created in your home directory.
This file records your configuration state and lets you revert
to a previous setup if needed. Do not delete this file manually!
Add --verbose to any command for more detailed
output about what's happening behind the scenes.
cutler eliminates manually installing packages by hand and using bundle files for storing their identifiers using just these two commands:
# Backup installed casks and formulae
# This will store all formula/cask names to cutler.toml
cutler brew backup
# Optionally, you can add the --no-deps flag
# This will only backup the formulae/casks which aren't a dependency.
cutler brew backup --no-deps
# Now, to install from your cutler.toml file:
cutler brew install
When you apply your defaults using cutler, you can also define custom external commands to be executed in a post-hook fashion:
# A basic hello
[commands.greet]
cmd = "echo \"Hello World\""
This translates to running:
echo "Hello World"
For more complex scenarios, you can use a more advanced structure with separate arguments and variables:
# Define reusable variables here:
[vars]
common_args = ["Hello", "World"]
some_string = "Pancakes!"
[commands.greet]
run = "echo $common_args"
sudo = false
If you want to run them:
# combined execution
cutler exec
# or
cutler exec greet
If you scroll around the
GitHub Releases
section, you will see more "personal takes" which are randomly
written notes of mine to share some open thoughts.
Anyways, cutler is one of my favorite concurrent hobby projects
right now. If you'd like to support me, consider starring this
project! :3