- π Showcase
- π§© How it is organised
- βοΈ Installation
- π€ Ephemeral / guest machines
- π Encrypted files
- π Other notes
- π References
| Linux | Windows |
|---|---|
![]() |
![]() |
Note
Neovim config https://github.com/uitdots/nvim
chezmoi init prompts; the answers decide what exists.
| value | meaning |
|---|---|
profile |
the ONE identity β personal, a company id, or ephemeral |
osFamily |
arch / ubuntu / fedora / windows / darwin |
isWsl |
auto |
isGui |
auto; false on WSL, containers, headless |
isLaptop |
auto; adds power management |
- Identities β
home/.chezmoidata/profiles.yml, one block each (new company). - Packages β
home/.chezmoidata/pkgs/, splitcommon/personal/work/laptopΓcli/gui. - Repo map β AGENTS.md.
Not me? Use ephemeral.
Windows
[!IMPORTANT] Needs admin. Elevated PowerShell, expect UAC:
run_once_before_0_config-windows.ps1.tmpltoggles optional features (WSL, Virtual Machine Platform, .NET); Scoop/Choco andssh-agentneed it too. UserPATHdoes not.
WSL
Store, then:
wsl --install -d Ubuntu
wsl --set-default UbuntuThen follow Linux. isWsl is auto and drops: terminal emulators, fonts,
fcitx5, Hyprland/HyDE/sddm/systemd desktop units, kanata, leisure dotfiles.
~/.wslconfig belongs to the Windows host, not the guest.
Linux
Arch-based, Ubuntu-based, Fedora-based. Installer picked from osFamily.
Ubuntu adds ppa:neovim-ppa/stable; whatever apt/dnf lacks comes from mise.
Tip
ephemeral has no keys β skip steps 1, 2, 6.
One key per identity β docs/ssh.md.
- Linux / WSL / macOS
eval "$(ssh-agent -s)" chmod 700 ~/.ssh/ chmod 644 ~/.ssh/id_ed25519.pub chmod 600 ~/.ssh/id_ed25519 ssh-add ~/.ssh/id_ed25519
- Windows (elevated)
Set-Service ssh-agent -StartupType Automatic Start-Service ssh-agent ssh-add "$env:USERPROFILE/.ssh/id_ed25519"
age identity per profile, never committed:
| profile | identity file |
|---|---|
personal |
~/.config/age/key.txt |
<company> |
~/.config/age/<company>-key.txt |
ephemeral |
none |
Restore from Bitwarden, or:
mkdir -p ~/.config/age
age-keygen -o ~/.config/age/key.txt
chmod 600 ~/.config/age/key.txt- Encrypted to all recipients β any one key opens everything.
initonly lists keys that exist β new key = re-runchezmoi init.- No key at all = encrypted targets skipped, apply still succeeds. No
--exclude=encryptedneeded.
Externals + mise hammer the API (anon limit 60/h).
export GITHUB_TOKEN='ghp_...' # or: $(gh auth token)First bootstrap only; afterwards it lives in ~/.config/zsh/private/personal.zsh.
export MISE_JOBS=2
export MISE_HTTP_TIMEOUT=10m
export MISE_FETCH_REMOTE_VERSIONS_TIMEOUT=10m(docs)
- shell
sh -c "$(curl -fsLS get.chezmoi.io)" -- init --apply --ssh --depth 1 KevinNitroG - pwsh (elevated)
iex "&{$(irm 'https://get.chezmoi.io/ps1')} -- init --apply --ssh --depth 1 KevinNitroG"
Caution
No --purge-binary unless your package manager ships chezmoi. It deletes
~/.local/bin/chezmoi at the end β without a packaged chezmoi you are left
with none and cannot re-apply.
- Arch-based β
chezmoiis in the package list β safe, and avoids two copies shadowing each other. - Everything else β leave it off. To clean up later: install chezmoi
properly (
mise use -g chezmoi, package manager), thenrm ~/.local/bin/chezmoi.
Scripted:
chezmoi init --promptDefaults --promptChoice profile=[company]personal β GPG, companies β SSH, ephemeral β none. One identity per
machine, so every repo signs the same way.
- SSH: needs only the key;
~/.ssh/allowed_signersis generated. Check:git log --show-signature -1. - GPG: keys imported by hand β docs/gpg.md.
A friend's laptop, throwaway VM, container, devcontainer, CI β no age key, no ssh key.
sh -c "$(curl -fsLS get.chezmoi.io)" -- init --apply --depth 1 \
--promptChoice profile=ephemeral KevinNitroGFully non-interactive (CI)
chezmoi init --apply --depth 1 \
--promptChoice 'profile=ephemeral,What theme to use=dark,catppuccin light flavour=latte,catppuccin dark flavour=mocha,catppuccin accentColor=lavender' \
--promptBool 'Is this machine GUI=false,Is this a laptop=false' \
--promptInt 'Terminal font size=13' \
--promptString 'Opacity=0.8' \
KevinNitroGNot touched:
| area | behaviour |
|---|---|
~/.ssh |
unmanaged entirely β your keys and config stay |
| git identity | no [user] block; your existing one wins |
| commit signing | off |
| secrets | no age key β every encrypted_ target skipped |
gh |
hosts.yml unmanaged |
| packages | common only |
You still get: zsh + oh-my-zsh + starship, editors, Catppuccin, the common
CLI toolchain.
Note
git-repo externals clone over https unless the profile's private ssh key
is actually on disk (then git@github.com:) β a keyless clone never blocks on
a host-key prompt.
Promote to a real identity later: drop the age + ssh keys in place, then
chezmoi init --promptChoice profile=personal && chezmoi apply.
chezmoi re-add re-encrypts managed files, but not home/.chezmoitemplates/:
chezmoi-encrypt-template.sh ~/.config/rclone/rclone.conf rclone/encrypted_rclone.confRaw equivalent
age -a $(chezmoi data --format json | jq -r '.chezmoi.config.age.recipients | map("-r " + .) | join(" ")') \
file >"$(chezmoi source-path)/.chezmoitemplates/file"$(chezmoi source-path) is already inside home/ β don't add it again.
Every encrypted file needs its target path in the "SECRETS THAT NEED AN AGE
IDENTITY" block. Adding an encrypted_ / .age source is a two-file change.
Why: chezmoi decrypts while rendering the target state, so one unreadable file
aborts the whole chezmoi apply, not just itself.
Audit:
find home -name '*encrypted_*' -o -name '*.age'Tip
CI proves the keyless path still works β
.github/workflows/smoke-ephemeral.yml
applies the ephemeral profile on ubuntu-latest every Wednesday 03:00
UTC+7.
- New company onboarding
- SSH keys & commit signing
- Repo architecture (for humans and agents)
- Windows
- Linux
- Browser
- Terminal
- Zathura
- https://github.com/D3Ext/aesthetic-wallpapers
- https://github.com/DenverCoder1/minimalistic-wallpaper-collection
- https://github.com/Gingeh/wallpapers
Click to expand
- For use
- Chezmoi
- https://github.com/megabyte-labs/install.doctor
- https://github.com/lildude/dotfiles/ (Have config for codespace)
- Others
- https://github.com/2KAbhishek/dots2k
- https://github.com/2nthony/dotfiles (Lazygit?)
- https://github.com/Alexis12119/dotfiles
- https://github.com/Cybersnake223/Hypr
- https://github.com/Integralist/dotfiles
- https://github.com/JoosepAlviste/dotfiles
- https://github.com/amitds1997/dotfiles (setup for arch and mac, git stuff, something is new to me)
- https://github.com/asilvadesigns/config
- https://github.com/bahamas10/dotfiles (YSAP)
- https://github.com/chaneyzorn/dotfiles
- https://github.com/craftzdog/dotfiles-public
- https://github.com/dlvhdr/dotfiles
- https://github.com/dreamsofautonomy/zensh
- https://github.com/linkarzu/dotfiles-latest
- https://github.com/mischavandenburg/dotfiles
- https://github.com/nguyenvukhang/docker-dev
- https://github.com/nguyenvukhang/dots (git config!)
- https://github.com/omerxx/dotfiles (have good tmux plugins)
- https://github.com/p3nguin-kun/dotfiles
- https://github.com/petobens/dotfiles (X config, tmux for linux & mac)
- https://github.com/rusty-electron/dotfiles
- https://github.com/siduck/dotfiles
- https://github.com/stevearc/dotfiles
- https://github.com/wincent/wincent (Old dotfiles π±)
- Nix
- https://git.aquaticservers.com/aqua/AquaticOS (Hyprland)
- https://codeberg.org/HirschBerge/hyprlua (Temp lua hyprland)



