A universal dotfile and system configuration manager built in Rust
Heimdal automatically manages your dotfiles, installs packages, and keeps your development environment in sync across multiple machines. Built with Rust for performance and reliability.
π Full Documentation | π¬ Discussions
Homebrew (macOS)
brew install limistah/tap/heimdalAPT (Debian/Ubuntu)
# One-line setup
curl -fsSL https://raw.githubusercontent.com/limistah/heimdal/main/scripts/install-deb.sh | bash
# Or manual
curl -fsSL https://limistah.github.io/heimdal/gpg | sudo gpg --dearmor -o /usr/share/keyrings/heimdal-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/heimdal-archive-keyring.gpg] https://limistah.github.io/heimdal/deb stable main" | sudo tee /etc/apt/sources.list.d/heimdal.list
sudo apt update && sudo apt install heimdalCargo (All Platforms)
cargo install heimdalUniversal installer
curl -fsSL https://raw.githubusercontent.com/limistah/heimdal/main/install.sh | bashMore installation options: Installation Guide β
New to dotfiles?
heimdal wizardThe interactive wizard guides you through:
- Smart scanning with real-time progress
- Interactive file and package selection
- Smart profile names (auto-generated from hostname/OS)
- Git sync setup with remote configuration
Migrating from Stow, dotbot, chezmoi, yadm, or homesick?
heimdal wizard # Choose "Import existing dotfiles"
heimdal import --path ~/.dotfiles --preview # Preview before importingCloning to a new machine?
git clone <your-dotfiles-repo> ~/.dotfiles
cd ~/.dotfiles
heimdal apply- π¦ Universal Package Management - One config for Homebrew, APT, DNF, Pacman, and Mac App Store
- π Intelligent Symlinking - GNU Stow-compatible with automatic conflict resolution
- π― Smart Package Discovery - Native OS package manager search (brew, apt, dnf, pacman, apk)
- π Secret Management - Secure storage using OS keychains (macOS Keychain, Linux Secret Service)
- π¨ Template System - Machine-specific configs with variable substitution
- πΏ Git-Based Sync - Keep configs in sync across machines with automatic conflict detection
- π Profile System - Different configs for work, personal, and server machines
- π€ Interactive Wizard - Guided setup with smart defaults
- π Import Support - Migrate from Stow, dotbot, chezmoi, yadm, homesick
- π Rollback Support - Easily revert to previous configurations
- πͺ Hooks System - Run custom scripts before/after installation
- π Dry-Run Mode - Preview changes before applying them
Packages are declared directly in heimdal.yaml using a packages: section. Use common: for packages with the same name across all OS package managers, or per-manager keys (homebrew:, apt:, dnf:, pacman:, apk:) when names differ or a package is OS-specific. A top-level packages: section applies to all profiles; each profile can also define its own packages:.
heimdal:
version: "1"
repo: "[email protected]:you/dotfiles.git"
packages:
common: [git, curl, vim, tmux] # same name everywhere, every profile
homebrew: [mas] # mac only, every profile
profiles:
default:
packages:
common: [ripgrep, fzf]
homebrew: [iterm2]
apt: [build-essential]
work:
extends: default
packages:
homebrew: [slack, zoom]# Search via the native OS package manager
heimdal packages search neovim
# Add a package to heimdal.yaml
heimdal packages add neovim- macOS: Homebrew (formulae + casks), Mac App Store (via
mas) - Debian/Ubuntu: APT
- Fedora/RHEL/CentOS: DNF/YUM
- Arch/Manjaro: Pacman
- Alpine: apk
- β Dependency detection and suggestions
- β Installation status checking
limistah/heimdal (This repo)
The main CLI tool - installation, configuration, and management commands.
Contribute here for:
- π Bug fixes and issue reports
- β¨ New CLI features and commands
- π§ Core functionality improvements
- π Documentation updates
User β Heimdal CLI β Package Manager (brew/apt/dnf/pacman/apk)
βββ Dotfile Management (GNU Stow compatible)
βββ Secret Management (OS Keychain)
βββ Git Sync (with state management)
- π Quick Start Guide
- π¦ Package Management
- π Profile System
- π Dotfile Management
- π¨ Template System
- π Secret Management
- πΏ Git Sync
- βοΈ Configuration Reference
- π Troubleshooting
- ποΈ Architecture Overview
- π State Management - Locking, conflict resolution
- πΊοΈ Module Guide - Codebase structure
Here's a minimal heimdal.yaml to get started:
heimdal:
version: "1"
repo: "[email protected]:you/dotfiles.git"
packages:
common: [git, curl, vim, tmux] # same name everywhere, every profile
homebrew: [mas] # mac only, every profile
profiles:
default:
packages:
common: [ripgrep, fzf]
homebrew: [iterm2]
apt: [build-essential]
work:
extends: default
packages:
homebrew: [slack, zoom]More examples:
# Initialize a new dotfiles repository
heimdal wizard
# Apply your configuration
heimdal apply
# Sync changes to/from Git
heimdal sync
# Check status
heimdal status
# Switch profiles
heimdal profile switch personal
# Validate configuration
heimdal validate# Search for packages via the native OS package manager
heimdal packages search ripgrep
# Add a package to heimdal.yaml
heimdal packages add ripgrep
# List installed packages
heimdal packages list --installed# Dry-run before applying
heimdal apply --dry-run
# Import from existing dotfiles
heimdal import --path ~/old-dotfiles
# Rollback to previous state
heimdal rollback
# View sync history
heimdal history
# Manage secrets
heimdal secret set API_KEY "secret-value"
heimdal secret get API_KEY- π Bug Reports: GitHub Issues
- π‘ Feature Requests: GitHub Discussions
- π¬ Questions: GitHub Discussions
We welcome contributions! Here's how to get involved:
- Fork this repository
- Clone your fork:
git clone <your-fork-url> - Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Run tests:
cargo test - Run clippy:
cargo clippy --all-targets - Commit your changes:
git commit -m 'Add amazing feature' - Push to your fork:
git push origin feature/amazing-feature - Open a Pull Request
See full CLI development guide β
Heimdal uses the following directories:
~/.heimdal/- Heimdal state and datastate.json- Current state (active profile, last sync, etc.)backups/- Backup of overwritten files
~/.dotfiles/- Default dotfiles directory (customizable via config)/usr/local/bin/heimdal- Heimdal binary (or~/.cargo/bin/heimdal)
MIT License - see LICENSE for details
- Inspired by GNU Stow, Homebrew, and various dotfile management tools
- Built with Rust for performance and reliability
- Thanks to all contributors and users!
- Main Repository: https://github.com/limistah/heimdal
- Documentation: https://github.com/limistah/heimdal/wiki
- Crates.io: https://crates.io/crates/heimdal
- Changelog: CHANGELOG.md
Built by @limistah