A cross-platform dotfiles template that provides a default and sane configuration for a modern development environment. Every config it installs is managed by chezmoi, so you can preview, edit, update and roll back your dotfiles with a few commands (see Using chezmoi).
One command gives you Fish, Starship and modern Rust CLI tools, preconfigured and kept up to date with
chezmoi update— learn the chezmoi commands.
This repository is designed to give you a batteries-included development environment that:
- Uses Fish Shell for intelligent autosuggestions and superior user experience
- Leverages modern Rust-based Unix tools (eza, bat, fd, rg) for better performance and UX
- Provides consistent configuration across macOS and Linux platforms
- Offers a modular architecture: a core layer is always installed, and additional modules are opt-in
Modern terminal setup with Fish shell, Starship prompt, and Rust-based tools
- A GitHub account (for git and GitHub-related features)
- For non-interactive environments, set
GH_TOKENorGITHUB_TOKENbefore installation
- For non-interactive environments, set
- SSH keys added to your GitHub account (instructions)
After installation, you will need to change your default shell to Fish to get the full experience — see Post-Installation Steps.
sh -c "$(curl -fsLS https://raw.githubusercontent.com/artefactory/artefiles/main/install.sh)"This is the recommended path. The script:
- Installs GitHub CLI if not already present
- Authenticates you with GitHub (interactive browser flow, or reads a token from the environment — see below)
- Installs chezmoi, asks which optional modules to install with a checklist (
[x]will be installed,[ ]will not, then a confirmation; the editor, git tools, atuin, Python tools and gcloud start selected), and runschezmoi init --apply - As its very last step, asks whether to make Fish your default shell and whether to star this repository (both answers default to Yes: press Enter to accept, and nothing is asked in CI or Codespaces)
Why not
curl get.chezmoi.io | sh ... init --applydirectly?.chezmoi.toml.tmplcallsgh api userat init time to pre-populate your name and email. GitHub CLI must be installed and authenticated beforechezmoi initruns.install.shenforces that order; the chezmoi-direct path does not.
For headless environments where a browser login is not possible, set a GitHub token before running the script:
export GH_TOKEN=ghp_your_token_here
sh -c "$(curl -fsLS https://raw.githubusercontent.com/artefactory/artefiles/main/install.sh)"GITHUB_TOKEN is also accepted and is set automatically in GitHub Actions. In Codespaces the token is already in the environment, so no extra configuration is needed beyond adding this repository as your dotfiles source.
These dotfiles can automatically bootstrap your GitHub Codespace environment:
- Add this repository as your dotfiles in your GitHub Codespaces settings
- Create a new codespace — it will automatically apply these dotfiles using
install.sh
Learn more about Codespaces dotfiles in the official documentation.
If you prefer to manage prerequisites yourself before running chezmoi directly:
-
Install Homebrew (macOS):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -
Install GitHub CLI using your preferred method for your platform.
-
Authenticate with GitHub CLI following the official instructions, or set
GH_TOKENin your environment. -
Install these dotfiles directly with chezmoi:
sh -c "$(curl -fsLS get.chezmoi.io)" -- -b $HOME/.local/bin init --apply artefactory/artefiles
Chezmoi manages every config file of these dotfiles: the source lives in the directory printed by chezmoi source-path and chezmoi apply writes it to your home directory. Main docs: https://www.chezmoi.io/user-guide/command-overview/
| Task | Command |
|---|---|
| See pending changes | chezmoi status |
| Inspect diffs | chezmoi diff |
| Edit a file | chezmoi edit ~/.config/fish/config.fish |
| Apply changes | chezmoi apply |
| Update from repo | chezmoi update |
| Re-run the module prompt and apply | chezmoi init && chezmoi apply |
Review first:
chezmoi managed -p absoluteRemove all managed files, then remove chezmoi state/source:
chezmoi managed -p absolute -0 | xargs -0 chezmoi destroy --force
chezmoi purge --forceTo make these dotfiles your own while still receiving upstream updates:
- Fork artefactory/artefiles on GitHub (or clone it and push to your own repository).
- Initialize chezmoi from your fork:
From a local clone, run
chezmoi init --apply <your-user>/artefiles
./install.shinside it instead: it uses the checkout as the chezmoi source. - Edit a managed file with
chezmoi edit ~/.config/fish/config.fish, then review withchezmoi diffand apply withchezmoi apply. - Commit and push your changes from the source directory (
chezmoi cd).chezmoi updatepulls from your fork. - Keep upstream updates: add the original repository as
upstreamonce, then merge it when you want the latest changes (the global git config already uses mergiraf for structured merges):git -C "$(chezmoi source-path)" remote add upstream https://github.com/artefactory/artefiles.git git -C "$(chezmoi source-path)" fetch upstream git -C "$(chezmoi source-path)" merge upstream/main chezmoi apply
Artefiles uses a core + opt-in modules design. During chezmoi init, you select which modules to enable via an interactive prompt.
Fish, Starship, Git, bat, eza, fd, fzf, ripgrep, zoxide, rip2, dust, bottom, direnv, uv, Rust, FiraCode Nerd Font.
install.sh shows them as a checklist before anything is installed (editor, git_advanced, atuin, python_dev and gcloud start selected): [x] means the module will be installed, [ ] that it will not. Move with the up and down arrows (or k and j), press space to toggle the module under the pointer, n to clear the selection, q to cancel, and Enter on the Submit row to continue and confirm the summary. Choosing one module of an alternative pair deselects the other. Without a terminal (CI, Codespaces) chezmoi's own prompt is used instead.
| Module | Description | Alternative to |
|---|---|---|
editor |
Neovim: modal terminal editor with the team configuration (nvim) | — |
ghostty |
Ghostty terminal, preconfigured, plus Zellij (panes and tabs). Alternative to cmux: pick one | cmux |
cmux |
cmux: Ghostty-based macOS terminal, vertical tabs, agent notifications. Alternative to ghostty: pick one | ghostty |
git_advanced |
Extra git tools: difftastic (diffs), git-cliff (changelogs), git-lfs, git-extras, tuicr (review TUI) | — |
atuin |
Atuin: searchable shell history, synced across machines (Ctrl+R) | — |
python_dev |
Python tools: nbdime (notebook diffs), VS Code extensions | — |
pre_commit |
pre-commit: Git hook manager running linters and formatters on commit. Alternative to prek: pick one | prek |
prek |
prek: faster Rust drop-in for pre-commit, same config. Alternative to pre_commit: pick one | pre_commit |
gcloud |
Google Cloud SDK: the gcloud CLI to manage Google Cloud resources | — |
colima |
Colima: lightweight container runtime for Docker (macOS only) | — |
terraform |
Terraform: infrastructure-as-code CLI to plan and apply cloud resources. Alternative to opentofu: pick one | opentofu |
opentofu |
OpenTofu: open-source fork of Terraform, same workflow (tofu). Alternative to terraform: pick one | terraform |
The
terminalmodule is now calledghostty(an existingterminalselection is renamed on the nextchezmoi init). Themultiplexermodule is gone: Zellij now comes withghostty, so selectghosttyto keep it.cmuxdoes not install Zellij.
Re-run chezmoi init to update your module selection, then chezmoi apply.
- 🐟 Fish Shell - A smart command-line shell that suggests commands as you type and has better tab completion than traditional shells
- ⚡ Starship - A customizable terminal prompt that shows useful information like git status, programming language versions, and execution time
- 🔍 Modern CLI Tools - Faster, more user-friendly replacements for traditional Unix commands:
bat- Enhanced version ofcatwith syntax highlighting and line numberseza- Betterlswith colors, git status, and tree viewfd- Faster, easier-to-use alternative tofindfor searching filesfzf- Fuzzy finder for quickly searching through files and command history. Also rebound onto Tab as the completion picker: every fish completion — commands, subcommands, flags, and flag values — opens in fzf instead of fish's native pager, with live re-filtering as you typerip- Safermreplacement with a recoverable graveyardripgrep- Lightning-fast text search across files
- 🌟 Catppuccin - A beautiful, consistent color theme applied across all tools for a cohesive look
- 📝 Neovim (
editor) - A powerful text editor with syntax highlighting, plugins, and modern features - 🔄 Advanced Git (
git_advanced) - difftastic, git-cliff, Git LFS, git-extras (~80 helper subcommands likegit summary,git undo,git ignore,git wip), and tuicr - a vim-keybinding code review TUI (works with git), wired up as thereviewfish command:review(uncommitted changes),review file <path>,review branch [base],review commit [rev],review pr <n>,review list,review comments—review <Tab>opens the fzf picker with a description for each - 📊 Jupyter Notebook Support (
python_dev) - nbdime via uv - 🪝 Git Hooks (
pre_commitorprek) - pre-commit, or prek, a faster Rust drop-in replacement (choose one); installed with uv, and the global hooks in~/.git_templatemake every new repository run its.pre-commit-config.yaml - 🐋 Container Development (
cloud) - Colima for running Docker containers on macOS without Docker Desktop - ⏰ Shell History (
atuin) - Atuin syncs your command history across machines with powerful search - 📁 Smart Navigation - Zoxide learns your most-used directories for instant navigation
install.sh offers to do it as its last step, or you can do it yourself (see Post-Installation Steps).
~/.gitconfig- Git configuration with modern defaults (Git Documentation)~/.gitattributes_global- Global attributes for merge drivers and file handling
~/.config/ghostty/config- Ghostty terminal configuration (Ghostty Documentation) (requires theghosttyorcmuxmodule)
VS Code is not installed by this setup; these files apply when you install it yourself. The extension install is skipped when the code CLI is missing, and the Python extensions (Python, Pylance, Ruff) install only with the python_dev module.
~/.config/Code/User/settings.json(Linux) — Default VS Code settings (Catppuccin theme, FiraCode font, fish terminal, Ruff formatter). Created on first apply only; your edits are never overwritten onchezmoi update.~/Library/Application Support/Code/User/settings.json(macOS) — Same default VS Code settings as the Linux path above. Created on first apply only; never overwritten onchezmoi update.
Fish Shell Configuration (Fish Shell Documentation)
~/.config/fish/config.fish- Main Fish shell configuration~/.config/fish/aliases.fish- Shell aliases and functions~/.config/fish/conf.d/artefiles_abbrs.fish- Fish abbreviations managed by chezmoi~/.config/fish/fish_plugins- Fish plugin list~/.config/fish/functions/fish_title.fish- Terminal title function~/.config/fish/functions/smart_bat.fish- Enhanced bat function (VSCode-aware)~/.config/fish/functions/dotfiles_doctor.fish- Health check function~/.config/fish/functions/fuzzy_complete.fish- Tab completion picker backed by fzf, plus its helpers (_fuzzy_complete_render.fish,_fuzzy_complete_insert.fish,__cached_init.fish)~/.config/fish/completions/cd.fish- Zoxide-rankedcdcompletions, with an unambiguous-jump shortcut that skips the picker~/.config/fish/conf.d/direnv.fish- Defers direnv's shell hook to the first prompt instead of every startup~/.config/fish/functions/review.fishand~/.config/fish/completions/review.fish- Thereviewcommand wrapping tuicr (requiresgit_advancedmodule)~/.config/fish/functions/__atuin_fzf_search.fish,__atuin_fzf_up.fishand~/.config/fish/scripts/atuin_fzf_list.sh- Atuin history rendered through fzf, bound to Ctrl+R/Alt+R/Alt+F and up-arrow (requiresatuinmodule andperl, present by default on macOS and mainstream Linux distros)
~/.config/starship.toml- Shell prompt configuration (Starship Documentation)
- Configuration guide - module reference and syntax
- Presets gallery - ready-made prompt styles
- Catppuccin theme - palette currently in use
~/.config/bat/config- Syntax highlighter configuration (Bat Documentation)~/.config/direnv/direnvrc- Environment management (Direnv Documentation)~/.config/uv/uv.toml- Python package manager configuration (uv Documentation)~/.config/atuin/config.toml- Shell history sync (Atuin Documentation) (requiresatuinmodule)~/.config/tuicr/config.toml- Code review TUI configuration (tuicr Documentation) (requiresgit_advancedmodule)~/.config/nvim/init.lua- Neovim editor configuration (Neovim Documentation) (requireseditormodule)
| Task | Command |
|---|---|
| Update dotfiles | chezmoi update |
| Edit config | chezmoi edit <path> |
| Health check | dotfiles_doctor |
| New Python project | mkdir project && cd project && echo 'layout uv' > .envrc && direnv allow |
~/.config/
├── atuin/ # Shell history sync (atuin module)
├── bat/ # Syntax highlighting
├── direnv/ # Environment management
├── fish/ # Shell configuration
│ ├── config.fish # Main shell configuration
│ ├── aliases.fish # Shell aliases and functions
│ └── functions/ # Custom fish functions
├── ghostty/ # Terminal emulator (ghostty or cmux module)
├── nvim/ # Editor configuration (editor module)
├── uv/ # Python package manager
└── starship.toml # Prompt configuration
~/.gitconfig # Git configuration
install.sh asks as its very last step whether to make Fish your default shell. Changing it runs sudo and chsh, so it asks first (Enter accepts, anything but y, yes or Enter declines), and nothing is asked in CI, in Codespaces or without a terminal. chezmoi apply itself never changes your shell.
If you declined, or installed with chezmoi init --apply directly, set Fish as your default login shell yourself:
macOS:
command -v fish | sudo tee -a /etc/shells
chsh -s $(brew --prefix)/bin/fishLinux:
chsh -s $(which fish)You may need to log out and back in for the shell change to take effect. If you're using VS Code or another IDE, fully quit and reopen it so the Fish profile shows up in the terminal list.
atuin register # New account
atuin login # Existing accountgcloud init # Set up Google Cloud SDKRestart your terminal (or fully quit and reopen your IDE if using VS Code, Cursor, etc.) for all changes to take effect.
To simulate a new user's install without touching your own machine:
./sandbox.sh # the whole install, interactively, then a shell in the sandbox
./sandbox.sh --gh-token # same, lending your gh token so GitHub answers for real
./sandbox.sh --modules atuin,editor # skip the install and prompts, seed these modules
./sandbox.sh --modules editor --command 'ls -a "$HOME/.config"'
./sandbox.sh --clean # remove the leftovers of earlier runsBy default it runs the real install.sh inside a temporary home: the gh check and login, chezmoi, its prompts and the files applied from your checkout. Every side effect on your machine is stubbed and listed at the end as (sandbox) would run: ...: brew, downloads, the gh login, sudo, chsh, and chezmoi's scripts and externals, so nothing is installed and your real configuration is never read or written. Without --gh-token (or GH_TOKEN), gh is logged out as for a brand-new user, and the login is only simulated. --keep leaves the sandbox on disk and --clean removes the leftovers of earlier runs, including after a crash; a normal exit or Ctrl-C removes it by itself.
After the install it lists the scripts chezmoi would run, and on Linux the externals it would download (rendered from the real template), so module installs can be reviewed without running them. What it does not exercise: the Quick Start clone path (the sandbox always has the checkout) and a gh that is not installed yet. curl, wget, sudo and chsh are stubbed and no tool is installed in the sandbox, so its shell can print missing-command messages a real user would not see. For a full Linux install in a container, run ./docker-test.sh.
The install's own steps are shown too: the module checklist (arrows and space to pick modules, then Enter on the Submit row), and the star offer, which is answered without a token because the sandbox only logs the star it would send.
- Run
dotfiles_doctorto check your installation - See
chezmoi helpfor dotfiles management - Check the CHEATSHEET.md for more commands
- Reset a file:
chezmoi apply --force <path>
- CHEATSHEET.md - Common commands and shortcuts
- CHANGELOG.md - Version history and updates
MIT