Skip to content

bitcldr/dfm

Repository files navigation

dfm

Standalone, single-binary dotfiles manager. Profile format is inspired by dotbot but dfm is its own thing — no Python runtime, no git submodule.

Install

macOS (Homebrew)

brew tap bitcldr/tap
brew install dfm

Linux / macOS (shell script)

curl -fsSL https://raw.githubusercontent.com/bitcldr/dfm/main/scripts/install.sh | sh

Drops dfm into ~/.local/bin (override with DFM_INSTALL_DIR). Pin a version with DFM_VERSION=vX.Y.Z.

Quick start

dfm apply <profile>...

Profiles are read from ./profiles/<name>.conf.yaml relative to the base dir (-C <dir>, default cwd).

Commands

Command Purpose
dfm apply <profile>... Apply one or more profiles in order
dfm apply --dry-run Report planned changes without writing
dfm diff <profile> Show planned changes, no writes
dfm doctor Verify installed symlinks still resolve
dfm status Show last applied profiles and timestamp
dfm list List profiles found in ./profiles/
dfm completion <shell> Output shell completion script

Global flags: -C <dir>, -c <path>, --verbose (debug tracing), -q/--quiet (suppress progress; warnings always visible), --color=auto|always|never (default: auto; also respects NO_COLOR env var and CLICOLOR_FORCE=1).

Progress output (links created, shell commands, apply summary) goes to stderr. Data output (profile list, completion scripts, dfm status) goes to stdout and is safe to pipe. Warnings always appear on stderr regardless of --quiet. Use --quiet to suppress progress output, --verbose for debug tracing.

Shell completion

# fish
dfm completion fish > ~/.config/fish/completions/dfm.fish

# bash — add to ~/.bashrc
source <(dfm completion bash)

# zsh — add to ~/.zshrc
source <(dfm completion zsh)

Completes subcommands, flags, and profile names (via dfm list). Set $DFM_DIR to point completions at a non-cwd base directory.

Supported directives

Directives: defaults, link, shell, clean, create. Unknown directives are rejected.

  • when: — gate any directive on os, arch, or hostname
  • Non-symlink targets are backed up to ~/.dotfiles-backup/<timestamp>/ instead of failing
  • shell entries use name: + script: (multiline blocks supported)

Full reference: docs/yaml-spec.md.

Non-goals

Templating, secret management, package installation, plugins, profile inheritance.

License

MIT

About

Standalone, single-binary dotfiles manager

Topics

Resources

License

Contributing

Security policy

Stars

Watchers

Forks

Sponsor this project

  •  

Contributors