[HN Gopher] Speeding up my ZSH shell
       ___________________________________________________________________
        
       Speeding up my ZSH shell
        
       Author : saikatsg
       Score  : 115 points
       Date   : 2025-07-20 15:51 UTC (7 hours ago)
        
 (HTM) web link (scottspence.com)
 (TXT) w3m dump (scottspence.com)
        
       | srvmshr wrote:
       | I discovered this issue 2-3 years ago. On slightly older
       | machines, there was a palpable startup time. My fix was going
       | through OhMyZSH and stripping away all the parts that I felt
       | unnecessary (I call this my "leanZSH" and its considerably
       | lighter version of OMZ.) It doesn't track upstream, and I
       | manually update the plugin directory once in a while.
       | Surprisingly OhmyZSH is pretty modular and doesn't break easily.
       | 
       | [Not the best hackjob out there but here it is:
       | 
       | https://github.com/gradientwolf/leanzsh
       | 
       | If you want to update it just copy over the latest `plugin/`
       | folder from OMZ repo. You can get rid of all the plugins you dont
       | want, as well as the themes. It somehow works]
        
         | SamDc73 wrote:
         | I think you're better off switching to https://starship.rs
         | 
         | I did try to do my whole zsh config/theme from scratch, but it
         | did take some time and lot of small features here and there
         | were no worth the effort (like python version, vevn, and such)
         | so I just switched to starship which is very fast and easy to
         | use
        
           | lompad wrote:
           | Why not just use fish at that point? It's been rewritten in
           | Rust too.
           | 
           | To me personally, oh-my-zsh and similar projects feel like a
           | worse version of the stuff fish brings by default.
        
             | Jubijub wrote:
             | Fish is awesome, but there are times you need POSIX/ bash-
             | like shell syntax
        
               | ewuhic wrote:
               | Then you open bash and get POSIX and not bash-like, but
               | bash.
        
         | MillironX wrote:
         | You can use Antidote to selectively load the parts of OhMyZsh
         | you need - https://github.com/getantidote/use-omz
         | 
         | My own usage: https://code.millironx.com/millironx/nix-
         | dotfiles/src/commit...
        
       | rezmason wrote:
       | Aha! Now I know that nvm was slowing my shell startup down. Now
       | I've reconfigured .zshrc to lazy-load nvm, and everything's
       | snappy:                 zstyle ':omz:plugins:nvm' lazy yes
        
         | saikatsg wrote:
         | Cool! Also, there's a zsh wrapper for nvm:
         | 
         | https://github.com/lukechilds/zsh-nvm?tab=readme-ov-file#laz...
        
         | satvikpendem wrote:
         | Just use fnm, I like it much better
        
         | dcre wrote:
         | Same. I switched to fnm.
        
         | Zizizizz wrote:
         | You should try switching to mise. I tried fnm too which was an
         | improvement but mise does the same as fast and supports
         | essentially every language
        
       | mcc1ane wrote:
       | https://github.com/romkatv/powerlevel10k?tab=readme-ov-file#...
        
         | satvikpendem wrote:
         | Sadly it's essentially discontinued
        
           | trallnag wrote:
           | I'll continue using it until the core features like instant
           | prompt and transient prompt start to break or I run into bugs
           | that I can't live with
        
         | jimbru wrote:
         | this is the answer
        
       | WhyNotHugo wrote:
       | Oh-my-zsh has a lot of cool and handy features, but it is a huge
       | and complex beast. Personally, I only cared about 3-4 features,
       | so I simply removed it and sought out how to enable those
       | features alone.
       | 
       | Additionally, a lot of functionality which I wanted wasn't there
       | in OMZ, so my setup had a lot of custom bits anyway.
       | 
       | My zshrc, for reference:
       | https://git.sr.ht/~whynothugo/dotfiles/tree/269248912920d25e...
        
         | bravesoul2 wrote:
         | What's with the emoji alias?
        
       | RGBCube wrote:
       | From the post, it seems like ZSH tries to update on every shell
       | spawn:                  DISABLE_AUTO_UPDATE="true"
       | 
       | WTF? Even if we ignore the crime of non-critical software
       | updating itself, the fact that it does it on every start instead
       | of every day or week is insane.
       | 
       | I do not want my shell sending network requests to odd servers
       | without explicit action from me, thanks.
        
         | c-hendricks wrote:
         | oh-my-zsh, not zsh
        
         | slacktivism123 wrote:
         | >it seems like ZSH tries to update on every shell spawn
         | 
         | Learn your tools first, not bloated frameworks. There's a gulf
         | of difference between vanilla zsh and this:
         | 
         | >Community-driven (with 2,400+ contributors) framework for
         | managing your zsh configuration
         | 
         | >Includes 300+ optional plugins (rails, git, macOS, hub,
         | docker, homebrew, node, php, python, etc)
         | 
         | >140+ themes to spice up your morning, and an auto-update tool
         | that makes it easy to keep up with the latest updates from the
         | community
        
           | RGBCube wrote:
           | Sorry, I meant oh-my-zsh. I know that the core shell doesn't
           | update.
           | 
           | I still think it's bad. You shouldn't rely on a million
           | different package managers, just 1 is enough. (2 if you are
           | feeling spicy: Flatpak)
        
             | Arrowmaster wrote:
             | That's what ZSH has turned into. Every new user installs
             | OMZ because that's what the Internet tells them to do. Then
             | their shell config turns into a huge mess.
             | 
             | So half the users are using OMZ with a bloated slow config
             | and the other half are reinventing new config managers
             | every year because of how terrible OMZ has become. And
             | constantly churning through them as they keep getting
             | abandoned.
             | 
             | I've been happily using zsh4humans for years but will need
             | to find a replacement at some point as it's now going
             | unmaintained too.
        
       | jasonjmcghee wrote:
       | Thanks - that pushed me to profile, and as others mentioned nvm
       | was the biggest culprit, then powerline status, which i swapped
       | to powerline-go. nice and snappy startup time now.
        
       | stouset wrote:
       | Fish shell with starship. You will never look back.
        
         | marliechiller wrote:
         | Funnily enough, the startup delay of oh-my-zsh is exactly what
         | prompted me to try out fish and eventually starship on top. I
         | have not looked back as you say!
        
         | rtkaratekid wrote:
         | I started using fish on a dare from a coworker who thought it
         | would be funny. Joke's on them, it's been five years and I
         | still love it. Started using starship this year and agree with
         | you.
        
         | leosanchez wrote:
         | My fish config is maybe 5-10 lines just starship, zoxide,
         | direnv.
        
         | f311a wrote:
         | Fish is nice, but syntax difference is a no-go for me. I
         | frequently log into different servers that usually use bash.
         | 
         | I miss simple things like alias when I temporary want to assign
         | long commands to a shorter alias.
        
       | opk wrote:
       | I'd be rather skeptical about the "fix" of updating the
       | completion cache once a day only. Enabling oh-my-zsh already runs
       | `compinit` and it does so after changing the function path in
       | `fpath`. By running it again with a different `fpath` you
       | invalidate the previous cache - meaning it builds a fresh cache
       | twice every time you start zsh. If you use a plugin framework
       | that already runs compinit, simply don't run it again separately.
       | And make sure that `compinit` is only run after the final plugin
       | or whatever has finished changing `fpath`. If you get that right,
       | you'll only ever need to regenerate the cache when something
       | actually updates.
        
       | ivanjermakov wrote:
       | Oh-my-zsh is very bloated. You might not need it, since its most
       | used features can be implemented with zsh directly:
       | https://ianyepan.github.io/posts/moving-away-from-ohmyzsh/
        
         | jeffbee wrote:
         | OMZ should be classified under "supply chain attack as a
         | service". I can't believe anyone uses it.
        
       | raffraffraff wrote:
       | As a long time Linux + bash user I switched to zsh three months
       | ago when I was forced to use a Mac at a new job. In every
       | previous job I was able to insist on Linux, but this one is very
       | corporate. I decided not to fight it, except to install AltTab,
       | Karabiner, Rectangle and a script that detects which screen my
       | mouse is on so I can alt-tab through ALL the stuff on that screen
       | (sane XFCE / KDE behaviour).
       | 
       | I can't get used to the atrocious keyboard shortcuts but I have
       | gotten used to the "non-UK UK keyboard layout".
       | 
       | And zsh. I honestly don't know why I didn't just brew install
       | bash right from the start. Without even realising I was doing it,
       | I fought with this bloated bastard for 2 months before finally
       | asking what the fuck I was doing.
       | 
       | I sped up my shell by switching back to bash.
        
         | soraminazuki wrote:
         | What on earth are you talking about? zsh isn't bloated by any
         | stretch, nor is it any slower than bash in any meaningful way.
         | 
         | Chances are, like in the article, you installed oh-my-zsh, a
         | _third party_ configuration framework.
        
         | homebrewer wrote:
         | Pure zsh is alright, it's pretty much just bash with fantastic
         | autocomplete that usually provides short form documentation
         | right there along with the options. So no need to remember (or
         | look up) what -X -d -f stands for. Get rid of oh-my-zsh and
         | give the proper shell another chance.
        
       | Sparkenstein wrote:
       | I moved to fish 3 years ago, haven't noticed a difference till
       | date.
        
         | notnmeyer wrote:
         | you are wise and have good taste
        
         | cevn wrote:
         | Fish school represent
        
       | gjvc wrote:
       | make sure you haven't got too many plugins enabled (start with
       | zero and work up / enable them as needed)
        
       | soraminazuki wrote:
       | With articles like these popping up all the time, oh-my-zsh is
       | seriously harming zsh's reputation. It's giving the wrong
       | impression of zsh being slow and bloated.
       | 
       | zsh doesn't need configuration frameworks or plugins. All it
       | needs is a change in the default settings so that its powerful
       | completion works out the box. It currently needs more than ideal
       | amount of tweaks to the defaults, which is probably why people
       | flock to these frameworks.
        
         | hdjrudni wrote:
         | I don't want to spend ages figuring out which knobs to turn to
         | get a half decent shell. If there's an alternative to oh-my-zsh
         | that looks halfway decent, has that nice fzf integrated, and
         | the 'ghost text' history suggestions, then I welcome it!
        
           | alabhyajindal wrote:
           | You should try fish shell. Great user experience out of the
           | box, including history suggestions.
           | 
           | https://fishshell.com
        
             | cbarrick wrote:
             | The incompatible syntax of fish makes it a no go for me.
             | 
             | As an SRE, at my day job I often need to copy/paste
             | commands that are generated from a playbook.
             | 
             | Our playbooks use Bash, and in practice Zsh is compatible.
             | But a co-worker using fish often has to manually modify
             | commands before running, and I'm not about that life.
             | 
             | The problem with fish is mostly the different syntax for
             | setting variables and lack of heredocs. Sometimes the
             | string substitution differences come up too.
        
           | doubled112 wrote:
           | Once you have everything figured out, you just keep using the
           | config you have. It might be worth the investment. I stopped
           | using oh-my-zsh when I realized it was what was causing
           | multi-second delays on Raspberry Pis.
           | 
           | I think auto suggestions and syntax highlighting plugins can
           | be installed separately from oh-my-zsh.
           | 
           | I use starship for a better prompt, and it works on more
           | shells than just Zsh.
           | 
           | I also have Atuin installed to share history across machines,
           | and as a benefit the history search is a lot more powerful.
           | 
           | https://github.com/zsh-users/zsh-autosuggestions
           | 
           | https://github.com/zsh-users/zsh-syntax-highlighting
           | 
           | https://starship.rs
           | 
           | https://atuin.sh
        
           | soraminazuki wrote:
           | If zsh has its completion fully configured by default, there
           | will be no need for most people to turn knobs nor will it be
           | a "half decent shell." It'll be the _best_ shell, if it isn
           | 't already.
           | 
           | I wonder why ghost text history suggestions are popular
           | though, I'd rather not have it. Shell history search works
           | better, and I don't want my shell always showing me or
           | whoever else is looking at the screen random commands that
           | I've previously typed.
        
           | loeg wrote:
           | I don't know if it's still in vogue, but prezto exists.
        
         | varispeed wrote:
         | Out of curiosity, what is wrong with oh-my-zsh?
         | 
         | I use it and never had any issue. Am I missing out on
         | something?
        
           | soraminazuki wrote:
           | If it works for you, that's great. But people are installing
           | oh-my-zsh almost as if it's an official requirement of zsh,
           | run into bloat and performance issues, and goes off telling
           | everybody not to use zsh.
           | 
           | Some of the autocompletion settings set by oh-my-zsh are
           | useful. But apart from that, the majority of the code
           | consists of gazillions of random aliases and functions that
           | someone else needed. It pollutes the command namespace for no
           | good reason except maybe making users more wary of typos. The
           | last time I checked, sudo was aliased as "please", and I
           | can't find a single reason why that'd be useful.
           | 
           | oh-my-zsh also introduces a lot of churn, which is why it has
           | autoupdates. _Autoupdates_. The only time I needed to change
           | my configuration in vanilla zsh because of a change in zsh
           | was once or maybe twice over a span of 10+ years.
        
       | f311a wrote:
       | Did something similar recently as well. I did not notice any need
       | for plugins from day one of switching. Fzf can replace a lot of
       | plugins if you know how to use it.
       | 
       | Things like git branch name and virtual envs are handled by
       | starship.
       | 
       | My custom config is less than 10 lines now:
       | export HISTSIZE=1000000000       export SAVEHIST=$HISTSIZE
       | setopt EXTENDED_HISTORY       setopt autocd       autoload -U
       | compinit; compinit       source <(fzf --zsh)       eval
       | "$(starship init zsh)"       set -o vi
        
       | samgranieri wrote:
       | Ooh, bookmarked! My 11 year old zsh setup, which started from
       | YADR and has stuff from other places preserved in chezmoi is
       | starting to drag. Time to speed this up or just rip up and redo
        
       | bananapub wrote:
       | fwiw you can just use zsh4humans (as long as you promise not to
       | bother the author) and have all the things in omz that matter and
       | approximately zero startup time
        
       | jpmonette wrote:
       | Fish is the way to go! Used to be a fan of ZSH but also struggled
       | with performance issues. No performance issue with Fish! Only
       | issue might be plugins / some copy/paste bash stuff, but it's so
       | worth the performance.
        
       | massysett wrote:
       | The instant I saw the title I knew the post would be "I turned
       | off oh-my-zsh" or "I tweaked oh-my-zsh."
       | 
       | Yes zsh has a bunch of settings and dense documentation, and it
       | can be hard to understand. The problem with something like oh-my-
       | zsh is that now you have two things you don't understand, and
       | worse, when something doesn't work you don't know which one isn't
       | working or where to look.
        
       | Jerry2 wrote:
       | I switched to Prezto [0] because I found OMZ too slow. Prezto is
       | much faster out of the box and doesn't have a lot of things
       | enabled by default. Definitely give it a try if you find OMZ too
       | slow on your machine.
       | 
       | [0] https://github.com/sorin-ionescu/prezto
        
       ___________________________________________________________________
       (page generated 2025-07-20 23:00 UTC)