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.
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
Architecture: 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.toml
config.toml
(current directory)Generate and install shell completion scripts for your shell:
# 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
This command applies all settings from your config file and restarts necessary system services.
cutler status
Compares your configuration with current system settings.
cutler unapply
Removes all settings applied by cutler.
cutler reset --force
Resets every setting written in the config to factory defaults.
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
Snapshot file: 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 update the config file you previously prepared
cutler brew backup
# Now, to install from it:
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