Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,13 +133,13 @@ There are no git merges, rebases or clever heuristics. The full design is in [Ho

## Comparison

| | dotsync | chezmoi | yadm | GNU Stow | Mackup |
|---|---|---|---|---|---|
| You edit | the real file | the source, or the file then `chezmoi re-add` | the real file | the real file, through its symlink | the real file |
| Other machines get changes | automatically | when you run `chezmoi update` | when you run `yadm pull` | when you pull the directory | when you run `mackup restore` |
| Same file changed on two machines | per-file conflict: both kept, you choose | git merge conflict in the source; asks before overwriting a file changed since the last apply | git merge conflict | git merge conflict, if the directory is a git repository | whatever the storage provider does |
| Secrets | held back before upload | templates that read password managers; encryption | encryption | not handled | not handled |
| Differences per machine | per-OS entries, per-machine exclusions | templates | alternate files, templates | separate packages | not handled |
| | dotsync | chezmoi | yadm | GNU Stow | Mackup | mise dotfiles |
|---|---|---|---|---|---|---|
| You edit | the real file | the source, or the file then `chezmoi re-add` | the real file | the real file, through its symlink | the real file | the real file, or the source for copied and templated files |
| Other machines get changes | automatically | when you run `chezmoi update` | when you run `yadm pull` | when you pull the directory | when you run `mackup restore` | automatically with the history watcher and `history.sync = "sync"`, otherwise when you run `mise dot sync` |
| Same file changed on two machines | per-file conflict: both kept, you choose | git merge conflict in the source; asks before overwriting a file changed since the last apply | git merge conflict | git merge conflict, if the directory is a git repository | whatever the storage provider does | per-file conflict, but sync pauses for every tracked file until you choose |
| Secrets | held back before upload | templates that read password managers; encryption | encryption | not handled | not handled | encryption; credential files skipped by name |
| Differences per machine | per-OS entries, per-machine exclusions | templates | alternate files, templates | separate packages | not handled | templates, per-OS and per-profile variants |

dotsync deliberately does **not** do templating. If you need one file to differ per machine in complicated ways, chezmoi is excellent. dotsync is for people who want their files to simply be the same everywhere, with no ceremony.

Expand Down
22 changes: 12 additions & 10 deletions website/src/content/docs/concepts/comparison.mdx
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
---
title: Comparison with other tools
description: How dotsync compares with chezmoi, yadm, GNU Stow and Mackup, when to choose each, and how to use them together.
description: How dotsync compares with chezmoi, yadm, GNU Stow, Mackup and mise, when to choose each, and how to use them together.
---

There are many good dotfile tools, and they solve different problems. Here's an honest comparison.

## At a glance

| | dotsync | chezmoi | yadm | GNU Stow | Mackup |
|---|---|---|---|---|---|
| **Model** | two-way sync | source state, applied to your home | your home is a git work tree | symlinks into a directory | copies to and from a cloud-storage folder |
| **You edit** | the real file | the source, or the file then `chezmoi re-add` | the real file | the real file, through its symlink | the real file |
| **Other machines get changes** | automatically | when you run `chezmoi update` | when you run `yadm pull` | when you pull the directory | when you run `mackup restore` |
| **Same file changed on two machines** | per-file conflict: both kept, you choose | git merge conflict in the source; asks before overwriting a file changed since the last apply | git merge conflict | git merge conflict, if the directory is a git repository | whatever the storage provider does |
| **Secrets** | held back before upload | templates that read password managers; encryption | encryption | not handled | not handled |
| **Differences per machine** | per-OS entries, per-machine exclusions | templates | alternate files, templates | separate packages | not handled |
| | dotsync | chezmoi | yadm | GNU Stow | Mackup | mise dotfiles |
|---|---|---|---|---|---|---|
| **Model** | two-way sync | source state, applied to your home | your home is a git work tree | symlinks into a directory | copies to and from a cloud-storage folder | files linked, copied or templated from a source, or tracked in place with git history |
| **You edit** | the real file | the source, or the file then `chezmoi re-add` | the real file | the real file, through its symlink | the real file | the real file, or the source for copied and templated files |
| **Other machines get changes** | automatically | when you run `chezmoi update` | when you run `yadm pull` | when you pull the directory | when you run `mackup restore` | automatically with the history watcher and `history.sync = "sync"`, otherwise when you run `mise dot sync` |
| **Same file changed on two machines** | per-file conflict: both kept, you choose | git merge conflict in the source; asks before overwriting a file changed since the last apply | git merge conflict | git merge conflict, if the directory is a git repository | whatever the storage provider does | per-file conflict, but sync pauses for every tracked file until you choose |
| **Secrets** | held back before upload | templates that read password managers; encryption | encryption | not handled | not handled | encryption; credential files skipped by name |
| **Differences per machine** | per-OS entries, per-machine exclusions | templates | alternate files, templates | separate packages | not handled | templates, per-OS and per-profile variants |

## When to choose which

Expand All @@ -26,10 +26,12 @@ There are many good dotfile tools, and they solve different problems. Here's an

**Choose GNU Stow** if you want the smallest possible tool, you're happy running it by hand, and your applications don't replace symlinks.

**Choose mise's dotfiles** if you already use mise to set up machines (packages, services, tools) and want dotfiles in the same configuration, with templates and a full edit history you can roll back. Its two-way sync needs the history watcher and `history.sync = "sync"`. It doesn't scan contents for secrets, so encrypt anything sensitive before its first save. See [mise's dotfiles docs](https://mise.jdx.dev/dotfiles.html).

**Choose Mackup** if you mainly want to back up and restore application settings, especially macOS application preferences, through a folder in your cloud storage.

## Using them together

dotsync only touches the files in its manifest, so it coexists with other tools as long as they don't manage the **same** files. A common setup is dotsync for everyday configuration, and chezmoi for a few heavily templated files.
dotsync only touches the files in its manifest, so it coexists with other tools as long as they don't manage the **same** files. A common setup is dotsync for everyday configuration, and chezmoi for a few heavily templated files. If you use both dotsync and mise, see [Use with mise](/dotsync/guides/mise/#mises-own-dotfiles).

Moving over? See [Migrate from another tool](/dotsync/guides/migrate/).
10 changes: 10 additions & 0 deletions website/src/content/docs/guides/mise.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,16 @@ Copy it to each new machine yourself, once. dotsync never syncs it, and it doesn

</Steps>

## mise's own dotfiles

mise can also manage dotfiles itself, with `mise dot` and a `[dotfiles]` section in its config. It links, copies or templates files from a source directory, and it can *track* files where they are, keeping their history in git. With the history watcher and `history.sync = "sync"`, it syncs tracked files between machines too. See [mise's dotfiles docs](https://mise.jdx.dev/dotfiles.html), and the [comparison](/dotsync/concepts/comparison/) for how it differs from dotsync.

You can use both, but **never let both manage the same file.** Each would see the other's writes as local edits and push them back, and the two histories would keep fighting over the file. In practice:

- **Pick one tool per file.** If mise tracks `~/.zshrc`, don't `dotsync add` it, and the reverse.
- **Watch out for `~/.config/mise/` itself.** Syncing it with dotsync also syncs its `[dotfiles]` entries, including the tracking entries mise writes to `conf.d/dotfiles-tracking.toml`. Every machine then starts managing those files with mise as well. Either keep dotfile entries out of the synced config (for example with `--ignore conf.d/dotfiles-tracking.toml`), or let mise manage its own config and don't add it to dotsync.
- **Moving a file from mise to dotsync:** for a tracked file, `mise dot untrack <file>`; the file stays where it is. For a linked file, first replace the symlink with a real copy of its source, then delete its `[dotfiles]` entry. Then `dotsync add <file>`.

## Project tasks and trust

Project `mise.toml` files can define tasks and `exec()` templates, so mise asks you to `mise trust` them. Your global `config.toml` is your own file and doesn't need that. Once it's synced, **anyone who can push to your dotfiles repository can change what it runs** the next time mise loads it. The same is true of your shell startup files, so treat the repository with the same care: keep it private and protect the credentials that can push to it.
Loading