Skip to main
a head full of memes by
Timo Mämecke
Jump to navigation
· 4 minute read

Fish is a great shell that simplified my dotfiles

I’ve been a zsh user for a long time, though I’ve had a bit of a love-hate relationship with it. It’s cool once you get it configured, but there’s so much to configure, and from time to time things would just break or the shell would get annoyingly slow.

I started keeping track of my zsh config in a dotfiles repository, so I can roll back to a previous state if the shell suddenly gets slow or something breaks. The dotfiles cover more than just zsh, but zsh was the biggest part of it. After starting with oh-my-zsh many years ago, I tried several different plugin managers.

I ended up using Zinit with stow for a long time. It was fast and I could modularize my zsh config into local plugins. I liked the simplicity of stow, but Zinit has a syntax and concepts that I had to learn and remember: ice modifiers, turbo mode, some plugins are prefixed with “light”… after a while of not looking at it, I forgot how all that works. So in October 2024 I made a big change: I changed all of my dotfiles to be based on Nix with home-manager.


Nix with home-manager sounded cool in theory. What attracted me the most was that it adds a lot of good zsh tools with just a few lines of configuration. And when things break, it’s easy to roll it back to a previous state, and it should work exactly as it did before. However, it also quickly became annoying: every tiny change has to be reapplied, which always takes a few seconds. And since Nix takes full ownership of your tooling, everything has to be installed and configured through it. On top of that, I think it has a very steep learning curve that feels much more complex and mysterious. I started to feel the same struggles I had with Zinit: if I didn’t touch it for a while, I unlearned how it worked.

Then one day, when I had to make a change to my Nix config while I was in a somewhat stressful debugging situation, I couldn’t apply my Nix config anymore. I had no idea why, it was just a bunch of cryptic error messages that looked like compiler errors. After some googling, I learned that it needed some major dependency updates first, which caused breaking changes to the configuration, which I then had to google again.

Nix had to go. When shit hits the fan, I can’t risk not knowing how to change my system configuration, or not being able to install or update tools. It’s just so much unnecessary frustration. Even though I liked how home-manager comes with many batteries included, I just don’t want to learn the language and behavior of something that adds a layer of complexity between me and my shell configuration.


What now? Back to Zinit? I also heard some good things about the fish shell. So when I got rid of Nix, I thought this might be a good chance to try out fish after all this time with zsh.

And the fish experience is great! It’s fast and comes with so many batteries and minimal configuration. Suggestions, completions, syntax highlighting, autocomplete—it all works right out of the box. I don’t have to add so much stuff to my dotfiles that I won’t understand in a few months. And because there’s a lot less configuration, I don’t need a management tool to tame my shell configuration.

And with all that already included, it’s easy to add my usual tooling workflows. Besides my custom git aliases, I make heavy use of fzf, mcfly, navi, thefuck, and often rely on information from the starship prompt, all of which were quick to add and configure for the habits that are ingrained in me after so many years of using zsh.

I’m back to using stow again to link files to my home directory. I’m just installing all the tools with brew and mise. And all the config, including fish, is neatly stored in its corresponding ~/.config directory. Everything is nice and modular, with no additional tools required, just conventions. And whenever I need to change something, I feel confident that I know what to do.

If you would like to take a look, here’s my timomeh/dotfiles repository.