Yet another dotfiles management tool
Project description
dots
Yet another dotfiles management tool.
:sparkles: Features
- :link: Dotfiles stored in a central folder and symlinked to their real location
- :repeat: Automatic git versioning on every change
- :computer: Per-machine configuration via hostname-based config sections
- :warning: Conflict detection and resolution during sync
- :lock: Encryption for sensitive files
:clipboard: Requirements
- Python 3.12+
- git
:package: Installation
Install with uv:
uv tool install dotsman
To update to the latest version:
uv tool upgrade dotsman
:gear: Configuration
The configuration file should be located at ~/.dots.conf.
Settings are organized in sections named after the machine's hostname. The [DEFAULT] section provides fallback values used when no hostname-specific section exists.
Available settings
| Key | Description | Default |
|---|---|---|
repo_dir |
Path to the dotfiles repository | ~/dots |
age_identity |
Path to an age identity file for encryption | none |
ignored_files |
Comma-separated list of glob patterns to skip during sync | none |
Example
[DEFAULT]
repo_dir = ~/dots
[work-laptop]
repo_dir = ~/dotfiles
ignored_files = .bashrc, .config/personal/*
[home-desktop]
age_identity = ~/.age/dots.key
:rocket: Usage
Global options
dots [--config PATH] [--verbose] [--version] COMMAND
| Option | Short | Description |
|---|---|---|
--config |
-c |
Path to config file (default: ~/.dots.conf) |
--verbose |
-v |
Display debug information |
--version |
-V |
Display version and exit |
dots add <file> (alias: a)
Add a file to the repository. The file is copied into the repo and replaced with a symlink.
dots add ~/.bashrc
dots add ~/.config/git/config
| Option | Short | Description |
|---|---|---|
--encrypt |
-e |
Encrypt the file with age before storing in repo |
When --encrypt is used, the file is stored as a .age file in the repo (encrypted at rest), with a decrypted working copy in a gitignored .decrypted/ directory. The symlink points to the decrypted copy so the file remains usable. Requires age_identity to be set in the config.
dots remove <file> (aliases: rm, rem, del, delete)
Remove a file from the repository. The symlink is replaced with the original file.
dots remove ~/.bashrc
dots list (aliases: l, ls)
List all files in the repository and their sync status.
dots list
dots sync (alias: s)
Synchronize the repository with the filesystem. Creates missing symlinks and detects conflicts.
dots sync
| Option | Short | Description |
|---|---|---|
--force-relink |
-r |
Overwrite links that point to the wrong target |
--force-add |
-a |
Overwrite the repo version with the local file |
--force-link |
-l |
Overwrite the local file with the repo version |
--force-add and --force-link are mutually exclusive. Without force flags, dots prompts interactively when conflicts are found.
:lock: Encryption
Sensitive dotfiles can be encrypted at rest using age. Encrypted files are safe to push to public repositories.
Setup
-
Generate an age identity:
age-keygen -o ~/.age/dots.key
-
Add the identity path to your config (
~/.dots.conf):[DEFAULT] age_identity = ~/.age/dots.key
-
Add files with encryption:
dots add --encrypt ~/.config/secrets.env
How it works
- Encrypted files are stored in the repo with a
.ageextension (e.g.,secrets.env.age) - Decrypted working copies live in a gitignored
.decrypted/directory inside the repo - Symlinks point to the decrypted copies, so files are usable as normal
dots syncdetects changes to decrypted files and re-encrypts them automatically- On a new machine,
dots syncdecrypts all.agefiles and creates symlinks - If the age identity is not configured, encrypted files are skipped with a warning during sync
:scroll: License
BSD 3-Clause. See LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dotsman-1.1.0.tar.gz.
File metadata
- Download URL: dotsman-1.1.0.tar.gz
- Upload date:
- Size: 40.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e41e0003ef5a4939988bdd11d8903014508c17bc124d67fc7a4aea13008514a2
|
|
| MD5 |
23bef96919f95466465942f077afc5a1
|
|
| BLAKE2b-256 |
5c6759f223824f30dc928804361d8ddeec8899c9c5377570d5293f642f4cc94e
|
Provenance
The following attestation bundles were made for dotsman-1.1.0.tar.gz:
Publisher:
publish.yml on mdeous/dots
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dotsman-1.1.0.tar.gz -
Subject digest:
e41e0003ef5a4939988bdd11d8903014508c17bc124d67fc7a4aea13008514a2 - Sigstore transparency entry: 1280799628
- Sigstore integration time:
-
Permalink:
mdeous/dots@03fe8b3be296f6499dbb703f56a7f7216ee7c179 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/mdeous
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@03fe8b3be296f6499dbb703f56a7f7216ee7c179 -
Trigger Event:
push
-
Statement type:
File details
Details for the file dotsman-1.1.0-py3-none-any.whl.
File metadata
- Download URL: dotsman-1.1.0-py3-none-any.whl
- Upload date:
- Size: 14.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc4c34b390d28cfc86c6d60db0dd771172330535d274ad138886602e232f13d2
|
|
| MD5 |
9048cd0ac5045bee3cb437c210709bc9
|
|
| BLAKE2b-256 |
7b3210a64110c3a70eb06aa53b6b63b21cdb6e09a420aa2ded96d90cc386c785
|
Provenance
The following attestation bundles were made for dotsman-1.1.0-py3-none-any.whl:
Publisher:
publish.yml on mdeous/dots
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dotsman-1.1.0-py3-none-any.whl -
Subject digest:
bc4c34b390d28cfc86c6d60db0dd771172330535d274ad138886602e232f13d2 - Sigstore transparency entry: 1280799632
- Sigstore integration time:
-
Permalink:
mdeous/dots@03fe8b3be296f6499dbb703f56a7f7216ee7c179 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/mdeous
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@03fe8b3be296f6499dbb703f56a7f7216ee7c179 -
Trigger Event:
push
-
Statement type: