← All projects

Dotfiles: One-Command Terminal Environment

Cover Image for Dotfiles: One-Command Terminal Environment

The problem

Setting up a new machine is painful. Install the terminal, configure the shell, set up the editor, install tools, configure themes, remember aliases. Every developer does this dance, and most lose hours getting things "just right" only to forget what they did when the next machine comes along.

I wanted to run one command and get my entire environment, exactly as I left it, on any machine.

What I built

An open source dotfiles repository managed with GNU Stow that installs and configures a complete terminal environment with a unified Catppuccin Mocha theme. One command, everything configured, idempotent and safe to re-run.

The journey

This started as a backup of my .zshrc. It grew into a curated replacement for nearly every default CLI tool.

What's inside

CategoryToolWhat It Does
TerminalGhosttyGPU-accelerated terminal (fastest on macOS)
ShellZsh + ZinitFast shell with async plugin loading
PromptStarshipGit, language, and time context in prompt
MultiplexertmuxSplit panes, persistent sessions
EditorNeovimFull IDE with LSP, autocomplete, fuzzy finder
NavigationzoxideSmart cd that learns your directories
File ManageryaziTerminal file browser with previews
HistoryatuinSQLite-backed searchable command history
Gitlazygit + deltaVisual git TUI + beautiful diffs

Modern CLI replacements

Every old command aliased to a faster, better alternative:

You TypeActually RunsUpgrade
lsezaIcons, colors, git status
catbatSyntax highlighting
rmtrashSends to trash (safe delete)
vimnvimNeovim with IDE features

Plus ripgrep (rg), fd, dust, sd, and btop installed under their own names to avoid breaking scripts.

What building this taught me

1. GNU Stow is elegantly simple

I tried symlink scripts, Ansible playbooks, and Nix. All overkill. GNU Stow does one thing: mirror a directory structure as symlinks. Each tool gets its own directory, stow toolname creates the links, stow -D toolname removes them.

dotfiles/
├── zsh/
│   └── .zshrc          → ~/.zshrc
├── tmux/
│   └── .tmux.conf      → ~/.tmux.conf
├── nvim/
│   └── .config/nvim/   → ~/.config/nvim/
└── starship/
    └── .config/starship.toml → ~/.config/starship.toml

No templating language, no dependency resolution, no abstractions. Just filesystem conventions.

2. Theme consistency matters more than individual tool choices

Having Catppuccin Mocha across every tool (terminal, editor, tmux, git diffs, file manager) creates a surprisingly cohesive experience. The tools themselves matter less than them looking and feeling like they belong together.

3. Idempotent installers prevent anxiety

The installer backs up existing configs before overwriting. Running it twice does the same thing as running it once. This seems obvious, but most dotfile setups fail on re-runs. Making it safe to re-run meant I actually ran updates instead of letting configs drift.

4. Aliasing carefully avoids breaking things

I alias ls to eza because nothing breaks. But I don't alias grep to ripgrep because shell scripts depend on grep's exact flags. The principle: alias interactive commands, leave scriptable commands alone.

The bigger realization

Developer tooling is personal infrastructure. The hours invested in a good terminal setup pay dividends every single day. But the real value isn't the tools; it's the reproducibility. Knowing I can go from a blank machine to my full environment in under 10 minutes removes friction from everything else.

What I would do differently

Add a machine-local config layer from the start. Some settings are universal (theme, aliases), but others are machine-specific (work vs. personal git email, proxy settings). I'd separate these earlier instead of manually editing after install.

References

Come argue with me about this.

I write up what I build, including the parts I got wrong. If something here is worth disagreeing with, I want to hear it.

© 2026 Cyrus David Pastelero. All rights reserved.

Built with Next.js, TypeScript & Tailwind CSS