Heimdal
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 | π¦ Package Database | π¬ Discussions
β‘ Quick Start
Installation
Homebrew (macOS)
APT (Debian/Ubuntu)
# One-line setup
|
# Or manual
|
|
&&
Cargo (All Platforms)
Universal installer
|
More installation options: Installation Guide β
Setup (2 minutes)
New to dotfiles?
The 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?
Cloning to a new machine?
β¨ Key Features
- π¦ 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 - Fuzzy search, tags, groups, and 60+ curated packages
- π 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
π¦ Package System
Heimdal includes a powerful package database with 60+ popular development tools, smart search, and curated groups.
Search & Install
# Fuzzy search with intelligent scoring
# Browse by tags
# Install pre-configured groups
# Get package info
# Check for outdated packages
# Upgrade all outdated packages
Supported Package Managers
- macOS: Homebrew (formulae + casks), Mac App Store (via
mas) - Debian/Ubuntu: APT
- Fedora/RHEL/CentOS: DNF/YUM
- Arch/Manjaro: Pacman
Available Package Groups
Pre-configured collections for common workflows:
essential- Core CLI tools (git, curl, vim, tmux)web-dev- Modern web development (node, yarn, docker, postgres, redis)rust-dev- Rust ecosystem (rust, cargo, rust-analyzer, ripgrep, fd, bat)python-dev- Python development (python, pip, pipenv, pyenv)go-dev- Go development (go, gopls, docker, kubectl)devops- Infrastructure tools (terraform, ansible, docker, kubectl, helm)data-science- Data analysis (python, jupyter, pandas, postgresql)terminal- Enhanced terminal experience (tmux, fzf, ripgrep, bat, delta)
Smart Features
- β Dependency detection and suggestions
- β Outdated package detection
- β Cross-platform package mapping
- β Installation status checking
- β Fuzzy search with typo tolerance
- β Tag-based filtering
- β Automatic suggestions based on project files
Want to add a package? See the Package Contribution Guide β
ποΈ Architecture
Heimdal consists of two repositories:
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
limistah/heimdal-packages
The package metadata database - YAML definitions compiled to binary format (20KB, 60+ packages).
Contribute here for:
- π¦ Adding new packages
- π·οΈ Updating package metadata
- π Package descriptions and tags
- π― New package groups
Package Contribution Guide β
How It Works
User β Heimdal CLI β Package Database (60+ packages)
βββ Homebrew / APT / DNF / Pacman / MAS
βββ Dotfile Management (GNU Stow compatible)
βββ Secret Management (OS Keychain)
βββ Git Sync (with state management)
The package database is downloaded from GitHub Releases and cached locally (~/.heimdal/cache/packages.db). It auto-updates every 7 days.
π Documentation
For Users
- π Quick Start Guide
- π¦ Package Management
- π Profile System
- π Dotfile Management
- π¨ Template System
- π Secret Management
- πΏ Git Sync
- βοΈ Configuration Reference
- π Troubleshooting
For Contributors
Technical Docs
- ποΈ Architecture Overview
- π State Management - Locking, conflict resolution
- πΎ Package Database Design - Binary format, indexing
- πΊοΈ Module Guide - Codebase structure
π― Example Configuration
Here's a minimal heimdal.yaml to get started:
global:
dotfiles_dir: ~/.dotfiles
ignore_patterns:
- ".git"
- "*.swp"
- ".DS_Store"
package_sources:
packages:
- git
- neovim
- tmux
- fzf
groups:
- rust-dev
profiles:
work:
packages:
- docker
- kubectl
- terraform
dotfiles:
targets:
- path: ~/.dotfiles/work
stow: true
templates:
email: "work@example.com"
personal:
packages:
- spotify
dotfiles:
targets:
- path: ~/.dotfiles/personal
stow: true
templates:
email: "personal@example.com"
More examples:
π Usage Examples
Basic Workflow
# Initialize a new dotfiles repository
# Apply your configuration
# Sync changes to/from Git
# Check status
# Switch profiles
# Validate configuration
Package Management
# Search for packages
# Install a package
# Install a package group
# List installed packages
# Check for outdated packages
# Upgrade all packages
Advanced Features
# Dry-run before applying
# Import from existing dotfiles
# Rollback to previous state
# View sync history
# Manage secrets
π¬ Community & Support
- π Bug Reports: GitHub Issues
- π‘ Feature Requests: GitHub Discussions
- π¬ Questions: GitHub Discussions
- π¦ Package Requests: heimdal-packages Issues
π€ Contributing
We welcome contributions! Here's how to get involved:
CLI Development
- 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 β
Package Contributions
Want to add a package to the database?
- Head to
limistah/heimdal-packages - Follow the contribution guide
- Create a YAML file for your package
- Run validation:
cargo run --bin validate - Submit a Pull Request
Package contributions are quick and easy - most packages take <5 minutes to add!
π§ Directory Structure
Heimdal uses the following directories:
~/.heimdal/- Heimdal state and datastate.json- Current state (active profile, last sync, etc.)cache/packages.db- Cached package databasebackups/- Backup of overwritten files
~/.dotfiles/- Default dotfiles directory (customizable via config)/usr/local/bin/heimdal- Heimdal binary (or~/.cargo/bin/heimdal)
π License
MIT License - see LICENSE for details
π Acknowledgments
- Inspired by GNU Stow, Homebrew, and various dotfile management tools
- Built with Rust for performance and reliability
- Thanks to all contributors and users!
π Links
- Main Repository: https://github.com/limistah/heimdal
- Package Database: https://github.com/limistah/heimdal-packages
- Documentation: https://github.com/limistah/heimdal/wiki
- Crates.io: https://crates.io/crates/heimdal
- Changelog: CHANGELOG.md
Built by @limistah