Todos los artículos

// Construir con IA sin perder el control

Dotfiles: El secreto para ser productivo en tu entorno de desarrollo

Descubre cómo los dotfiles pueden transformar tu flujo de trabajo, ahorrarte horas de configuración y mantener tu entorno consistente entre máquinas.

29 de mayo de 202613 min de lectura

Introducción

¿Cuántas veces has configurado tu entorno de desarrollo desde cero? Instalar herramientas, configurar aliases, personalizar tu editor, ajustar tu shell... y luego, al cambiar de laptop o servidor, volver a empezar desde cero?

Los dotfiles son la solución a este problema recurrente. Son archivos de configuración que viven en tu home directory y controlan casi todo en tu entorno: tu shell, tu editor, tus herramientas de Git, tus alias personalizados.


¿Qué son los Dotfiles?

Los dotfiles son archivos de configuración ocultos (porque empiezan con un punto .) que viven en tu directorio $HOME. Cada sistema Unix-like (Linux, macOS) los utiliza para configurar:

  • Shells: .zshrc, .bashrc, .zprofile
  • Editores: .vimrc, .config/nvim/, .config/emacs/
  • Git: .gitconfig, .gitignore_global
  • Tmux: .tmux.conf
  • SSH: .ssh/config
  • Herramientas: .config/starship.toml, .config/fzf/, etc.

Ejemplo típico de estructura de dotfiles

bash
~/
├── .zshrc           # Configuración de Z shell
├── .gitconfig       # Configuración global de Git
├── .vimrc           # Configuración de Vim
├── .tmux.conf       # Configuración de Tmux
├── .config/
│   ├── nvim/        # Configuración de Neovim
│   ├── starship.toml # Prompt personalizado
│   └── fzf/         # Fuzzy finder config
└── .ssh/
    └── config       # Configuración de SSH

¿Por qué deberías tener Dotfiles?

1. Consistencia entre máquinas

Cuando tienes dotfiles versionados, tu entorno es idéntico en:

  • Tu laptop personal
  • Tu máquina de trabajo
  • Servidores VPS
  • Contenedores Docker
  • VMs de desarrollo
bash
# Sin dotfiles
$ git status
fatal: not a git repository (or any of the parent directories): .git)

# Con dotfiles (alias personalizado)
$ gst
On branch main
Your branch is up to date with 'origin/main'.

2. Setup en minutos, no horas

Imagina cambiar de laptop. Sin dotfiles:

  • 2-3 horas de instalación
  • 30-60 minutos de configuración
  • Documentación que olvidaste dónde guardaste

Con dotfiles:

bash
# Clone e instalación automática
git clone https://github.com/kr0nicas/dotfiles.git ~/dotfiles
cd ~/dotfiles && ./install.sh
# Listo en 5-10 minutos

3. Productividad diaria

Los dotfiles incluyen:

  • Aliases que ahorran tiempo
  • Funciones personalizadas
  • Integraciones de herramientas
  • Prompt informativo
bash
# Sin alias (12 caracteres)
git status --short

# Con alias (3 caracteres)
gst

# Sin función personalizada
git add -A && git commit -m "Update" && git push

# Con función personalizada
gacp "Update"

4. Aprendizaje y documentación

Tu repo de dotfiles es documentación viva. Cuando olvidas cómo configuraste algo, está ahí. Cuando alguien pregunta "¿cómo tienes tu prompt tan bonito?", le pasas el link a tu repo.

5. Respaldo y recuperación

Si pierdes tu laptop o corrupte tu disco:

bash
# Recuperación completa
git clone https://github.com/kr0nicas/dotfiles.git ~/dotfiles
cd ~/dotfiles && ./install.sh
# Tu entorno está restaurado

Desventajas y desafíos

1. Curva de aprendizaje inicial

  • No sabes qué archivos versionar
  • No sabes cómo manejar secrets (API keys, tokens)
  • Configuraciones específicas del sistema (paths, hardware)

Solución: Usa archivos separados para secrets y configs por máquina.

2. Mantenimiento y actualización

  • Conflicts cuando actualizas en una máquina y no en otra
  • Versiones diferentes de herramientas
  • Configuraciones obsoletas

Solución: Usa branches por entorno o archivos de configuración condicional.

3. Privacidad y seguridad

  • Puede haber información sensible en tus configs
  • URLs internas de tu empresa
  • Tokens de servicios

Solución:

  • Nunca commits secrets
  • Usa .gitignore_global para archivos sensibles
  • Usa variables de entorno para secrets

4. Diferencias entre sistemas

  • macOS vs Linux (comandos diferentes)
  • Linux distros (Ubuntu vs Arch)
  • Diferencias en paths y paquetes

Solución: Usa detección de OS en tu setup script.


Estructura recomendada para tu repo de Dotfiles

1. Directorio raíz

bash
dotfiles/
├── .zshrc              # Configuración de Z shell
├── .zprofile           # Configuración de login shell
├── .gitconfig          # Configuración global de Git
├── .gitignore_global   # Ignorados globales de Git
├── .tmux.conf          # Configuración de Tmux
├── .config/            # Configuración de apps XDG
│   ├── nvim/           # Neovim
│   ├── starship.toml   # Prompt personalizado
│   └── fzf/            # Fuzzy finder
├── install.sh          # Script de instalación
├── setup.sh            # Script de configuración
├── README.md           # Documentación
└── LICENSE             # Licencia (MIT recomendado)

2. Script de instalación inteligente

bash
#!/bin/bash
# install.sh - Instalación automatizada de dotfiles

set -e  # Exit on error

# Detectar OS
if [[ "$OSTYPE" == "darwin"* ]]; then
    OS="macos"
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
    OS="linux"
else
    echo "❌ OS no soportado: $OSTYPE"
    exit 1
fi

echo "🚀 Instalando dotfiles en $OS..."

# Crear symlinks
ln -sf ~/dotfiles/.zshrc ~/.zshrc
ln -sf ~/dotfiles/.gitconfig ~/.gitconfig
ln -sf ~/dotfiles/.tmux.conf ~/.tmux.conf

# Configurar directorio .config
ln -sf ~/dotfiles/.config/nvim ~/.config/nvim
ln -sf ~/dotfiles/.config/starship.toml ~/.config/starship.toml

# Instalar dependencias si no están presentes
if ! command -v starship &> /dev/null; then
    echo "📦 Instalando starship..."
    curl -fsSL https://starship.rs/install.sh | sh
fi

echo "✅ Dotfiles instalados correctamente"

3. Manejo de secrets

bash
# .zshrc (versión pública)
# Configuraciones compartidas
export EDITOR="nvim"
export LANG="es_ES.UTF-8"

# Cargar secrets si existen
if [[ -f ~/.zshrc.local ]]; then
    source ~/.zshrc.local
fi
bash
# .zshrc.local (NO versionado, .gitignore)
export GITHUB_TOKEN="ghp_xxxxxxxxxxxxxxxx"
export AWS_ACCESS_KEY_ID="AKIA..."
export AWS_SECRET_ACCESS_KEY="xxxxxx"

Tiempo que ahorras (estimación real)

Sin dotfiles

TareaTiempo estimado
Instalar herramientas base45 min
Configurar shell (aliases, funciones)30 min
Configurar Git15 min
Configurar editor60 min
Configurar Tmux20 min
Configurar prompt15 min
Configurar SSH10 min
Total3h 15min

Con dotfiles

TareaTiempo estimado
Clonar repo1 min
Ejecutar install.sh3 min
Configurar secrets (opcional)5 min
Total9 min

Ahorro: 3h 6min (~95% menos tiempo)

Ahorro diario

AcciónSin aliasCon aliasAhorro por uso
git status12 caracteresgst (3)9 caracteres
git add -A && git commit -m "msg" && git push56 caracteresgacp "msg" (9)47 caracteres
git checkout -b feature/branch32 caracteresgcb feature/branch (19)13 caracteres

Ahorro acumulado al día: ~500-1000 caracteres ~ 2-5 minutos

Ahorro anual: ~15-25 horas


Mi repositorio de Dotfiles

Mi configuración personal está versionada en kr0nicas/dotfiles en GitHub.

Antes de nada, una aclaración honesta: esta sección describe el repo tal y como es hoy. Cuando publiqué este post por primera vez describía otra cosa —un .zshrc en la raíz, un setup.sh y Oh My Zsh— y ninguna de esas tres cosas existe ya. Reconocerlo y corregirlo sale más barato que dejar la descripción vieja ahí, y es exactamente el problema del que tratan las otras dos partes de esta serie: unos dotfiles que se usan de verdad no se quedan quietos, y lo que se escribió sobre ellos envejece más rápido que ellos.

Características de mi configuración

  • Cross-platform: macOS (Apple Silicon e Intel) y Debian/Ubuntu
  • Zsh sin framework: un zshrc propio, sin Oh My Zsh; los plugins (zsh-autosuggestions, zsh-syntax-highlighting) los aporta brew o apt y el zshrc los busca en las rutas de cada plataforma
  • Starship Prompt: prompt rápido, minimalista, cross-platform
  • Neovim: init.lua con lazy.nvim como gestor de plugins
  • Tmux: multiplexor de terminales
  • FZF + ripgrep: búsqueda fuzzy y rápida
  • Instalador modular: install.sh decide qué se hace y en qué orden; el cómo vive en lib/, una fase por archivo
  • Brewfiles por perfil: Brewfile base más Brewfile.cloud, Brewfile.k8s y Brewfile.gui
  • Hooks de Git versionados: .githooks/ con pre-commit, commit-msg y pre-push, más un CHANGELOG.md que se genera desde los commits

Estructura de mi repo

bash
kr0nicas/dotfiles/
├── install.sh          # único punto de entrada: qué se hace y en qué orden
├── lib/                # el cómo, una fase por archivo
│   ├── detect.sh       # SO, arquitectura, dependencias críticas
│   ├── packages.sh     # brew / apt
│   ├── symlinks.sh     # enlaces a $HOME (con sus tests al lado)
│   └── verify.sh       # resumen final
├── config/             # configuración por herramienta
│   ├── nvim/           # init.lua + lazy.nvim
│   ├── starship/       # starship.toml
│   ├── claude/         # Claude Code
│   ├── zsh/            # módulos de zsh (gcx) y sus tests
│   ├── ssh/            # colores por host
│   ├── wezterm/        # wezterm.lua
│   ├── iterm2/         # perfil de iTerm2
│   └── direnv/         # direnv.toml
├── .githooks/          # pre-commit, commit-msg, pre-push (core.hooksPath)
├── scripts/            # changelog.sh y utilidades del repo
├── web/                # escaparate del repo (Next.js estático)
├── Brewfile            # base
├── Brewfile.cloud      # extras de cloud
├── Brewfile.k8s        # extras de Kubernetes
├── Brewfile.gui        # aplicaciones con ventana
├── zshrc               # ojo: sin punto
├── tmux.conf           # ojo: sin punto
├── .gitconfig
├── CHANGELOG.md        # generado desde los commits
└── …                   # extracto: faltan docs/, .github/, vimrc y algún config/

Dos detalles que despistan si vienes de la versión anterior. El primero: zshrc va sin punto en el repo, y es el instalador quien crea el symlink ~/.zshrc que apunta a él. El segundo: no hay setup.sh. Solo hay install.sh, y todo lo que antes estaba disperso pasa por él.

Instalación

bash
git clone https://github.com/kr0nicas/dotfiles.git ~/dotfiles
cd ~/dotfiles && ./install.sh --dry-run   # ver qué haría
./install.sh                              # o --vps, --minimal, --container…

--dry-run no es decorativo: imprime todo lo que el instalador haría —paquetes, descargas, symlinks— sin tocar nada. Es la forma de auditar un script ajeno antes de dejarle escribir en tu $HOME, y también la mía de comprobar que sigue haciendo lo que creo.

Los presets son el reconocimiento de que no todas las máquinas quieren lo mismo: un VPS no necesita aplicaciones gráficas y un contenedor tampoco quiere el stack de Kubernetes.

A dónde sigue esto

Este post es la Parte 1 de una serie de tres. Lo que has leído hasta aquí es el porqué: qué son los dotfiles y por qué merece la pena tenerlos. Lo que vino después, y que este post por sí solo no cuenta, está en las otras dos:


Consejos y mejores prácticas

1. Comienza pequeño

No intentes versionar todo de una vez. Comienza con:

  • .zshrc o .bashrc
  • .gitconfig
  • .gitignore_global
bash
# ❌ Mal (copia el archivo)
cp ~/dotfiles/.zshrc ~/.zshrc

# ✅ Bien (crea symlink)
ln -sf ~/dotfiles/.zshrc ~/.zshrc

Los symlinks permiten editar desde cualquier lado y los cambios se reflejan en el repo.

3. Automatiza la instalación

Tu script install.sh debe:

  • Detectar el OS
  • Crear los symlinks
  • Instalar dependencias faltantes
  • Manejar errores gracefully

4. Documenta todo

En tu README.md:

  • Requisitos previos
  • Instrucciones de instalación
  • Estructura del repo
  • Features y personalizaciones
  • Troubleshooting común

5. Usa .gitignore_global

bash
# .gitignore_global
.DS_Store
.vscode/
node_modules/
*.swp
*.swo
*~

Aplica a todos tus repos:

bash
git config --global core.excludesfile ~/.gitignore_global

6. Separa secrets

bash
# .gitignore
# Secrets - nunca versionar
.zshrc.local
.env.local
*.pem
*.key

7. Usa aliases inteligentes

bash
# Git
alias gst='git status'
alias gco='git checkout'
alias gcb='git checkout -b'
alias gacp='git add -A && git commit -m "$1" && git push'

# Navegación
alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'

# Productividad
alias cls='clear'
alias ll='ls -la'
alias la='ls -A'
alias l='ls -CF'

8. Usa funciones personalizadas

bash
# Crear directorio y entrar
mkcd() {
    mkdir -p "$1" && cd "$1"
}

# Buscar en historial
hist() {
    history | grep "$1"
}

# Extraer cualquier archivo
extract() {
    if [ -f "$1" ]; then
        case "$1" in
            *.tar.bz2) tar xjf "$1" ;;
            *.tar.gz) tar xzf "$1" ;;
            *.bz2) bunzip2 "$1" ;;
            *.rar) unrar x "$1" ;;
            *.gz) gunzip "$1" ;;
            *.tar) tar xf "$1" ;;
            *.tbz2) tar xjf "$1" ;;
            *.tgz) tar xzf "$1" ;;
            *.zip) unzip "$1" ;;
            *.Z) uncompress "$1" ;;
            *) echo "'$1' no puede ser extraído via extract()" ;;
        esac
    else
        echo "'$1' no es un archivo válido"
    fi
}

9. Configura tu prompt

Usa Starship (cross-platform, rápido, minimalista):

bash
# Instalar
curl -fsSL https://starship.rs/install.sh | sh

# Añadir a .zshrc
eval "$(starship init zsh)"

Configuración en .config/starship.toml:

toml
[character]
success_symbol = "[➜](bold green)"
error_symbol = "[✗](bold red)"

[directory]
truncation_length = 3
truncate_to_repo = true

[git_branch]
symbol = "🌿 "

[git_status]
ahead = "⇡"
behind = "⇣"
diverged = "⇕"
untracked = "?"
modified = "!"
staged = "+"
renamed = "»"
deleted = "✘"

10. Usa versiones específicas de herramientas

bash
# .tool-versions (usando asdf)
nodejs 20.11.0
python 3.12.2
golang 1.22.0

Herramientas recomendadas para Dotfiles

1. Chezmoi - Gestor de dotfiles

bash
# Instalación
brew install chezmoi  # macOS
# O: curl -fsSL https://git.io/chezmoi | sh

# Inicializar
chezmoi init https://github.com/kr0nicas/dotfiles.git

# Aplicar
chezmoi apply
bash
# Instalación
brew install stow  # macOS
sudo apt install stow  # Ubuntu

# Estructura
dotfiles/
├── zsh/
│   └── .zshrc
└── nvim/
    └── init.lua

# Crear symlinks
stow zsh nvim

3. asdf - Version manager

bash
# Instalar múltiples versiones
asdf install nodejs 20.11.0
asdf install nodejs 18.19.0

# Cambiar versiones
asdf local nodejs 20.11.0  # Por proyecto
asdf global nodejs 20.11.0  # Global

4. Homebrew (macOS) / apt (Ubuntu)

bash
# brew.sh
#!/bin/bash
# Instalar herramientas base en macOS

brew install git zsh neovim tmux fzf ripgrep starship
brew install node python go jq

Conclusión

Los dotfiles son una inversión de tiempo con ROI astronómico:

  • Setup inicial: 2-4 horas para configurar todo
  • Setup en nuevas máquinas: 5-10 minutos
  • Ahorro anual: 15-25+ horas
  • Productividad diaria: 2-5 minutos
  • Consistencia: Tu entorno es idéntico siempre
  • Documentación viva: Todo tu conocimiento está versionado

No es solo sobre ahorrar tiempo — es sobre eliminar fricción mental. Cuando tu entorno está configurado como lo quieres, no tienes que pensar en cómo configurar una nueva máquina. No tienes que recordar "¿cómo hago X otra vez?". Todo está ahí, versionado, documentado.

Si aún no tienes dotfiles, comienza hoy. Empieza pequeño: .zshrc, .gitconfig, .gitignore_global. Luego crece incrementalmente.

Tu yo futuro te lo agradecerá.


Recursos


¿Qué esperas para empezar tu repositorio de dotfiles?

Referencias rápidas

Vista general

Recursos externos

Incluye recursos adicionales en el frontmatter para que aparezcan aquí.

Más en esta serie

Serie: Dotfiles como software de producción

// newsletter

¿Te sirvió este artículo?

Recibe los siguientes en tu inbox. Sin spam, cancela cuando quieras.

Discusión

Escrito por Jorge Ochoa. ¿Encontraste un error?

Abrir en GitHub