Machine Baru Bikin Gue Sadar Dotfiles Itu Gak Optional
Laptop baru dari kantor, 2 jam nyari config lama. Sadar 5 tahun setup workflow lenyap dalam 1 hari. Config itu kode, dan kode musti di-track. Filosofi dotfiles repo: version control your config.
0xNN · · 9 min read
Selasa lalu gue dapet laptop baru dari kantor. Mulus, cepet, fresh install. Senang. Gue buka terminal, mau mulai coding. Ketik gst (alias git status) - command not found. Ketik vim - default vim, bukan neovim gue. Buka VS Code - setting default, font gue gak ada, theme gue gak ada, snippet gue gak ada.
2 jam gue nyari config lama. Laptop lama udah di-wipe. Backup? Gak ada. Gue sadar: 5 tahun ngebuild workflow, lenyap dalam 1 hari. Aliases, git config, editor settings, tmux config, SSH keys - semua ilang. Gue harus rebuild dari nol, inget-inget apa yang gue setting dulu.
Itu momen gue paham kenapa senior dev selalu version control dotfiles mereka. Bukan karena gaya. Karena config itu kode, dan kode musti di-track. Artikel ini bukan tutorial "X dotfiles yang wajib." Ini cerita kenapa gue akhirnya bikin dotfiles repo, dan apa yang gue pelajarin dari proses itu.
---
Dotfiles Itu Apa (Singkat)
Dotfiles = file konfigurasi yang namanya dimulai dengan titik (hidden file di Unix). ~/.bashrc, ~/.gitconfig, ~/.config/nvim/init.lua, ~/.tmux.conf. Tiap dev punya set sendiri. Tiap dev punya preferences beda. Tiap dev - kalau dia cukup lama nge-code - punya config yang udah di-tweak selama bertahun-tahun.
Masalahnya: config itu hidden, terpisah-pisah, dan gak otomatis sync antar machine. Laptop baru = mulai dari nol.
Filosofi dotfiles repo: config itu kode, dan kode harus version-controlled. Lo gak akan nulis app tanpa git. Kenapa config lo gak?
---
Momen "Ah, Harusnya Gue Tau" yang Berulang
Bukan cuma laptop baru. Momen-momen yang akhirnya bikin gue sadar:
Server production down jam 3 pagi. Gue SSH ke server. tmux default, gak ada config. Gue mau split window - gak inget shortcut default (prefix Ctrl+b, beda dari prefix gue Ctrl+a). Debugging lambat karena gue struggle dengan keybindings gak familiar. 30 menit pertama cuma fight sama tmux.
Pair programming di laptop temen. Temen pake VS Code, gue pake neovim. Gue gak paham keybinding-nya. Tiap mau navigasi, gue musti nanya "gimana carinya file X?" 1 jam pair programming, 40 menit cuma struggle workflow.
VM baru buat testing. Gue bikin VPS, install tools, config shell. 45 menit setup. Padahal gue udah ngelakuin ini 10 kali tahun ini. Tiap kali, gue inget-inget config yang sama. Tiap kali, ada step yang kelewat. Tiap kali, frustrasi.
Saat gue akhirnya mutusin bikin dotfiles repo, 3 hari gue nge-setup semua. Tapi setelah itu, machine baru = 1 command ./install.sh, 5 menit jalan. Investasi 3 hari, return selamanya.
---
Apa yang Gue Simpen di Dotfiles Repo
Bukan checklist. Yang gue simpen, dan kenapa:
Shell config (~/.zshrc atau ~/.bashrc). Aliases, path, prompt customization. Contoh yang gue pake tiap hari:
Navigation
alias ..='cd ..'
alias ...='cd ../..'
alias dev='cd ~/dev'
Git - yang ini paling hemat waktu
alias gs='git status -sb'
alias gd='git diff'
alias gco='git checkout'
alias glog='git log --oneline --graph --decorate -20'
Quick project switch - pake fzf
function pj() {
cd ~/dev/$(ls ~/dev | fzf)
}
Prompt - minimal, tau git branch
parse_git_branch() {
git branch 2> /dev/null | sed -nE 's/^\* (.*)/\1/p'
}
PS1='\w \[\033[32m\]$(parse_git_branch)\[\033[0m\] → '
Tiap alias itu karena gue nulis command yang sama 100x sehari. git status -sb → gs. 12 karakter jadi 2 karakter. 6x lebih cepet. Sekali set, selamanya.
Git config (~/.gitconfig). User, editor, aliases, pretty format:
[user]
name = Sendi Noviansyah
email = muhammad.sendi@msncode.dev
[core]
editor = nvim
autocrlf = false
[alias]
co = checkout
br = branch
ci = commit
st = status -sb
unstage = reset HEAD --
last = log -1 HEAD
visual = !gitk
amend = commit --amend --no-edit
[init]
defaultBranch = main
[pull]
rebase = true
pull.rebase = true - biar history linear, gak ada merge commit noise. Decision yang gue ambil 3 tahun lalu, masih pegang sampe sekarang.
Editor config (~/.config/nvim/). Init.lua, plugin list, LSP config, keybindings. Ini paling ribet tapi paling valuable. Gue pake lazy.nvim buat plugin management, mason buat LSP server. Setup neovim dari nol butuh 2 hari, tapi sekarang tiap machine yang gue pake punya editor yang identik.
tmux config (~/.tmux.conf). Prefix key, split bindings, mouse support, theme:
Change prefix from Ctrl+b to Ctrl+a (lebih mudah di-reach)
set -g prefix C-a
unbind C-b
bind C-a send-prefix
Split lebih intuitif
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
Mouse support
set -g mouse on
Reload config dengan r
bind r source-file ~/.tmux.conf \; display "Reloaded!"
Start window index at 1
set -g base-index 1
setw -g pane-base-index 1
SSH config (~/.ssh/config). Host aliases biar gak ngetik IP panjang:
Host prod
HostName 10.0.1.42
User deploy
IdentityFile ~/.ssh/prod_key
Port 2222
Host staging
HostName 10.0.2.42
User deploy
IdentityFile ~/.ssh/staging_key
Sekarang ssh prod bukan ssh -i ~/.ssh/prod_key -p 2222 deploy@10.0.1.42. 47 karakter jadi 8.
---
Setup Dotfiles Repo: Cara Gue Nge-Manage
Ada beberapa approach. Yang gue pake: git bare repo. Simple, gak butuh tool tambahan.
Bikin bare repo
git init --bare $HOME/.cfg
Alias buat manage dotfiles
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
Hide file yang gak mau di-track
echo ".cfg" >> .gitignore
Add files
config status
config add .zshrc .gitconfig .tmux.conf
config commit -m "init dotfiles"
config push
Tiap mau nambah config:
config add .config/nvim/init.lua
config commit -m "feat: add neovim config"
config push
Machine baru, restore:
echo ".cfg" >> .gitignore
git clone --bare git@github.com:0xNN/dotfiles.git $HOME/.cfg
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
config checkout
config config --local status.showUntrackedFiles no
5 baris. Semua config balik.
Alternatif yang populer:
• GNU Stow - symlink farm, bagus kalau config lo tersebar di banyak folder
• chezmoi - tool khusus dotfiles management, support templates + secrets
• yadm - yet another dotfiles manager, git wrapper dengan fitur extra
Gue pake bare repo karena simple. Tapi kalau config lo udah kompleks (multiple machines, secrets, conditional config), chezmoi worth dicoba.
---
Yang Gue Pelajarin Dari Bikin Dotfiles
Config itu kode. Treat seperti kode: version control, commit message jelas, dokumentasi. Kalau lo nambahin alias, commit message-nya "feat: add gst alias for git status -sb". Bukan "update". Kalau 6 bulan kemudian lo lupa kenapa alias itu ada, git blame jawab.
Backup gak cukup. Backup file = lo punya snapshot. Version control = lo punya history, branching, easy restore. Beda. Dotfiles repo bukan cuma backup, itu documentation of decisions. Kenapa prefix tmux Ctrl+a bukan Ctrl+b? Karena commit message 2 tahun lalu bilang "Ctrl+a lebih dekat ke home row, ngurangin finger stretch."
Dotfiles harus portable. Kalau lo hardcode path spesifik machine (/Users/sendi/...), gak portable. Pakai $HOME atau ~. Kalau lo punya path spesifik (folder project, path ke binary), bikin variable di atas, biar gampang di-override per machine:
Di .zshrc
export DEV_DIR="${DEV_DIR:-$HOME/dev}"
alias dev="cd $DEV_DIR"
Machine baru, tinggal export DEV_DIR=/custom/path sebelum source .zshrc.
Jangan over-engineer. Gue pernah liat dotfiles repo 500 file, 50 script, 3 layer abstraction. Lo bukan bikin OS. Lo bikin config. Kalau setup script lo butuh 30 menit buat jalan, lo udah over-engineering. Target: ./install.sh jalan dalam 2 menit, semua config ke-symlink.
---
Yang Sering Disalahpahami
"Dotfiles cuma buat senior dev." - Enggak. Junior dev yang baru mulai punya alias gs='git status' udah punya dotfiles. Mulai dari kecil, tumbuh pelan. Gak harus perfect dari awal.
"Dotfiles repo harus pake framework (oh-my-zsh, etc)." - Salah. Framework bikin cepet di awal, tapi opaque. Kalau ada masalah, lo gak ngerti kenapa. Bare config + manual customization = lo paham setiap baris. Oh-my-zsh oke buat pemula, tapi graduate from it.
"Dotfiles itu pamer." - Ada budaya dotfiles sebagai flexing ("liat config neovim gue, 1000 baris lua"). Itu bukan tujuan dotfiles. Tujuan: productivity + portability. Kalau config lo 10 baris dan cukup, itu sukses.
"Lo musti pake tool X (stow, chezmoi, yadm)." - Gak. Bare git repo cukup buat 90% case. Tool cuma dibutuhin kalau dotfiles lo udah kompleks. Jangan adopt tool sebelum ada masalah yang solve.
---
Penutup yang Jujur
3 hari gue nge-setup dotfiles repo pertama kali. Sekarang, laptop baru = 5 menit setup. Server down jam 3 pagi = config tmux gue familiar, gak fight keybindings. Pair programming = tinggal clone repo, workflow sama. VM testing = 1 command, semua tools ready.
Filosofi yang gue pelajarin: config itu kode, dan kode itu investment. Tiap alias, tiap keybinding, tiap customization - itu keputusan yang lo buat, dan keputusan itu punya value. Kalau lo gak version control, lo buang investment itu tiap ganti machine.
Kalau lo belum punya dotfiles repo, mulai sekarang. Gak harus perfect. Mulai dari 1 file: .gitconfig. Commit, push. Besok tambah .zshrc. Minggu depan tambah editor config. Pelan-pelan. Tapi mulai sekarang, sebelum machine lo berikutnya bikin lo sadar keras-keras.
Gue masih nambahin config tiap minggu. Tiap nemu repetisi, gue bikin alias. Tiap nemu friction, gue tweak keybinding. Dotfiles repo gue bukan final, itu living document. Sama kayak skill gue - gak final, masih tumbuh.