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
};
}))
];On x86_64, brew-nix tries to automatically choose the newest intel macOS variant available, that may not be correct though, in those cases it maybe be needed to manually override the cask variant chosen. 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
];