| Crates.io | dots-bin |
| lib.rs | dots-bin |
| version | 0.2.1 |
| created_at | 2025-07-14 19:18:11.48698+00 |
| updated_at | 2025-07-14 19:22:08.315346+00 |
| description | A cozy, simple-to-use dotfiles manager |
| homepage | https://github.com/nik-rev/dots |
| repository | https://github.com/nik-rev/dots |
| max_upload_size | |
| id | 1752205 |
| size | 132,621 |
A cozy, simple to use dotfiles manager written in Rust
A single file dots.toml represents configuration for dots. It defines:
Example config:
# all files from `configs` will be copied to `output`
[[dir]]
input = "configs"
# this expands to your config directory: e.g. ~/.config
output = "{config}"
# each link's `path` is relative to the `dots.toml` file
[[link]]
url = "https://raw.githubusercontent.com/catppuccin/nushell/05987d258cb765a881ee1f2f2b65276c8b379658/themes/catppuccin_mocha.nu"
path = "configs/nushell/catppuccin.nu"
[[link]]
url = "https://raw.githubusercontent.com/catppuccin/yazi/1a8c939e47131f2c4bd07a2daea7773c29e2a774/themes/mocha/catppuccin-mocha-blue.toml"
path = "configs/yazi/theme.toml"
With the following ~/dots.toml:
[[dir]]
input = "my_configs"
output = "{config_dir}/foo"
All files within ~/my_configs (recursively) will be copied to the {config_dir}/foo directory, at the same location.
So a file ~/my_configs/foo/bar.txt will be copied to ~/.config/foo/bar.txt on Linux (on Windows and MacOS it will use the platform's respective directory)
{config_dir} expands to the appropriate config directory on your platform. These are the available expansions:
{config_dir}: Config directory{cache_dir}: Cache directory{state_dir}: State directoryYou can control where each file will be copied by adding a single line at the top of a file. So if configs/glazewm.yaml's first line is this:
@dots --path "{config}/.glzr/glazewm/config.yaml"
It will copy the file to the appropriate location in the home folder, instead of copying it in the config directory.
As long as the first line contains @dots ... then it will work.
You can also use {$ENV_VARIABLE} in interpolations, e.g. {$HOME}
You can put links into your dots.toml:
[[link]]
url = "https://raw.githubusercontent.com/catppuccin/nushell/05987d258cb765a881ee1f2f2b65276c8b379658/themes/catppuccin_mocha.nu"
path = "my_configs/nushell/catppuccin.nu"
sha256 = "d639441cd3b4afe1d05157da64c0564c160ce843182dfe9043f76d56ef2c9cdf"
That will download file at the specified url into ~/my_configs/nushell/catppuccin.nu.
A sha256 can be optionally provided for security. If the file at that location's sha256 does not match the provided sha256, it will not be downloaded.
Each file in any input directory in [[dir]] has full support of the handlebars templating language. One use case of this is to avoid duplicating the same content in a single file.
Say you have the following ~/my_configs/helix/config.toml:
[keys.normal]
# DEFAULT: A-C
A-c = "copy_selection_on_prev_line"
# DEFAULT: A-J
C-j = "join_selections_space"
[keys.select]
# DEFAULT: A-C
A-c = "copy_selection_on_prev_line"
# DEFAULT: A-J
C-j = "join_selections_space"
There is duplication. In order to avoid this, you can do this:
#{{#* inline "rebindings" }}
# DEFAULT: A-C
A-c = "copy_selection_on_prev_line"
# DEFAULT: A-J
C-j = "join_selections_space"
#{{/inline}}
[keys.normal]
#{{> rebindings }}
[keys.select]
#{{> rebindings }}
All instances of {{> rebindings }} will be replaced by the inline block. This is just one of many features that a templating language provides!
Supported platforms: Linux, macOS and Windows
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/nik-rev/dots/releases/latest/download/dots-installer.sh | sh
powershell -ExecutionPolicy Bypass -c "irm https://github.com/nik-rev/dots/releases/latest/download/dots-installer.ps1 | iex"
brew install nik-rev/tap/dots
cargo install dots
nix profile install github:nik-rev/dots/main