Development

Dotfiles: Setup, Backup, and Productivity

Build your first dotfiles repository from scratch—setting up version control, creating modular configurations, and establishing installation workflows that make environment setup repeatable and shareable

Getting Serious About My Setup

This week I finally took the time to clean up, version, and share my dotfiles. I’ve been tweaking my terminal and development environment for a while, but after reinstalling macOS and forgetting half of what I had configured, I knew I couldn’t keep relying on muscle memory and scattered gists.

So I built a flat dotfiles setup with the basics: .aliases, .functions, .exports, and a .zshrc that sources everything. It’s not fancy, but it works. And most importantly, it’s versioned.

Dotfiles are those hidden files like .zshrc, .gitconfig, .vimrc that live in your home folder. They’re small, powerful, and totally personal. Treating them like code—stored in Git and pushed to GitHub—makes them portable and sustainable.

This post is part documentation, part time capsule. I’ll walk through what I’ve done, the tools I’m using, and how I plan to bootstrap a fresh macOS setup without panic next time.

One Level, Many Files

Instead of organizing by topic into subfolders like git/, zsh/, or system/, I kept everything flat. Here’s what my repo looks like:

~/.dotfiles/
├── .aliases
├── .functions
├── .exports
├── .gitconfig
├── .gitignore_global
├── .zshrc
└── install.sh

Everything is sourced manually from .zshrc:

source $DOTFILES/.aliases
source $DOTFILES/.exports
source $DOTFILES/.functions

I considered nesting things in folders like other people do, but for now, I prefer the simplicity of a single level. Fewer moving parts.

FileRole
.aliasesShorthand commands
.exportsPATH and environment variables
.functionsCustom shell functions
.zshrcMain config, sources everything else
install.shSetup script to symlink everything

Keeping it simple makes it easier to tweak and grow over time.

My Shell: Zsh with Oh My Zsh

I’m using Zsh as my shell, and it already feels like a big upgrade from bash. Better completions, shared history across tabs, and easier customization.

To manage Zsh config, I installed Oh My Zsh. It takes care of plugin management, themes, and provides sane defaults. In my .zshrc, I’m currently using:

plugins=(git ruby bundler)
ZSH_THEME="robbyrussell"

One thing I like about Oh My Zsh is how easy it is to browse others’ setups and borrow ideas. It also works nicely with Mackup (which I’ll get to soon).

My .zshrc is short and readable:

export DOTFILES="$HOME/.dotfiles"
source $DOTFILES/.aliases
source $DOTFILES/.exports
source $DOTFILES/.functions
PluginWhat It Helps With
gitGit shortcuts & completion
rubyRuby-related helpers
bundlerBundler workflow

Zsh became something I genuinely enjoy improving.

Bootstrap with install.sh and Mackup

I added an install.sh script to automate setup. It creates symlinks from my dotfiles to the home folder and installs Oh My Zsh if it’s missing:

ln -s $DOTFILES/.aliases ~/.aliases
ln -s $DOTFILES/.zshrc ~/.zshrc

It’s simple, but it saves time. I still install Homebrew manually, but I’m thinking of adding a Brewfile soon.

To sync application preferences like Terminal.app and iTerm2, I’m using Mackup. It stores preferences in Dropbox and symlinks them on new machines:

mackup backup
mackup restore
ToolPurpose
install.shLocal symlinks & config setup
MackupApp preferences backup/sync

Together, these steps make a fresh mac setup far less intimidating.

Sharing and Learning from Others

Publishing my dotfiles on GitHub felt weirdly satisfying: helmedeiros/dotfiles. It’s not a framework or anything fancy, but it’s mine—and that’s the point.

I’ve already started checking out other people’s dotfiles for inspiration. Some have clever functions, zsh themes I didn’t know about, or better ways to manage plugins. It’s a low-key way to keep learning.

Forking dotfiles isn’t copying—it’s collaborating. And having my own repo means I can try stuff and roll it back without fear.

Things I’ve learned:

  • Use .local files for machine-specific secrets
  • Ignore Dropbox and system files with .gitignore
  • Document everything, even aliases

This is the most fun I’ve had with terminal config since switching to Zsh.

Looking Ahead

I’m just getting started, but already dotfiles have made my setup more reliable, portable, and fun to work on.

Still on my TODO:

  • Add a Brewfile for Homebrew packages
  • Auto-install Homebrew from install.sh
  • Sync Terminal.app preferences with Mackup
  • Write a real README

It’s not done, but it’s mine. And now it’s versioned.

Check it out on GitHub →