GuideApril 14, 20267 min read

Switching from yadm to ConfigSync

yadm made dotfile management approachable with its git-based workflow. ConfigSync takes that simplicity further with encrypted cloud sync, package tracking, and no git repo to manage.

Why Switch from yadm?

yadm (Yet Another Dotfiles Manager) takes a clever approach: it wraps git to create a bare repository that tracks files directly in your home directory. No symlinks, no copying files around. It feels natural because it is just git under the hood.

But that git-centric design also creates friction. You need a git hosting account, SSH keys configured on every machine, and you must remember to commit and push after every change. Merge conflicts happen when you edit the same file on two machines. And yadm’s alternate file system — while functional — uses a filename-based convention that can be difficult to read and maintain.

ConfigSync removes the git layer entirely. Your files are encrypted and synced to the cloud with configsync push. No repository to maintain, no commits to remember, no merge conflicts. And with watch mode, you can automate the entire process.

Beyond sync, ConfigSync adds capabilities yadm does not have: package tracking across 10+ package managers, a built-in secret store, modules that group related files together, and a web dashboard for managing multiple machines.

How yadm and ConfigSync Differ

yadm stores your dotfiles in a bare git repository at ~/.local/share/yadm/repo.git. Files are tracked in place (no symlinks), but every change requires a git commit and push.

ConfigSync also tracks files in place but syncs encrypted snapshots to Cloudflare R2 instead of a git remote. There is no commit history in the git sense — instead, ConfigSync maintains its own snapshot history that you can browse and roll back with configsync history.

Step-by-Step Migration

Step 1: List everything yadm tracks. This gives you the complete inventory of files to migrate.

List yadm-tracked files
yadm list # Output: # .gitconfig # .ssh/config # .zshrc # .zshenv # .config/nvim/init.lua # .config/starship.toml # ...

Step 2: Install ConfigSync.

Install and initialize
npm install -g @configsync/cli configsync init

Step 3: Add modules for common tools. Instead of tracking individual files, use ConfigSync modules for tools that have multiple config files. Modules automatically know which files belong to each tool.

Add modules
configsync add module ssh configsync add module git configsync add module zsh configsync add module neovim configsync add module vscode

Step 4: Add remaining files. For files that do not belong to a built-in module, add them individually.

Add individual files
configsync add config ~/.config/starship.toml configsync add config ~/.config/alacritty/alacritty.toml configsync add config ~/.tmux.conf

Step 5: Convert alternate files to templates. yadm uses a filename convention for per-OS or per-host files. ConfigSync uses inline template conditionals instead, keeping everything in a single file.

Convert yadm alternates to ConfigSync templates
# yadm: separate files per OS # ~/.config/git/config##os.Darwin # ~/.config/git/config##os.Linux # ConfigSync: single file with conditionals {{#if platform == "darwin"}} [credential] helper = osxkeychain {{#elif platform == "linux"}} [credential] helper = /usr/lib/git-core/git-credential-libsecret {{/if}}

Step 6: Migrate encrypted files. yadm uses GPG to encrypt files listed in ~/.config/yadm/encrypt. ConfigSync encrypts everything by default, so you simply add the files normally.

Migrate encrypted files
# Check which files yadm encrypts cat ~/.config/yadm/encrypt # Just add them to ConfigSync — encryption is automatic configsync add config ~/.aws/credentials configsync add config ~/.npmrc # For standalone secrets, use the secret store configsync secret set GITHUB_TOKEN configsync secret set AWS_SECRET_ACCESS_KEY

Step 7: Convert your bootstrap script. If you use ~/.config/yadm/bootstrap, move its contents to ConfigSync’s bootstrap script location.

Migrate bootstrap script
# Copy yadm bootstrap to ConfigSync location cp ~/.config/yadm/bootstrap ~/.configsync/bootstrap.sh chmod +x ~/.configsync/bootstrap.sh

Step 8: Push to ConfigSync.

Push your environment
configsync push -m "migrated from yadm"

Alternate File Conversion Reference

yadm’s alternate file naming convention maps to ConfigSync template conditionals as follows.

yadm Alternate SyntaxConfigSync Template
##os.Darwin{{#if platform == "darwin"}}
##os.Linux{{#if platform == "linux"}}
##hostname.work-laptop{{#if hostname == "work-laptop"}}
##user.sean{{#if username == "sean"}}
##class.personal{{#if profile == "personal"}}
##distro.Ubuntu{{#if distro == "ubuntu"}}
Key difference: yadm alternate files are entirely separate files — one per OS or host. ConfigSync templates let you keep platform-specific sections within a single file, which is easier to maintain when most of the content is shared.

What You Gain After Migrating

No git repo to manage. No commits, no push/pull to a remote, no merge conflicts when you edit the same file on two machines. ConfigSync handles sync with a single command.

Encrypted cloud sync. Everything is encrypted with AES-256-GCM before leaving your machine. yadm’s GPG encryption only covers files you explicitly list — everything else in your git repo is plaintext.

Package tracking. Run configsync scan to capture your installed packages. Pull on a new machine with --install to automatically install everything you need.

Watch mode. Enable configsync watch to automatically sync changes as you make them. No more forgetting to yadm add and yadm push.

Modules over files. Instead of tracking dozens of individual files, ConfigSync modules group related configurations together. Add one module and all associated files are tracked automatically.

yadm’s git-based approach was a smart starting point. ConfigSync takes the same track-in-place philosophy and adds encryption, cloud sync, packages, and automation on top.

Ready to try ConfigSync?

Sync your entire dev environment across machines in minutes. Free forever for up to 3 devices.