---
title: Installation
description: Install chezmoi and apply these dotfiles with one command, or pass your own chezmoi arguments.
sidebar:
  icon: download
---

## One-liner

```sh
curl -fsSL https://dots.prd.lk/install | sh
```

`/install` is chezmoi's official install script ([get.chezmoi.io/lb](https://get.chezmoi.io/lb)), vendored into this site's `public/` directory with three changes:

1. chezmoi installs to `$HOME/.local/bin`, whatever directory you run it from.
2. With no arguments, it runs `chezmoi init --apply prdlk/dotfiles` after installing.
3. When the script is piped into `sh`, chezmoi's stdin is reattached to `/dev/tty` so the first-run prompts still work.

The script checks the release tarball's SHA-256 before installing, as upstream does.

## Before you run it

1. **Package manager**

    **Arch**: `sudo` for pacman. `paru` is needed for AUR packages (`topgrade`, and `noctalia-shell` on desktop roles); without it the package script prints a warning and skips them.
    **macOS**: [Homebrew](https://brew.sh) is required; the package script exits with an error if `brew` is missing.

2. **GitHub access**

    `prdlk/dotfiles` is a private repository, so the clone needs credentials:
    - **HTTPS** (default): git prompts for your GitHub username and a personal access token with `repo` scope.
    - **SSH**: add the machine's key to GitHub first, then use the `--ssh` form below.

3. **age key**

    chezmoi is configured for age encryption with the identity at `~/.config/chezmoi/key.txt`. The key is never committed. Copy it from an existing machine before applying:

    ```sh
    mkdir -p ~/.config/chezmoi
    scp <existing-machine>:.config/chezmoi/key.txt ~/.config/chezmoi/key.txt
    chmod 600 ~/.config/chezmoi/key.txt
    ```

## Options

Arguments after `--` go to chezmoi and replace the default `init --apply prdlk/dotfiles`:

```sh SSH
sh -c "$(curl -fsSL https://dots.prd.lk/install)" -- init --apply --ssh prdlk/dotfiles
```

```sh Dry-run
sh -c "$(curl -fsSL https://dots.prd.lk/install)" -- init prdlk/dotfiles
chezmoi diff
chezmoi apply
```

```sh chezmoi-only
sh -c "$(curl -fsSL https://dots.prd.lk/install)" -- --version
```

| Flag / variable | Effect |
| --- | --- |
| `-b <dir>` | Install directory (default `$HOME/.local/bin`) |
| `-t <tag>` | chezmoi release tag (default `latest`) |
| `-d` | Debug logging |
| `BINDIR` | Same as `-b` |
| `DOTFILES_REPO` | Repo for the default `init --apply` (default `prdlk/dotfiles`) |

## First apply

1. **Prompts**

    `.chezmoi.toml.tmpl` asks once for **name**, **email**, and **role** (`desktop`, `laptop`, `mac`, `server`). Answers are stored in `~/.config/chezmoi/chezmoi.toml` and not asked again. See [Configuration](/chezmoi/config).

2. **Packages**

    `run_onchange_before_10-packages` installs everything in `.chezmoidata/packages.yaml` with pacman/paru or Homebrew before any file is written. See [Scripts](/chezmoi/scripts).

3. **Files and externals**

    Configs are linked into `$HOME` (symlink mode). The neovim config and a bat syntax are cloned as externals. See [Externals and ignore rules](/chezmoi/externals-and-ignore).

4. **Post-apply scripts**

    gh extensions, tpm, the bat cache, the font cache, yazi plugins, and the niri user service on Linux.

:::note
The gh extension script skips with a warning until `gh auth login` has run. A skipped run still exits 0, so a plain `chezmoi apply` does not retry it. See [Scripts](/chezmoi/scripts#20-gh-extensions) for how to re-run it.
:::

## Updating

```sh
chezmoi update   # git pull + apply
chezmoi diff     # what apply would change
```

## Refreshing the install script

`public/install` is a vendored copy. To pick up upstream changes, download `https://get.chezmoi.io/lb` again and re-apply the three changes listed in the header comment of `public/install`.

## Publishing this site

The site is a [Blume](https://github.com/haydenbleasel/blume) project (`docs/`, `public/`, `blume.config.ts`). `.github/workflows/docs.yml` builds it with `bun run build` and deploys `dist/` to GitHub Pages on every push to `master` that touches the site. Pages uses **GitHub Actions** as its source, and `dots.prd.lk` is the custom domain set in the repository's Pages settings. That domain needs a DNS `CNAME` record pointing to `prdlk.github.io`. None of these files are applied to `$HOME`; `.chezmoiignore.tmpl` excludes them.
