A personal EndeavourOS desktop — niri + Noctalia, managed with chezmoi.
Reproducible on a fresh machine, and safe to share publicly.
Note
This is tuned for my personal laptop. Read each config before applying it — don't copy blindly. Everything private (emails, work host, hostnames) is templated, so you supply your own values on first run.
- Table of contents
- What I use
- Quick start
- How it's organized
- Guides
- Packages
- Development
- Credits
- License
| Layer | Choice |
|---|---|
| Distro | EndeavourOS (Arch-based), "no desktop" base |
| AUR helper | yay |
| Compositor | niri — scrollable tiling, Wayland |
| Shell (desktop) | Noctalia |
| Login | greetd + tuigreet — guide |
| Terminal | Ghostty — guide |
| Shell | fish — guide |
| Prompt | starship |
| Dotfile manager | chezmoi — why (ADR) |
A note on the base install
I install EndeavourOS in "no desktop" mode (minimal Arch, no DE) and build the niri + Noctalia environment on top. See docs/packages.md for the full package story.
Warning
Applying these dotfiles overwrites files in your $HOME. Review first, and
ideally test in a VM or a fresh user account.
# 1. Install chezmoi
yay -S --needed chezmoi
# 2. Pull this repo and apply it. You'll be prompted for your email, name,
# work git host/port, ghq roots, and whether to auto-install packages.
chezmoi init --apply https://github.com/anIcedAntFA/dotfiles.gitYour answers are stored in ~/.config/chezmoi/chezmoi.toml (never committed) and
injected into templates like ~/.config/git/config and ~/.ssh/config. To preview
changes before applying: chezmoi diff.
Then, if you didn't opt into package auto-install, install them manually:
yay -S --needed - < packages/pacman-explicit.txt
yay -S --needed - < packages/aur.txtSystem files under etc/ (hosts, greetd) are not managed by chezmoi —
copy them by hand with sudo where noted in the guides.
dotfiles/
├── home/ ← chezmoi source (.chezmoiroot points here)
│ ├── dot_config/ → ~/.config/*
│ ├── dot_local/ → ~/.local/*
│ ├── private_dot_ssh/ → ~/.ssh/* (0600)
│ ├── dot_config/git/config.tmpl → ~/.config/git/config (templated)
│ └── .chezmoi.toml.tmpl prompts for your private values
├── docs/ per-tool guides + Architecture Decision Records (adr/)
├── packages/ reproducible package snapshots
├── etc/ system files (/etc/*) — applied manually
├── images/ screenshots & wallpapers
└── justfile, lefthook.yml, .oxfmtrc.json, .github/ tooling
Each tool has a focused guide covering what it is, why, and how to set it up:
| Guide | About |
|---|---|
| chezmoi.md | Dotfile manager — workflows, templates, add/re-add |
| niri.md | The scrollable-tiling compositor + Noctalia shell (hub) |
| ⤷ niri-concepts.md | niri's mental model — columns, workspaces, outputs |
| ⤷ niri-config.md | Config walkthrough + one-file-three-machines template |
| ⤷ niri-keybindings.md | Full Keybind ↔ Action tables |
| ghostty.md | Terminal, cursor shaders, theming |
| fish.md | Shell, plugins, keybindings, secrets pattern |
| fastfetch.md | System-info banner — random Arch logo, per-machine |
| ghq.md | Organized repo cloning + fuzzy jumping |
| ssh.md | SSH keys per host (personal + work auth) |
| git.md | Git identities, includeIf, SSH commit signing |
| gopass.md | Terminal password manager (GPG + git) |
| certs.md | Corporate CA certs — trust store restore |
| vpn.md | Corporate VPN (GlobalProtect / gpclient) |
| docker.md | Engine setup, rootless usage, daemon config |
| firewalld.md | Exposing a dev server to your LAN |
| greetd.md | Login manager + tuigreet + quiet boot |
| fcitx5.md | Vietnamese input (Bamboo) |
| screenshot.md | Screenshot pipeline (grim/slurp/satty) |
| screen-recording.md | GPU screen recording (wl-screenrec) |
| clipboard.md | Clipboard history (cliphist + Noctalia launcher) |
| archives.md | Compression / archives (7zz · ouch · PeaZip GUI) |
| mise.md | Runtime / dev-env version management |
| direnv.md | Per-directory environments (.envrc) |
| tuxedo.md | todo.txt task TUI + niri float keybind |
Bigger design decisions are recorded as ADRs.
The full, reproducible lists live in packages/; a curated,
grouped, and explained subset is in docs/packages.md.
This repo lints and formats itself. See CONTRIBUTING.md.
just setup # install tooling + git hooks
just check # format check + lint + secret scan (what CI runs)
just fmt # auto-format everything- Format: oxfmt (md/json/yaml/toml),
shfmt(shell),fish_indent(fish) - Lint: markdownlint,
shellcheck - Secrets: gitleaks in the pre-commit hook and CI
Heavy inspiration from:
- devaslife — Takuya Matsuyama
- mantran1611 — Manh Tran
- lazarus2019 — Thai Son
- nickjj — Nick Janetakis
Many thanks to my colleagues at NDVN for introducing me to Linux and guiding me along the way. You're amazing and kind. 🙏
MIT © ngockhoi96
