Kelp – simple replacement for homebrew on macOS
67 comments
·May 19, 2025felipellrocha
rollcat
I feel you. I could write an essay about Homebrew, instead I'll list the other alternatives. There's pkgsrc[1], MacPorts[2], and Nix[3]. In my experience, none of these are as comprehensive, and each comes with its own quirks. Worth a try, might work for you.
[1]: https://www.pkgsrc.org/, https://pkgsrc.smartos.org/install-on-macos/
folkrav
It’s a bit surprising to hear nix described as “not as comprehensive”, considering they’ve basically built a whole OS around it, but I’m curious about your take on this specifically.
rollcat
Mostly the prebuilt binary packages, "casks". Out of 13 casks I currently have installed, only 6 are in nixpkgs. Some are built for Linux (e.g. Ungoogled Chromium), but not for Mac.
I've also cherry-picked a couple non-cask packages that I would dearly miss: dark-notify, ddcctl, displayplacer, the kinda stuff you need to "fix" macOS.
Etheryte
Add this to your shell profile:
export HOMEBREW_NO_AUTO_UPDATE=1
export HOMEBREW_NO_ANALYTICS=1
Why these aren't the defaults, I don't know.rplnt
There's an explanation somewhere as to why. It has to do with "not breaking" stuff relying on it. So I guess it only answers "why we won't fix it".
Anyway, I don't think this is enough. Or I guess it only works to stop the trigger during install? I have the NO_AUTO_UPDATE set up, and recently needed to update (or upgrade? who knows) a single package and it somehow ended up with Homebrew working for over two hours. I saw it installing python at least two times.
nuxi
That's not a proper explanation IMO. The thing is - all these settings are introduced "quietly" as new defaults and you have to opt out. So one day you decide to upgrade a package, brew updates itself, and then starts doing all these things that weren't present before (and are most likely not needed at all). It's very annoying, and a dark pattern to say the least.
nuxi
Maybe also these, to limit other annoyances:
export HOMEBREW_NO_EMOJI=1
export HOMEBREW_NO_ENV_HINTS=1
export HOMEBREW_NO_INSTALL_CLEANUP=1Etheryte
Out of curiosty, why the last one? If you update a package, generally you don't need the old version, why would you keep it around? I can imagine this being useful in some edge cases, but as a global setting, I'm not so sure.
wwweston
because the fundamental ethos of homebrew and a lot of “modern” tools is to prioritize the conservation of attention. Aka “don’t make me think“ which, ironically, appears to often be adopted, not only on behalf of users, but at a meta level, so things which might well deserve prompts are simply pre-configured.
some charity is due here, because this is the culture, and also because for any software tool of sufficient complexity, there is always more to think about than attention to give. But the culture could use more improvement and reflection here.
mac9
I have found `mise` to be a pretty good way to install tooling https://github.com/cybernetics/mise-en-place
drcongo
I've been using Jetify's Devbox instead of Homebrew for the last few months, with Mise for project specific installs. I've mostly found this to be much better than Homebrew, but Devbox has some flakiness. Working with Mise has been excellent though, and led me to finding `Ubi` [0] (it's a backend for Mise when needed) which seems to be doing roughly the same thing. Beyond this scratching your itch (which is always the best reason to make something), does it have any differentiators from Ubi?
c-hendricks
Curious why you need to use mise on top of devbox, I thought they both filled the same niche? They both let you specify dependencies for a directory, and optionally install tools globally.
drcongo
It's a good question, and to be honest, I occasionally get confused about what tools are installed with what tool manager (especially as there's also `uv tool` in the mix too).
Devbox for me hasn't clicked as a project-level tool manager, mostly because it doesn't really play nicely with the way our projects are set up causing a lot of shell issues for other team members. Mise has been trouble free on that front though, works perfectly for everyone on the team, and has some nice runner type functionality too (like `just` or `make`). If you've not tried Mise, I recommend giving it a go, it's really nice.
c-hendricks
We recently switched to Mise, agreed it's been pain free. But in looking at options I was mulling over devbox so figured I'd ask.
I did notice that devbox seems to be able to generate a file for direnv, maybe that would help?
disintegrator
If you limit yourself to common programming languages and single-binary programs (e.g. ones written in Rust/Go) then I cannot recommend Mise enough to you. Absolute bliss compared to homebrew, asdf and other projects especially if you want multiple versions of tools in different projects.
suralind
Thanks for this, mate! I’ve been adopting asdf for some time now, but you are 5 years ahead!
lambdaba
Nix (and nix-darwin for persistent config) already does the job for non-GUI apps better than anything else could (its catalog is unmatched), and homebrew (also available in nix-darwin) handles GUI apps.
cosmic_cheese
I doubt nix is ever going to enjoy popularity on the scale of Homebrew due to its differing model. People are too used to doing a simple “x install y” without any backing configuration or flakes or anything like that.
Personally speaking I might learn it at some point but for now nix's friction/overhead isn’t proportional to the occaisional inconvenience with traditional package managers.
lambdaba
I think Nix has a marketing issue as it goes so deep. But if you're going to consider it only as an alternative to homebrew, you don't have to know anything aside from different CLI invocations: `nix-shell -iA <package>` to install, and maybe a step up with `nix-shell -p <package> --run <cmd>` to run without installing. You don't have to use nix-darwin or managing configs and the Nix language at all.
cosmic_cheese
That’s still more to remember than `x install y`, which might sound trivial but that’s the exact kind of friction that impedes adoption.
Maybe it would make sense for nix to add a mode that basically aliases that first command to `nix install <package>`.
norman784
I tried nix a few times in the past and it has too many issues on Mac (never got it working), also the learning curve is too steep, maybe I'll give it a try again.
koito17
Before getting a new MacBook, I was using MacPorts since Homebrew had several problems, including what the GP mentioned. For over a year now, I have used home-manager with Nix. Nixpkgs has the "important" subset of GUI programs that I use. Major exception to this is OrbStack, but there is a homebrew-to-nix converter that I use to handle that.
I briefly experimented with nix-darwin, but concluded that it was overkill for my needs. Home Manager also has the benefit of not being Mac-specific (so plenty of questions and examples exist online).
Most importantly, I no longer have to mentally prepare myself when updating Mac OS. If I recall correctly, both MacPorts and Homebrew require the user to re-install all installed packages after a major version update, but this problem doesn't really exist on Nix. It's also nice being able to store flakes in a Git repository and effortlessly rollback changes or replicate a whole development environment across several machines.
lambdaba
I'm interested in how you use that homebrew-to-nix converter, if you have links to configs or can describe it briefly!
I agree that nix-darwin is a bit overkill, I mainly use it for the homebrew integration, but I think so is home-manager, I don't keep user app configs in Nix since they are never exhaustive and more effort than it's worth.
jokethrowaway
Coming from nixos, I didn't want to use brew but I found nix-darwin to be poorly documented and supported.
Several upgrades wrecked havoc on my system, a lot of things didn't work as expected, I had to package a lot of stuff; eventually I just bit the bullet and started using homebrew
null
lambdaba
I sort of get what you're saying and I've had a few sporadic issues myself, once or twice I had to reinstall (although might have been my mishandling), but overall I can't see a better solution than this. Plus I can share the configs with Linux.
righthand
Still a macports user, however I used homebrew for a short period. What is the benefit here from homebrew? Compile speed?
steeleduncan
It isn't very clear on that, but I think it is a way of automatically downloading binaries from Github releases. If so, that wouuld work well in some cases, and poorly in others
geerlingguy
Part of the appeal of Homebrew (which is also a blessing and a curse from time to time) is the fact that packages are maintained, meaning people make conscious decisions when to pull in updated versions or stick with an older release, and have some logic behind all that mess.
There are always tradeoffs with any packaging system, no matter how transparent/simple.
asdff
Hombrew just pulls the latest versions of everything I have installed whenever I try and install one new unrelated thing. The defaults are kind of annoying in that:
" Unless $HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK is set, brew upgrade or brew reinstall will be run for outdated dependents and dependents with broken linkage, respectively.
Unless $HOMEBREW_NO_INSTALL_CLEANUP is set, brew cleanup will then be
run for the upgraded formulae or, every 30 days, for all formulae."
However I don't think even these flags are sufficient. I think to really ensure nonbreaking behavior you have to use a brew pin command on each and every formula you have installed on the system.Really annoying defaults considering brew is a developer facing program not a consumer facing program where the tradeoff between security and functionality makes more sense.
This is why I still reach for conda whenever possible. I am at least prompted before 100 things are installed.
atmosx
I’ve been using MacPorts for over 10 years now. As far as I know, version stubbing isn’t supported—you have to upgrade regardless. Another feature I find missing is the ability to sync installations across multiple systems. For example, if I install pkg1 on system1, I’d like it to automatically be available on system2 as well.
jonhohle
I think having venv like project installations would be nice as well. Let me write a Portfile for my current repo, use the system package cache if available, otherwise install locally. With clones it wouldn’t even require much extra space.
chin7an
I've found bin[0] to be great (and simple) to manage binaries released via github, specifically those tools not already available via macports and ones for which I'm too lazy to write a portfile for. Seems like kelp is attempting to replace this combination with one tool.
oulipo
Shouldn't we all move to `mise-en-place` https://mise.jdx.dev/ as it is a kind of meta-package provider which works with a lot of those packaging systems?
clayhacks
I recently started poking through more of mise and it’s so nice. I don’t know if it covers homebrews gui installs, but everything cli I’m trying to install with mise these days
pomdtr
I personally use eget for this usecase. Might be worth a look: https://github.com/zyedidia/eget
JadeNB
Without knocking this tool, which I haven't tried, there seems to be something about the inability of a package manager to stay simple—MacPorts was the simple (or at least "it just works") replacement for Fink, Homebrew was the simple replacement for MacPorts, ... I don't know what came before Fink, because that's what was used when I first started using macOS. That was under Tiger, relatively early in the OS X days, so maybe Fink was actually the first?
droelf
We've been building `pixi` and more specifically "pixi global" as a replacement for homebrew, but based on Conda packages. It creates a single virtual environment per globally installed tool (deduplication works by hard-linking) and then links out the binaries from the isolated environments to a single place.
It's written in Rust and quite fast: https://pixi.sh
e12e
Packaging (non)story is interesting:
> What if the package I want is not on github releases?
Easy. Just add the http(s) link to the binary
ie:
kelp add -r https://releases.hashicorp.com/terraform/0.11.13/terraform_0... hashicorp/terraform
natemcintosh
Seems like this space is really heating up the last few weeks. The rust based tool sps[0] is also looking to fill this niche, though perhaps being much closer to brew's system.
nikisweeting
the original homebrew creator made this new one too I think: https://github.com/pkgxdev
msephton
Kelp is several years old already
Last week I had to download a dependency on Homebrew. It had been a while since I had downloaded anything as my personal device had been stable for a long time, so dependencies were out of date. Well, homebrew decided to upgrade EVERYTHING before it started the new download, all without my prompt. An hour later, I was met with a device that was full of issues, and it took me an entire week to fully get back to normal. Not saying I hate homebrew, but I welcome any competition in this space.