Skip to content

Latest commit

Β 

History

178 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

KEVINNITRO DOTFILES

Arch EndeavourOS CachyOS Ubuntu Fedora Windows WSL

ToC


😎 Showcase

Terminal

Linux Windows
linux_terminal windows_terminal

Neovim

Neovim


🧩 How it is organised

chezmoi init asks a few questions; the answers decide what gets installed and which files exist:

value meaning
profile the ONE identity this machine is β€” personal or a company id
osFamily arch / ubuntu / fedora / windows / darwin β€” picks installer
isWsl auto-detected
isGui auto-detected; false on WSL, containers, headless
isLaptop auto-detected; adds power management

Identities live in home/.chezmoidata/profiles.yml, one block per profile β€” see docs/new-company.md.

Packages live in home/.chezmoidata/pkgs/, split common / personal / work / laptop, each with cli (always) and gui (desktop only). Full repo map: AGENTS.md.


βš™οΈ Installation

0. Prerequisites per platform

Windows

[!IMPORTANT] Needs administrator privileges. Run from an elevated PowerShell and expect UAC prompts: run_once_before_0_config-windows.ps1.tmpl toggles Windows optional features (WSL, Virtual Machine Platform, .NET), and the Scoop/Choco bootstrap plus the ssh-agent service need it too. User PATH entries do not.

WSL

Install WSL from the Microsoft Store, then:

wsl --install -d Ubuntu
wsl --set-default Ubuntu

Inside the guest, follow the Linux instructions. isWsl is auto-detected and skips what makes no sense in a guest: terminal emulators, fonts, fcitx5, Hyprland/HyDE/sddm/systemd desktop units, kanata, and the personal leisure dotfiles (browser data, OBS, rclone, ncspot, …).

~/.wslconfig configures the VM, so it is applied on the Windows host, not in the guest.

Linux

Arch-based (Arch, CachyOS, EndeavourOS), Ubuntu-based (Mint, Pop!_OS) and Fedora-based are supported; the installer is picked from osFamily. On Ubuntu, ppa:neovim-ppa/stable is added so neovim is current. Anything apt lacks comes from mise.

1. SSH key

One key per identity. Full guide: 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 PowerShell)
    Set-Service ssh-agent -StartupType Automatic
    Start-Service ssh-agent
    ssh-add "$env:USERPROFILE/.ssh/id_ed25519"

2. age key

Encrypted files use age. One identity file per profile under ~/.config/age/, never committed:

profile identity file
personal ~/.config/age/key.txt
<company> ~/.config/age/<company>-key.txt

Restore from Bitwarden, or generate:

mkdir -p ~/.config/age
age-keygen -o ~/.config/age/key.txt
chmod 600 ~/.config/age/key.txt

Every file is encrypted to all known recipients, so whichever profile's key you hold opens everything this machine ships. chezmoi init only lists identity files that exist, so adding a key later means re-running it.

With no identity at all, every encrypted target is skipped by design β€” chezmoi apply still succeeds, it just leaves those files out. That is what the "SECRETS THAT NEED AN AGE IDENTITY" block in home/.chezmoiignore.tmpl is for, and why it has to list every encrypted file (see below).

Note

This repo is personal and contains encrypted files you cannot decrypt. Apply with --exclude=encrypted.

3. GitHub API rate limits

chezmoi externals and mise both hammer the GitHub API

export GITHUB_TOKEN='ghp_...'

Only matters for the first bootstrap β€” afterwards the token lives in the encrypted ~/.config/zsh/private/personal.zsh.

Tip

gh auth login && export GITHUB_TOKEN=$(gh auth token) works too.

4. Slow network

export MISE_JOBS=2
export MISE_HTTP_TIMEOUT=10m
export MISE_FETCH_REMOTE_VERSIONS_TIMEOUT=10m

5. Install chezmoi and apply

(docs)

  • shell
    sh -c "$(curl -fsLS get.chezmoi.io)" -- init --apply --ssh --depth 1 --purge-binary KevinNitroG
  • pwsh (elevated β€” see the Windows note above)
    iex "&{$(irm 'https://get.chezmoi.io/ps1')} -- init --apply --ssh --depth 1 --purge-binary KevinNitroG"

Pick profile from the list β€” one identity per machine, personal or a company. A company machine gets no personal key, no personal secrets and no personal git identity; it authenticates to GitHub with the company key. To script it:

chezmoi init --promptDefaults --promptChoice profile=[company]

6. Commit signing

Per profile in profiles.yml: personal signs with GPG, companies with their SSH key. The machine has one identity, so every repo on it signs the same way.

SSH signing needs only the key; ~/.ssh/allowed_signers is generated. Verify with git log --show-signature -1.

GPG keys are imported by hand β€” nothing here installs or trusts a private key. Steps, including Windows: docs/gpg.md.

Manually add/sync encrypted file to template

chezmoi re-add re-encrypts managed files, but not home/.chezmoitemplates/. Use the helper for those:

chezmoi-encrypt-template.sh ~/.config/Code/User/settings.json VSCode/encrypted_settings.json
chezmoi-encrypt-template.sh ~/.config/rclone/rclone.conf rclone/encrypted_rclone.conf

It reads chezmoi's own recipients, so every file stays readable by every profile. The raw equivalent:

age -a $(chezmoi data --format json | jq -r '.chezmoi.config.age.recipients | map("-r " + .) | join(" ")') \
  file >"$(chezmoi source-path)/.chezmoitemplates/file"

Note

$(chezmoi source-path) already points inside home/ because of .chezmoiroot β€” do not add another home/ to the path.

Then list it in .chezmoiignore.tmpl

Every encrypted file needs its target path in the "SECRETS THAT NEED AN AGE IDENTITY" block of home/.chezmoiignore.tmpl. Adding an encrypted_ / .age source is a two-file change.

chezmoi decrypts while rendering the target state, so one file that no available key can open does not fail alone β€” it aborts the entire chezmoi apply. Without the entry, a machine that has not got its age key yet cannot apply anything at all.

Audit that the list is complete:

find home -name '*encrypted_*' -o -name '*.age'

πŸ“ Other notes


πŸ’ References

Wallpaper

Other dotfiles

Click to expand

About

Linux, Windows dotfiles managed with Chezmoi (and AI, sorry Linux world)

Topics

Resources

Stars

89 stars

Watchers

3 watching

Forks

Used by

Contributors

Languages