A few coworkers were happy to copy/paste the .zshrc file that I shared and begin using it. A few others wouldn’t because they knew that I didn’t know what some of it did. Fair enough.

After a few attempts to convert them and getting nowhere, I opted for a different approach.

First, I reorganized my .zshrc configuration, which involved breaking it up into a collection of smaller files. My thinking here was that this would a) help me better understand how all of these bits worked while b) helping educate my peers when they went to read the code.

Pre-empting their next question, “how do I get this to work on my machine?”, I drafted the first setup instructions.

Most importantly, I packaged all these files into a shiny new git repository. I figured that if I tossed it up on Github, my peers would be able to collaborate with me on improving it.

While not a huge leap, it was a step above inviting people to copy/paste a text file from Pastie.

On Aug. 28th, 2009, Oh My Zsh was born.

One of the first public versions of Oh My Zsh. (view on github)

…but, wait a minute!! Where are the themes? Where are the plugins? Installation scripts? Logo?

This might come to a surprise to most of the Oh My Zsh user base, but none of those were features that I had considered. My goal with the project was not to build a framework for maintaining Zsh configurations but to share my own config with my coworkers so that they’d use Zsh.

Patrick (left) and Travis (right)

Within a day of sharing it with all of my coworkers, everyone at Planet Argon had migrated from Bash to Zsh.

Victory! …or so I thought.

The first feature request came in the next day.

“How do I customize MY prompt?”

Two coworkers asked me how they could customize their prompt. They wanted to change the colors and the information that was displayed.

What the hell!? Wasn’t my prompt compelling enough for them? So nitpicky. ;-)

I pointed to the prompt.zsh file and said they could modify that.

Quickly, this became an issue as they now had their own version of that file. As a result, this would add some complexity if we all wanted to share some of our shortcuts and features as we’d have conflicts to deal with.

Hmm…

So, a day after first announcing Oh My Zsh on my blog, I began introducing the initial concept of themes.

Introducing the ‘famous’ robbyrussell theme to the world.

Meanwhile, I got my first external pull-request from Geoff Garside to add a few aliases for TextMate. (Notice how that went straight into a catch-all aliases.zsh file)

A day later, another theme was sent over. Groovy, I better add a link on the README to see some screenshots on the wiki.

Within a month, we had a dozen themes contributed to the project.

This began to be a really popular aspect to Oh My Zsh and we had to start hitting the brakes on accepting themes once we passed 100. (we’re currently at ~140 and rarely accept new ones)

Simplifying setup with an installer

It occurred to me that the initial setup was requiring people to run a handful of commands. Rather than asking people to re-type and/or copy/paste a handful of commands, I felt that it would be more efficient for both parties (as it’d reduce the questions my coworkers would have when they hit a problem and/or skipped a step).

The first tweet to mention Oh My Zsh?

An installer was born.

The initial installer script (view on github)

My initial thoughts were to handle save folks a few steps by automating the installer. If everyone ran the same commands, then we could cut down on human error (skipping a command, typos, etc.). I also wanted to be mindful that people might be switching from either Bash or an existing cobbled-together Zsh configuration. To help them with a possible switch back to the previous shell, we made a backup of their original configuration file. Finally, we’d switch their default shell to Zsh.

“Hooray! Oh My Zsh has been installed.”

Oh, right. How will people be able to stay updated with the new changes to the project?

The next day, I added an upgrade script that strolls over to the Oh My Zsh directory, fetch updates from the git repository, and returns you to your previous working directory.

The initial upgrade script (view on github)

Far from rocket science.

About three weeks later, it became obvious that my coworkers weren’t manually keeping up with all of the new updates to the project. Rather than reminding them to do that from time-to-time, I added functionality that would periodically prompt the user to check for updates.

Up until this point, this felt like the most complicated piece of code in the project. I wish that I could remember who gave me the great idea to use an epoch value here.

The initial auto-updater (view on github)

In my opinion, it was also the turning point for the project.

While a handful of people were using it, this functionality would allow nearly every user to stay up-to-date on project changes and more importantly, stay engaged. When they would run the updater, they’d see a list of files changed and that would, subtly, introduce them to new features… a la, “I wonder what that theme looks like..”

Sadly, not everyone has been a fan.

Despite a few vocal opponents over the years, I’ve stood by my decision to keep this as a default setting.

Back in 2012, we made a change to reduce the frequency of auto-update prompts by 50%.

The auto-update has allowed us to ship new features, performance improvements, and bug fixes without relying on everyone manually doing it. I’m convinced that this feature has helped keep the community engaged.

This Muffin Needs Candy

While the project was attracting a lot of themes, I really felt like the project could benefit from branding.

My solution? Ascii art.

I have no idea what prompted the git commit message.

My thought process here was… sure, you get a bunch of useful shortcuts and themes when you begin using Oh My Zsh, but I really felt like the first impression after the installer would run was an opportunity to delight new users.

Candy sprinkles on the muffin…as it were. (I have no recollection of why I wrote that commit message back then. The reference is lost on me.)

What the update script currently displays.

People have been asking me to print shirts with the ascii art for quite some time. (we’ll likely do that this summer — follow us on twitter)