Installation

Homebrew

macOS and Linux:

brew tap hahwul/doma
brew install doma

AUR (Arch Linux)

The doma package tracks the latest tagged release and pulls the static x86_64 binary from GitHub:

# with an AUR helper
paru -S doma
# or
yay -S doma

# or manually
git clone https://aur.archlinux.org/doma.git
cd doma
makepkg -si

Snap

sudo snap install doma

The snap ships with home, removable-media, and network plugs. If you want doma to read or tag paths outside $HOME (e.g. /mnt, /media), connect the removable-media plug after install:

sudo snap connect doma:removable-media

From source

Requires Crystal 1.19 or newer and the SQLite headers.

git clone https://github.com/hahwul/doma.git
cd doma
shards install
shards build --release --no-debug --production
# binary lands at ./bin/doma

Prebuilt binaries

Static Linux (x86_64, arm64) and macOS (x86_64, arm64) binaries are attached to every release. The Linux binaries are fully musl-static — no glibc or libsqlite3 dependency.

.deb, .rpm, and .apk packages are published alongside the binaries:

# Debian / Ubuntu
sudo dpkg -i doma_X.Y.Z_amd64.deb

# RHEL / Fedora
sudo rpm -i doma-X.Y.Z.x86_64.rpm

# Alpine
sudo apk add --allow-untrusted doma-X.Y.Z-x86_64.apk

Container

Multi-arch image at ghcr.io/hahwul/doma:

docker pull ghcr.io/hahwul/doma:latest
docker run --rm -it \
  -v "$HOME/.config/doma:/root/.config/doma" \
  ghcr.io/hahwul/doma list

The volume mount keeps the doma database persistent across container runs.

Verify the install

doma version
doma doctor

doctor reports where doma writes, whether the config parses, and how the database is growing — reach for it first if something looks off:

Paths
     home                 /Users/me/.config/doma
  ·  config               /Users/me/.config/doma/config.yml
  ✓  database             /Users/me/.config/doma/doma.db

Config
     status               not present (using defaults)

Database
     size                 52.0 KB
     directories          4
     tags                 4
     schema               v2

means the file exists, · means it's missing (which is fine for config.yml — defaults apply).