-
Notifications
You must be signed in to change notification settings - Fork 0
FAQ
Frequently asked questions about Heimdal.
- General
- Getting Started
- Configuration
- Package Management
- Dotfiles & Symlinks
- Git & Sync
- Profiles
- Secrets & Templates
- Comparison
Heimdal is a dotfile and system configuration manager. It helps you:
- Manage dotfiles across multiple machines with symlinking
- Install packages from various package managers (Homebrew, APT, DNF, Pacman, APK, MAS)
- Sync configurations using Git
- Use multiple profiles for different machines
- Store secrets securely in OS keychains
- Import from existing tools (Stow, dotbot, chezmoi, yadm, homesick)
- macOS — Full support (Homebrew, Homebrew Casks, MAS)
-
Linux — Full support (APT, DNF, Pacman, APK)
- Debian/Ubuntu
- Fedora/RHEL
- Arch Linux
- Alpine Linux
| Feature | Heimdal | GNU Stow |
|---|---|---|
| Symlinks | Yes | Yes |
| Package management | Yes | No |
| Git sync | Yes | No |
| Multiple profiles | Yes | No |
| Secret management | Yes | No |
| Templates | Yes | No |
| Import from Stow | Yes | — |
Heimdal is Stow-compatible — you can import existing Stow setups with heimdal import --from stow.
No. There is no external package database, no network fetching, and no local cache. Packages are defined directly in heimdal.yaml. packages search and packages info shell out to the native package manager.
macOS (Homebrew):
brew install limistah/tap/heimdalAny platform (Cargo):
cargo install heimdalSee Installation for all methods.
Option 1: Fresh start (recommended)
heimdal wizardOption 2: Import from an existing tool
heimdal import --path ~/.dotfiles --from stowOption 3: Clone existing dotfiles
heimdal init --repo git@github.com:you/dotfiles.git --profile default
heimdal applySee Quick Start for step-by-step guidance.
Yes. Use --dry-run on any apply command:
heimdal apply --dry-run| File | Location |
|---|---|
| Configuration | <dotfiles_path>/heimdal.yaml |
| State |
~/.heimdal/state.json (not inside dotfiles dir) |
| Secret names manifest | <dotfiles_path>/.heimdal/secrets_manifest.json |
| Secret values | OS keychain (macOS Keychain / Linux Secret Service) |
heimdal.yaml is the main configuration file. It defines:
- Global settings (
heimdal.version,heimdal.repo) - Top-level packages (applied to every profile)
- Profiles (packages, dotfiles, templates, hooks, ignore)
Minimum valid config:
heimdal:
version: "1"
profiles:
default:
packages:
homebrew: [git, vim]
dotfiles:
- .vimrcIn the root of your dotfiles repository:
~/.dotfiles/
├── heimdal.yaml ← here
├── .vimrc
└── .zshrc
heimdal validateThis checks YAML syntax, required fields, valid profile extends references, and hook syntax.
| Key | Manager | Platform |
|---|---|---|
common |
Detected PM | Any OS |
homebrew |
Homebrew | macOS / Linux |
homebrew_casks |
Homebrew Casks | macOS |
apt |
APT | Debian / Ubuntu |
dnf |
DNF | Fedora / RHEL |
pacman |
Pacman | Arch Linux |
apk |
APK | Alpine Linux |
mas |
Mac App Store | macOS |
Heimdal auto-detects the OS and installs only from the manager(s) present on the current machine. Keys for other platforms are silently skipped:
packages:
homebrew: [neovim] # used only on macOS/Linux with Homebrew
apt: [neovim] # used only on Debian/Ubuntu
dnf: [neovim] # used only on Fedora/RHELcommon is for packages that have the same name across all package managers. Heimdal installs them via the first available PM on the current OS:
packages:
common: [git, curl, vim] # installs on any OS via detected PMNo. Heimdal does not provide packages update, packages upgrade, or packages outdated commands. Use the native package manager for updates:
brew upgrade # macOS
sudo apt upgrade # Debian/Ubuntu
sudo dnf upgrade # Fedoraheimdal packages search <query>
# or directly:
brew search <name>
apt-cache search <name>Heimdal creates symlinks from files in your dotfiles repository to their expected locations in ~:
~/.dotfiles/.vimrc → ~/.vimrc (symlink)
Changes to ~/.dotfiles/.vimrc are immediately visible at ~/.vimrc.
Heimdal exits with an error and reports the conflict. Resolve with:
heimdal apply --backup # backs up the existing file, then creates the symlink
heimdal apply --force # overwrites the existing fileIf dotfiles: is empty or omitted, Heimdal walks the top level of your dotfiles directory and symlinks everything (depth-1 only), identical to how GNU Stow works. This means existing Stow repositories work with Heimdal without any configuration changes.
Yes:
profiles:
default:
ignore: [".DS_Store", "*.md", "*.swp"]For local use, no. For syncing across machines, yes — Git is required.
heimdal sync runs:
-
git pullfrom the remote - Resolves any conflicts (if needed, prompts you)
heimdal apply
Use heimdal commit --push or push directly with Git:
heimdal commit -m "Update configs" --push
# or
heimdal commit -m "Update configs"
git pushheimdal autosync enable --interval 1hHeimdal surfaces the conflict from git pull. Resolve it with standard Git tools:
vim .vimrc # edit the conflicted file
git add .vimrc
git commit
heimdal applyProfiles are named configurations for different machines or use cases:
profiles:
work-mac:
packages:
homebrew: [kubectl, docker]
personal-linux:
packages:
apt: [steam, gimp]heimdal profile switch work-mac
heimdal applyYes, with extends:. When a child extends a parent:
-
packages,dotfiles,templates,ignoreare unioned -
hooksare replaced by the child
profiles:
default:
packages:
common: [git, vim]
work:
extends: default # gets git and vim, plus adds slack
packages:
homebrew: [slack]# Store in OS keychain
heimdal secret add github_token --value "ghp_..."
# Use in templates
# {{ secrets.github_token }}It lives at <dotfiles_path>/.heimdal/secrets_manifest.json and lists the names of secrets required by your setup. It contains no values — only names — so it is safe to commit. It helps you know which secrets to set on a new machine.
No. Secret values are per-machine by design. You must run heimdal secret add on each machine. The names manifest is synced via Git so you know which secrets to set.
| Variable | Description |
|---|---|
{{ os }} |
macos or linux
|
{{ hostname }} |
Machine hostname |
{{ user }} |
Current username |
{{ home }} |
Home directory path |
{{ env.VAR }} |
Environment variable VAR |
{{ secrets.NAME }} |
Secret value from keychain |
Use Heimdal if you want package management, profiles, secrets, or templates alongside symlinks. Use Stow if you only need symlinks and prefer minimal tooling. Heimdal can import Stow setups.
Heimdal adds package management and has a simpler, YAML-only config. chezmoi has more templating features (Go templates) and encryption. Heimdal can import chezmoi setups.
Heimdal adds package management, profiles, and secrets. dotbot is Python-based with a plugin system. Heimdal can import dotbot setups.
Heimdal adds package management and profiles. yadm is Git-native with GPG encryption. Heimdal can import yadm setups.
- Documentation: Quick Start, Troubleshooting, Commands Overview
- Community: GitHub Issues, Discussions
-
Debugging:
heimdal apply --verbose
- Check existing issues
- Open a new issue with:
- Heimdal version:
heimdal --version - OS:
uname -a - Sanitized
heimdal.yaml - Full error message
- Steps to reproduce
- Heimdal version: