En ren maskine
To år efter at en kollegas dotfiles dukkede op i mit GitHub-feed tvang en ny bærbar mig endelig til det. Hvordan jeg genopbyggede min Mac som et repo med chezmoi, kørte mit årlige værktøjs-review som en samtale med Claude, og automatiserede de dele, jeg plejede at klikke mig igennem.
I sidste indlæg satte jeg mig et mål for de første halvfems dage: en koldstart på fem minutter. Fra frisk bærbar til kørende kode på under fem minutter — klon projektet, kør det lokalt, ram et live-endpoint, bestå testene, alt sammen før kaffen bliver kold. Den korteste ærlige vej fra en ny medarbejders første morgen til deres første rigtige bidrag. Det er den on-ramp, jeg vil bygge for teamet hos GolfNext, den danske golf-tech-virksomhed, jeg er på vej til at starte hos.
Før jeg kan række det videre til nogen anden, skylder jeg det til min egen maskine. Et nyt job betyder, at en ny MacBook er på vej, så jeg rettede det samme mål mod mig selv først.
Det to år gamle bogmærke
For omkring to år siden rullede et dotfiles-repo forbi i min GitHub-timeline — det feed, der viser, hvad de folk, man følger, arbejder på. Det tilhørte Manuel Brandstetter, en tidligere kollega og en af de bedste udviklere, jeg har arbejdet sammen med. Han overtog som lead på scrumlr.io, det open source-retrospektivværktøj, jeg var med til at bygge, efter at jeg forlod inovex, det tyske konsulenthus, hvor vi havde arbejdet sammen. Så da hans setup rullede forbi, stoppede jeg op og kiggede. Ingen stor pitch, bare der i forbifarten: alt det, der gør en bærbar til hans bærbar, versionsstyret ét sted. Jeg husker, at jeg tænkte, klart og højt: “Det burde jeg gøre.” Så lod jeg være. I to år.
Hvis du aldrig har holdt dotfiles: det er de små konfigurationsfiler, der stille former din maskine. Din shell-opsætning, dine editor-indstillinger, din git-konfiguration — de dusinvis af små præferencer, du ellers ville bygge op i hånden, fra hukommelsen, hver gang du får en ny computer. Et dotfiles-repo lægger dem under versionsstyring, så maskinen bliver reproducerbar i stedet for håndlavet og glemt.
Grunden til, at jeg aldrig fik gjort det, er den kedelige: det føltes altid som en eftermiddag, jeg kunne bruge på noget mere presserende. Men det smarte ved en helt ny bærbar er, at den fjerner undskyldningen. Du skal sætte maskinen op alligevel. Så kan du lige så godt sætte den op én gang, ordentligt, på en måde du aldrig skal gentage.
Det review, jeg kører hver december
Det er en vane, jeg har holdt i årevis. Et eller andet sted i den stille uge omkring jul sætter jeg mig ned og gennemgår mine værktøjer. Bruger jeg stadig det bedste til hver opgave, eller bare det, jeg tilfældigvis valgte for tre år siden og aldrig satte spørgsmålstegn ved? Det er som regel en eftermiddag alene — med changelogs, halvt huskede Hacker News-tråde, en smule “hvad bruger alle andre nu”.
I år havde et forspring. Et par uger forinden var jeg gået på jagt efter noget i stil med nvm, men til alle runtimes, ikke kun Node: Python, Go, Java, det hele. Jeg fandt mise, som gør præcis det, og at bytte en skuffe fuld af sprog-specifikke versionsstyringsværktøjer ud med ét enkelt var det mest tilfredsstillende, jeg havde gjort ved mit setup i månedsvis. Den lille sejr er nok det, der stille og roligt skubbede et to år gammelt “det burde jeg gøre” over i “gør det nu”.
Så i år kørte jeg gennemgangen som en samtale i stedet. Jeg pegede Claude — Anthropics AI-assistent, den samme jeg skal bygge med på arbejdet — mod mit nuværende setup og stillede den skarpe version af spørgsmålet: hvad her er forældet, hvad mangler, hvad ville du ændre, og hvorfor. Så lod jeg den researche og argumentere for sin sag.
Jeg holdt resultatet ærligt ved at gøre det til en diff. Det gamle setup blev på min main-branch; det reviderede gik på en branch, jeg kaldte cleanup. Så hver anbefaling var en linje, jeg kunne læse, acceptere eller afvise, ikke en sort boks, der omskrev min maskine, mens jeg ikke kiggede. Den ramme betød mere, end jeg havde regnet med. Et review, man kan læse linje for linje, er et review, man rent faktisk stoler på.
To ting kom ud af det: en måde at behandle hele maskinen som ét repo, og en kort liste over værktøjer, jeg havde været dum at springe over.
chezmoi: maskinen som et repo
Værktøjet er chezmoi. Det holder dine dotfiles i et git-repo og renderer dem ud på enhver maskine, du ejer — chez moi, passende nok, fransk for “hjemme hos mig”.
Det, der solgte mig frem for en almindelig mappe fuld af symlinks, er modellen. Filerne i repoet er kilden til sandheden; du apply‘er dem for at skrive de rigtige filer ind i din home-mappe. Rediger, se diff’en, apply, commit. Det understøtter templating (én fil kan tilpasse sig en arbejdsmaskine kontra en privat), og det holder hemmeligheder helt ude af repoet — mine SSH-nøgler bliver inde i 1Password, udleveret til git efter behov, aldrig skrevet til en fil, chezmoi ved et uheld kunne committe.
Den del, der endelig indfriede det to år gamle løfte, er bootstrappet. På en ren Mac kommer hele maskinen tilbage med tre kommandoer:
brew install gh chezmoi
gh auth login # sign in to GitHub in the browser
chezmoi init --apply bitionaire/dotfiles # clone + render everything into place
Den sidste linje kloner repoet, installerer mit shell-framework, lægger hver konfigurationsfil på plads og kører et sæt førstegangs-opsætningsscripts. Én navngivningskonvention klarer det meste af magien: en fil ved navn dot_zshrc i repoet bliver til ~/.zshrc på maskinen. dot_config/ghostty/config bliver til ~/.config/ghostty/config. dot_-præfikset er bare chezmois måde at skrive et indledende punktum uden at forvirre din filbrowser. Når først det falder på plads, læser repoet som et spejl af din home-mappe.
De værktøjer, gennemgangen faktisk ændrede
Jeg kørte allerede oh-my-zsh med powerlevel10k-prompten. Gennemgangen pressede hårdt på for tre tilføjelser, og havde ret i alle tre:
- Ghostty — en hurtig, moderne terminal. Jeg havde holdt mig til macOS-standarden i årevis af ren træghed. Ghostty er hurtigere, kan temasættes i en almindelig tekstfil (hvilket betyder, chezmoi kan spore den), og renderer de powerline-glyffer, min prompt bruger, uden en separat Nerd Font-installation.
- fzf — en fuzzy finder, og den, der ændrede min hverdag mest.
Ctrl-Rforvandler shell-historik fra en blind pil-op-jagt til en levende fuzzy-søgning.Ctrl-Tlægger en filsti ind i det, du er ved at skrive. Pipe hvad som helst ind i den —git branch | fzf— og du får en interaktiv vælger gratis. - zoxide — et smartere
cd. Den lærer de mapper, du faktisk bruger, og lader dig hoppe efter et fragment af navnet.z dotlander mig i mit dotfiles-repo fra hvor som helst på maskinen, uanset hvor dybt det er begravet.
Ingen af dem er eksotiske — det er værktøjer, mange terminal-tunge folk allerede sværger til, og jeg havde bare aldrig sat mig ned for at tilføje dem. At koble dem på er nogle få linjer shell-konfiguration:
# fzf — fuzzy finder (Ctrl-R history search, Ctrl-T file picker)
command -v fzf >/dev/null 2>&1 && eval "$(fzf --zsh)"
# zoxide — smarter cd (`z <dir>` jumps by frequency + recency)
command -v zoxide >/dev/null 2>&1 && eval "$(zoxide init zsh)"
Automatisering af de dele, jeg plejede at klikke mig igennem
En frisk Mac er ikke bare dotfiles. Det er en eftermiddag med at downloade apps, trække dem til Programmer, og klikke sig igennem de samme Systemindstillinger, du har sat på hver Mac, du nogensinde har ejet. Det er den del, gennemgangen automatiserede, og den del, jeg er mest stolt af.
Apps kommer fra en enkelt Brewfile — et manifest, Homebrew læser for at installere alt i ét hug:
brew bundle --file=Brewfile # installs every CLI tool, app, and App Store entry
Én fil opremser kommandolinjeværktøjerne, desktop-apps’ene (1Password, Firefox, Ghostty, Docker, editoren) og endda Mac App Store-køb. Ny maskine, én kommando, og en snes apps installerer sig selv.
Så er der macOS-indstillingerne. chezmoi kører opsætningsscripts ved første apply, og et af dem er bare en liste af defaults write-kommandoer — den scriptbare side af Systemindstillinger. En smagsprøve:
defaults write -g KeyRepeat -int 2 # fast key repeat
defaults write -g ApplePressAndHoldEnabled -bool false # hold a key to repeat it
defaults write com.apple.finder AppleShowAllFiles -bool true # show hidden files
defaults write com.apple.finder _FXSortFoldersFirst -bool true # folders on top
Jeg havde sat hver eneste af dem i hånden på hver Mac i et årti og aldrig tænkt på at skrive dem ned — nu er de en fil. Det er ikke totalt. Apple blokerer bevidst for at scripte de sikkerhedsfølsomme dele, så at give tilgængelighedstilladelser og logge ind på iCloud forbliver manuelt. Men de dusinvis af små knapper, der plejede at æde en eftermiddag, tager nu sekunder, og jeg skal aldrig huske dem igen.
Et godt review skærer lige så meget væk, som det tilføjer
Overraskelsen var, hvor meget samtalen talte mig fra. Et værktøjs-review handler ikke kun om nyt legetøj; det handler om at lægge mærke til det skidt, man har slæbt rundt på.
Så cleanup-branchen slettede ting. De ældre versionsstyringsværktøjer, jeg havde samlet sammen, plus en håndinstalleret Python, blev alle foldet ind i den ene mise, jeg havde taget i brug et par uger forinden. En genvej, jeg havde lavet for at omgå en gammel Docker-finurlighed, der siden er rettet — væk. Et virvar af arbejde-kontra-privat git-konfiguration, jeg havde samlet på tværs af job, fladet ud til én identitet. Hver af dem var en lille beslutning, jeg havde taget for år tilbage af en god grund, og så aldrig genbesøgt, da grunden var udløbet.
Det er den egentlige værdi i at gøre det med en sparringspartner. Overladt til mig selv har jeg en tendens til at tilføje. Bedt om at forsvare hver enkelt del højt, fik jeg endelig fjernet.
Hvad jeg tager med mig
Det imponerende var ikke, at en AI kan skrive en konfigurationsfil — det ved alle, den kan nu. Det var gennemgangen. Den rakte mig ikke et generisk “bedste setup”; den kiggede på mit, spurgte, hvad jeg faktisk laver hele dagen, og argumenterede for ændringer, der passede, med begrundelsen vedhæftet, så jeg kunne skyde igen, hvor den tog fejl. Mindre et værktøj end det december-review, jeg allerede kører, med en kyndig person på den anden side af bordet.
Og det lukkede en cirkel. Den fem-minutters koldstart, jeg vil give GolfNext-teamet, er præcis det samme, skaleret op: en ny person, en ny bærbar, og en kort vej til rigtigt arbejde uden en uges opsætnings-skat. Jeg byggede bare den personlige version først.
Så hvis du har dit eget “det burde jeg gøre”-bogmærke, der samler støv — et repo, der engang rullede forbi i din timeline, måske — så er det her dit tegn. Vent på den næste rene maskine. Og sæt den så op én gang. To år for sent slår stadig aldrig.
Referencer
Værktøjerne og dokumentationen, det er værd at bogmærke, nogenlunde i den rækkefølge, de optræder ovenfor:
- chezmoi — dotfiles-manager. Start med quick start og user guide.
- Homebrew og Brewfile /
brew bundle— installer apps og CLI-værktøjer fra ét manifest. - oh-my-zsh — Z shell-framework, med powerlevel10k-prompttemaet.
- Ghostty — hurtig terminal med konfiguration som tekst.
- fzf — fuzzy finder til kommandolinjen.
- zoxide — et smartere
cd, der lærer dine vaner. - mise — én versionsstyring til node, python, go og resten.
- 1Password SSH-agent — hold private nøgler ude af repoet og væk fra disken.
- Repoet, der startede det hele: Manuel Brandstetters dotfiles.
P.S. — et Dock-trick, der intet har med dotfiles at gøre
En gratis godbid til de Mac-brugere, der nåede så langt. Det har intet med noget af ovenstående at gøre, men det er den slags lille ting, der stille har glædet mig i årevis: du kan smide blanke mellemrum (spacers) ind i Docken for at dele dine apps op i klynger. Samme defaults write-trick som resten af indlægget. Kør det én gang per spacer, du vil have:
# full-height spacer (run again for each extra one)
defaults write com.apple.dock persistent-apps -array-add '{tile-data={}; tile-type="spacer-tile";}' && killall Dock
# half-height spacer (run again for each extra one)
defaults write com.apple.dock persistent-apps -array-add '{"tile-type"="small-spacer-tile";}' && killall Dock
Træk i mellemrummene som ethvert andet Dock-ikon, eller træk et ud af Docken for at fjerne det. Bittelille ting. Får en proppet Dock til at føles organiseret.
