This repo manages user and system configuration with the dotman repo layout.
Active repo content lives under:
packages/— package definitions and tracked source files underpackages/<id>/files/...groups/— reusable selector compositionprofiles/— variable-only profile definitionsscripts/— shared helper scripts used by package hooks and target commandsrepo.toml— repo-wide defaults such as ignore rules
Use init.sh to install bootstrap dependencies:
./init.shSource ./activate.sh before ./init.sh and before first dotman push; do not run it directly.
activate.sh loads repo core env (packages/shell/files/env.core.sh) into the current shell, including XDG dirs and PATH entries such as ~/.local/bin, then exports a hash token for stale-shell detection.
This is to align current shell with the repo's profile env. Skip if already running a login shell started after the shell package was pushed.
dotman push is guarded by that shell env token. If current shell does not carry current repo core env token yet, the guard stops with a fix message instead of prompting.
. ./activate.sh
./init.shWhat init.sh does:
- installs
uvif needed - registers this checkout in
$XDG_CONFIG_HOME/dotman/config.toml(or~/.config/dotman/config.toml) asrepos.main, preserving unrelated TOML config with the repo TOML transform helper - seeds missing manager defaults from this repo owner's current config:
ui.compact_path_tail_segments = 3,symlinks.file_symlink_mode = "prompt", andsymlinks.dir_symlink_mode = "follow"; existing values are kept - installs
dotmanwithuv tool install
By default init.sh installs dotman from:
git+https://github.com/ewgdg/dotman.gitOverride it with DOTMAN_TOOL_SPEC only if you need a different source:
DOTMAN_TOOL_SPEC='git+https://github.com/ewgdg/dotman.git' ./init.shThe manager repo entry defaults to name main, order 10, and state_key = "main".
Override only for unusual multi-repo bootstraps:
DOTFILES_DOTMAN_MANAGER_REPO_NAME=work ./init.shAfter bootstrap, use dotman as the primary interface.
If the shell package is pushed and you start a new login shell, the managed
profile sources the deployed ~/.config/shell/env.core.sh automatically, so manual
./activate.sh is no longer needed.
Typical flow:
- Run
./init.shto register this repo in your dotman manager config. - Track the binding you want.
- Use
dotman pushfor repo-to-live changes. - Use
dotman pullfor live-to-repo changes.
Example commands below assume the repo is registered as main in your dotman
config:
dotman track main:host/linux-niri@host/linux-niri
dotman push
dotman pull
dotman list tracked
dotman info tracked gitFor narrower work, you can track or inspect smaller selectors directly:
dotman track main:git@host/linux-niri
dotman push git
dotman pull gitCommon host entrypoints:
main:host/linux-niri@host/linux-nirimain:host/mac@host/mac
Examples of smaller selectors:
main:git@host/linux-nirimain:nvim@host/linux-nirimain:shell@host/linux-niri
Groups choose what to manage. Profiles provide the variable context used to resolve those selections.
- Helpers in
scripts/are still part of the active repo and are used by package target commands. - Repo Python helpers are expected to run through
uv run ...(oruv run --project "$DOTMAN_REPO_ROOT" ...inside dotman hooks). Do not rely on directpython path/to/script.pyexecution.
check docs/ directory.