An experimental nix expression as a nixpkgs overlay to package all macOS Homebrew Casks automatically.
- No homebrew installation needed; packages are fully managed by nix.
- Pure nix, package derivations; everything is type checked and it will give you an error when you specify an invalid package for example.
- Running most programs with
nix runwon't work, you'll have to build them first. - Some programs refuse to run from non-standard locations, since this is automatic there isn't a good way to fix it.
- There're about 700 casks without hashes, so you have to override the derivation attributes & provide a hash explicitly.
- Having several generations with this will take A LOT of disk space, so keep that in mind.
nix build github:BatteredBunny/brew-nix#blender
./result/Applications/Blender.app/Contents/MacOS/Blenderor declaratively
home.packages = [ pkgs.brewCasks.visual-studio-code ];Many casks do not come with their hash so you'll have to provide one explicitly.
home.packages = with pkgs; [
(brewCasks.marta.overrideAttrs (oldAttrs: {
src = pkgs.fetchurl {
url = builtins.head oldAttrs.src.urls;
hash = lib.fakeHash; # Replace with actual hash after building once
};
}))
];Explicitly choose homebrew cask variations (Quite a few casks have variations for different architectures or macOS versions). You can look up each cask's respective variations at brew.sh.
home.packages = lib.attrsets.attrValues {
vscode = (pkgs.brewCasks.visual-studio-code.override {variation = "sequoia";});
};home.packages = lib.attrsets.attrValues {
vscode = (pkgs.brewCasks.visual-studio-code.override {variation = "sequoia";}).overrideAttrs (oldAttrs: {
src = pkgs.fetchurl {
url = lib.lists.head oldAttrs.src.urls;
hash = lib.fakeHash; # Replace with actual hash after building once
};
});
};brew-nix is structured into 2 repos for modularity:
- The main repo
brew-nixcontaing the nix expression to parse cask data to nix packages. - Automated
brew-apirepo containing the brew casks summary information.
This has the benefit of being able to keep the git history of brew-nix clean, and giving the user the freedom to easily override the data used to generate the nix expressions and or update brew-api seperatly from brew-nix if needed.
Warning
brew-api input part is not optional. You should define your own brew-api input like below.
If you omit it, brew-nix will use a stale version of brew-api which is updated infrequently and may not work.
See examples/flake.nix.
# flake.nix
inputs = {
brew-nix = {
url = "github:BatteredBunny/brew-nix";
inputs.brew-api.follows = "brew-api";
};
brew-api = {
url = "github:BatteredBunny/brew-api";
flake = false;
};
};# home.nix
nixpkgs = {
overlays = [
inputs.brew-nix.overlays.default
];
};
home.packages = with pkgs; [
brewCasks.marta
brewCasks."firefox@developer-edition" # Casks with special characters in their name need to be defined in quotes
];