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
~/
├── .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
# 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:
# 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
# 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:
# 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_globalpara 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
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
#!/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
# .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
# .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
| Tarea | Tiempo estimado |
|---|---|
| Instalar herramientas base | 45 min |
| Configurar shell (aliases, funciones) | 30 min |
| Configurar Git | 15 min |
| Configurar editor | 60 min |
| Configurar Tmux | 20 min |
| Configurar prompt | 15 min |
| Configurar SSH | 10 min |
| Total | 3h 15min |
Con dotfiles
| Tarea | Tiempo estimado |
|---|---|
| Clonar repo | 1 min |
| Ejecutar install.sh | 3 min |
| Configurar secrets (opcional) | 5 min |
| Total | 9 min |
Ahorro: 3h 6min (~95% menos tiempo)
Ahorro diario
| Acción | Sin alias | Con alias | Ahorro por uso |
|---|---|---|---|
git status | 12 caracteres | gst (3) | 9 caracteres |
git add -A && git commit -m "msg" && git push | 56 caracteres | gacp "msg" (9) | 47 caracteres |
git checkout -b feature/branch | 32 caracteres | gcb 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
zshrcpropio, sin Oh My Zsh; los plugins (zsh-autosuggestions,zsh-syntax-highlighting) los aporta brew o apt y elzshrclos busca en las rutas de cada plataforma - Starship Prompt: prompt rápido, minimalista, cross-platform
- Neovim:
init.luacon lazy.nvim como gestor de plugins - Tmux: multiplexor de terminales
- FZF + ripgrep: búsqueda fuzzy y rápida
- Instalador modular:
install.shdecide qué se hace y en qué orden; el cómo vive enlib/, una fase por archivo - Brewfiles por perfil:
Brewfilebase másBrewfile.cloud,Brewfile.k8syBrewfile.gui - Hooks de Git versionados:
.githooks/conpre-commit,commit-msgypre-push, más unCHANGELOG.mdque se genera desde los commits
Estructura de mi repo
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
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:
- Parte 2 — Dotfiles cross-platform: un instalador con cinco presets: cómo un
install.shde mil líneas se parte en fases testeables, por qué aparecen los presets y qué pasa cuando instalas en una máquina que no es tu laptop. - Parte 3 — CI, hooks, changelog y catálogo: lo que hace falta para que el repo no vuelva a mentir — hooks que bloquean commits malos, un CI que instala en limpio y un catálogo que se genera desde el propio repo.
Consejos y mejores prácticas
1. Comienza pequeño
No intentes versionar todo de una vez. Comienza con:
.zshrco.bashrc.gitconfig.gitignore_global
2. Usa symlinks, no copias
# ❌ 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
# .gitignore_global
.DS_Store
.vscode/
node_modules/
*.swp
*.swo
*~
Aplica a todos tus repos:
git config --global core.excludesfile ~/.gitignore_global
6. Separa secrets
# .gitignore
# Secrets - nunca versionar
.zshrc.local
.env.local
*.pem
*.key
7. Usa aliases inteligentes
# 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
# 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):
# Instalar
curl -fsSL https://starship.rs/install.sh | sh
# Añadir a .zshrc
eval "$(starship init zsh)"
Configuración en .config/starship.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
# .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
# 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
2. GNU Stow - Symlink manager
# 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
# 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)
# 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
- Mi repositorio: kr0nicas/dotfiles
- GitHub Dotfiles Guide: https://dotfiles.github.io/
- Starship Prompt: https://starship.rs/
- Oh My Zsh: https://ohmyz.sh/
- Chezmoi: https://www.chezmoi.io/
- GNU Stow: https://www.gnu.org/software/stow/
¿Qué esperas para empezar tu repositorio de dotfiles?