|
2 | 2 |
|
3 | 3 | A modular, cross-platform dotfile manager. Define your entire system setup — packages, files, binaries, and scripts — in a single `dotular.yaml`, then apply it on any machine. |
4 | 4 |
|
| 5 | +## Why dotular? |
| 6 | + |
| 7 | +Most dotfile managers only manage **files**. You still need a separate bootstrap script to install packages, download binaries, configure OS settings, and glue everything together. That script inevitably becomes a fragile, untested mess of `if` statements for each platform. |
| 8 | + |
| 9 | +dotular replaces all of that with a single declarative YAML file. |
| 10 | + |
| 11 | +### How it compares |
| 12 | + |
| 13 | +| | **dotular** | **chezmoi** | **GNU Stow** | **yadm** | **mackup** | |
| 14 | +|---|---|---|---|---|---| |
| 15 | +| Manages files | Yes | Yes | Yes | Yes | Yes | |
| 16 | +| Installs packages | Yes — brew, apt, winget, and 10+ managers | No | No | No | No | |
| 17 | +| Downloads binaries | Yes — archives, extraction, versioning | No | No | No | No | |
| 18 | +| Runs scripts | Yes — local and remote, with skip/verify | Templates only | No | Bootstrap only | No | |
| 19 | +| OS settings | Yes — macOS `defaults`, extensible | No | No | No | No | |
| 20 | +| Cross-platform config | One file, per-OS paths and packages | Separate templates | Symlinks only | Git + encryption | macOS only | |
| 21 | +| Atomicity | Snapshot + rollback per module | No | No | No | No | |
| 22 | +| No templating language | Plain YAML — no Go templates to learn | Go `text/template` | N/A | Jinja2 (alt) | N/A | |
| 23 | +| Shareable modules | Registry with parameters and overrides | Community scripts | No | No | No | |
| 24 | +| Audit log | Built-in, append-only JSON | No | No | No | No | |
| 25 | + |
| 26 | +### The core idea |
| 27 | + |
| 28 | +A "module" in dotular groups everything a tool needs — the package install, its config files, post-install scripts, binary downloads, and OS settings — into one unit. Apply a single module to fully set up one tool. Apply all modules to bootstrap an entire machine. |
| 29 | + |
| 30 | +```yaml |
| 31 | +- name: Neovim |
| 32 | + items: |
| 33 | + - binary: nvim # download the binary |
| 34 | + source: |
| 35 | + macos: https://...nvim-macos.tar.gz |
| 36 | + linux: https://...nvim-linux.tar.gz |
| 37 | + install_to: ~/.local/bin |
| 38 | + - directory: nvim # push config files |
| 39 | + destination: ~/.config |
| 40 | + - run: nvim --headless "+Lazy sync" +qa # install plugins |
| 41 | +``` |
| 42 | +
|
| 43 | +No bootstrap script. No platform `if`-statements. One file, any machine. |
| 44 | + |
| 45 | +--- |
| 46 | + |
5 | 47 | ## Features |
6 | 48 |
|
7 | 49 | - **Modules** — group related items; apply one or all |
|
0 commit comments