My dotfiles for Arch Linux
70%
CSS 19%
Go Template 6%
Shell 4%
Lua <1%

README.md

dotfiles #

My dotfiles for CachyOS.

Usage #

Prerequisits #

I use CachyOS, which is an Arch Linux based distro with some nice benefits:

  • Kernel and packages compiled with Zen 4 (AMD) support
  • Desktop environment selection during installation
  • Good defaults (Alacritty, fish, paru)
  • Many useful packages pre-installed (eza, fprintd, bat)

First, install CachyOS Desktop Edition and select Limine as a bootloader and niri as desktop environment.

Setup #

I use niri as my preferred desktop environment and it comes preconfigured with CachyOS. My dotfiles are based on it, but customize some of it.

Install additional packages #

My niri setup depends on the following additional packages:

paru -S \
  swayidle \
  kwallet-pam \
  fprintd \
  yazi \
  btop \
  bluetui \
  impala

I prefer iwd as Wifi back-end of NetworkManager. Once configured, restart the service:

sudo systemctl restart NetworkManager.service

Wifi must be reconfigured now.

Create SSH key #

I use my Yubikey to authorize SSH key usage. This requires libfido2:

paru -S libfido2

Then generate a new SSH key (default location, no passphrase):

ssh-keygen -t ed25519-sk -C jan.ehrhardt@cozybytes.tech

Setup Neovim #

Install the required packages:

paru -S \
  neovim \
  tree-sitter-cli

I use LazyVim, which is a Neovim distro with good defaults for programming. Install it by following the instructions.

Setup terminal #

Install additional packages for my terminal setup:

paru -S \
  starship \
  zellij \
  zoxide \
  atuin \
  mise

Login to atuin and sync history:

atuin login
atuin sync

Setup dotfiles #

I use chezmoi to manage my dotfiles. First, install it:

paru -S chezmoi

Then apply the dotfiles from my Git repo:

chezmoi init --ssh --apply git@tangled.org:jehrhardt.dev/dotfiles

This will automatically configure the system.

Ensure systemd units are enabled #

I use systemd to launch several services along niri. They must be enabled by:

systemctl --user add-wants niri.service plasma-polkit-agent.service
systemctl --user add-wants niri.service mako.service
systemctl --user add-wants niri.service waybar.service
systemctl --user add-wants niri.service swayidle.service

Setup fingerprint reader #

I prefer to use the fingerprint reader to unlock my laptop and authorize sudo commands in my terminal.

Update PAM configuration to use fingerprint authentication.

/etc/pam.d/sudo #

Add before other config:

auth      sufficient pam_fprintd.so
/etc/pam.d/polkit-1 #

Add the following:

#%PAM-1.0
auth      sufficient pam_fprintd.so
auth      required   pam_unix.so
account   required   pam_unix.so
password  required   pam_unix.so
session   required   pam_unix.so
/etc/pam.d/swaylock #

Add before other config:

auth      sufficient pam_unix.so try_first_pass likeauth nullok
auth      sufficient pam_fprintd.so
Add new fingerprint #

Restart polkit agent:

systemctl --user restart plasma-polkit-agent.service

Enroll:

fprintd-enroll

Then verify:

fprintd-verify

Install development tools #

I use several tools for development that are not configured via my dotfiles, but need to be setup.

OpenCode #

I use OpenCode as my preferred coding agent. Some of the reasons:

  • Nice TUI
  • Supports different models and providers
  • It works really well

Install it:

paru -S opencode-bin
Docker and Supabase CLI #

Supabase CLI uses Docker to run locally. This is nice for development.

Install required packages:

paru -S \
  supabase-bin \
  lazydocker \
  docker \
  docker-buildx \
  docker-compose

Enable Docker service:

sudo systemctl enable docker.service

Give yourself permission to access Docker daemon:

sudo usermod -aG docker $USER
Rust #

I use mise to setup development environments including programming languages. Rust is the only exception as I prefer rustup.

It can be installed as a package:

paru -S rustup

I use stable toolchain:

rustup install stable
Python via uv #

I vibe code Python for automation and experimentation and my preferred way to handle it is uv.

Install it via mise:

mise use --global uv

Then install completions:

echo 'uv generate-shell-completion fish | source' > ~/.config/fish/completions/uv.fish
echo 'uvx --generate-shell-completion fish | source' > ~/.config/fish/completions/uvx.fish
Node.js #

Plenty of tools (e.g. language servers used by Neovim) require Node.js to present.

Install LTS version via mise:

mise use --global node@lts

Install other apps #

OpenCode #

My preferred coding agent:

paru -S opencode-bin
Brave #

My preferred browser. It uses KWallet for storing passwords (requires wallet password to match user password).

paru -S brave-bin
Obsidian #

My preferred note taking app:

paru -S obsidian-bin