DotR
A dotfiles manager that is as dear as a daughter.
[!WARNING] This is still in beta. The schema is evolving, performance is sub-par. Use it with caution.
Documentation
For detailed documentation, guides, and examples, visit the DotR Wiki.
Features
📦 Package Management
- Import dotfiles from any location into your repository
- Deploy dotfiles to their target locations
- Update changes back to your repository
- Support for both files and directories
- Profile-based deployment for different environments (work, home, server)
- Profile dependencies to automatically deploy required packages
- Package targets to override destinations per profile
🎭 Profiles
- Environment-specific configurations (work, home, server, laptop, etc.)
- Profile variables that override package and config variables
- Package dependencies per profile for automatic deployment
- Target overrides to deploy same package to different locations per profile
- Switch profiles with
--profileflag on deploy, import, and update commands
🔧 Variables
- Environment variables automatically available in all templates
- Custom user variables defined in
config.toml - Package-level variables for package-specific configurations
- Profile variables that override other variables when a profile is active
- Nested variable structures with TOML tables and arrays
- Print variables command to view all available variables
- Variable priority: User variables > Profile variables > Package variables > Config variables > Environment variables
- Secret
uservariables.tomlfile to save secrets you don't want to share in VCS
💬 Interactive Prompts
- Config-level prompts - Global prompts for values used across all packages
- Package-level prompts - Package-specific prompts for sensitive configuration
- Profile-level prompts - Environment-specific prompts (work credentials, personal tokens, etc.)
- Smart prompting - Only prompts once, saves answers to
.uservariables.toml - Skip existing values - Won't prompt for variables already defined
- Prompts are displayed during deploy, update, and diff commands
📝 Templating (Tera)
- Full Tera template engine support
- Use
{{ variable }}for variable substitution - Use
{% if condition %}for conditional logic - Use
{# comment #}for template comments - Automatic template detection - no configuration needed
- Templates are compiled during deployment with live variables
- Templated files are never backed up (source of truth stays in templates)
⚡ Actions (Pre/Post Hooks)
- Pre-deployment actions run before package deployment
- Post-deployment actions run after package deployment
- Execute shell commands with full variable interpolation
- Multiple actions per package, executed in order
- Perfect for: installing dependencies, reloading services, setting permissions, etc.
🎯 Smart Workflows
- Templated and regular files can coexist in the same repository
- Granular file deployment - only deploys files when content has changed
- Granular backups - creates per-file backups (
.dotrbak) instead of directory backups - Diff command to preview changes before deployment
- Dry run mode - preview deploy and update operations without making any changes
- Selective package deployment and updates
- Profile-based deployments for different machines/environments
- Directory structure preservation
Quick Start
- Initialize a dotfiles repository:
- Import your existing dotfiles:
# Import for a specific profile
- Deploy dotfiles to a new machine:
# Deploy all packages
# Deploy with a specific profile
# Deploy specific packages
# Dry run to preview what would be deployed without making changes
- Check differences before deploying:
# See what would change if you deployed
# Diff specific packages
# Diff with a profile
- Update after making changes:
# Update with a profile
# Dry run to preview what would be updated without making changes
Variables Example
[]
= "nvim"
[]
= "Your Name"
= "you@example.com"
Use in templates: {{ EDITOR }} and {{ git.email }}
Templating Example
# config file with Tera templates
[]
= "{{ git.name }}"
= "{{ git.email }}"
{% if HOME %}
[]
= "{{ HOME }}/Data"
{% endif %}
Actions Example
[]
= "dotfiles/nvim"
= "~/.config/nvim/"
= ["mkdir -p ~/.local/share/nvim"]
= ["nvim --headless +PluginInstall +qall"]
Actions support variable interpolation and run before/after deployment.
Prompts Example
# Config-level (global)
[]
= "Enter your git email"
# Package-level
[]
[]
= "Enter AWS access key"
# Profile-level
[]
[]
= "Enter work email"
Prompts are asked once on first deploy, saved to .uservariables.toml (gitignored).
Profiles Example
[]
= ["nvim", "git"]
[]
= "work@company.com"
[]
= ["nvim", "gaming"]
[]
= "personal@email.com"
Deploy with: dotr deploy --profile work
Diff Command
# Preview changes before deployment
# Diff specific packages
# Diff with profile
Shows line-by-line differences with color coding (+ green for additions, - red for deletions).
Dry Run Mode
# Preview deploy without making any changes
# Preview update without making any changes
# Combine with other options
Dry run mode shows what would happen during deploy or update operations without:
- Creating or modifying any files
- Creating backups
- Executing pre/post actions
- Removing files (when using --clean)
Installation
Homebrew (macOS and Linux)
Supports both Apple Silicon and Intel Macs.
Cargo
From Source
Pre-built Binaries
Download the latest release for your platform from the releases page:
- Apple Silicon (M1/M2/M3):
dotr-aarch64-apple-darwin.tar.gz - Intel Mac:
dotr-x86_64-apple-darwin.tar.gz - Linux (x86_64):
dotr-x86_64-unknown-linux-gnu.tar.gz
Extract and move the binary to your PATH:
Usage
Usage: dotr [OPTIONS] [COMMAND]
Commands:
init Intialize dotfiles repository.
import Import dotfile and update configuration.
deploy Deploy dotfiles from repository.
update Update dotfiles from deployed versions.
diff Show differences between dotfiles.
print-vars Print all user variables.
packages List all managed packages.
profiles
help Print this message or the help of the given subcommand(s)
Options:
-w, --working-dir <WORKING_DIR>
-h, --help Print help
-V, --version Print version
TODO
- Import configs
- Copy configs
- Update configs
- Variables (with nested structures)
- Templating (Tera engine)
- Actions (pre/post hooks)
- Profiles (environment-specific configs)
- Diff command (preview changes)
- Granular copying and backups
- Interactive prompts (config/package/profile level)
- Dry run mode (preview deploy/update without changes)
- Symlinking config