Skip to main content

dots

CI CodeQL PyPI Python

Yet another dotfiles management tool.

✨ Features

  • 🔗 Dotfiles stored in a central folder and symlinked to their real location
  • 🔁 Automatic git versioning on every change
  • 💻 Per-machine configuration via hostname-based config sections
  • ⚠️ Conflict detection and resolution during sync
  • 🔒 Encryption for sensitive files

📋 Requirements

  • Python 3.12+
  • git

📦 Installation

Install with uv:

uv tool install dotsman

To update to the latest version:

uv tool upgrade dotsman

⚙️ 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

🚀 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.

If the file is already tracked as plaintext, --encrypt encrypts it and removes the tracked plaintext file.

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.

🔒 Encryption

Sensitive dotfiles can be encrypted at rest using age. Encrypted files are safe to push to public repositories.

Setup

  1. Generate an age identity:

    age-keygen -o ~/.age/dots.key
    
  2. Add the identity path to your config (~/.dots.conf):

    [DEFAULT]
    age_identity = ~/.age/dots.key
    
  3. Add files with encryption:

    dots add --encrypt ~/.config/secrets.env
    

How it works

  • Encrypted files are stored in the repo with a .age extension (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 sync detects changes to decrypted files and re-encrypts them automatically
  • On a new machine, dots sync decrypts all .age files and creates symlinks
  • If the age identity is not configured, encrypted files are skipped with a warning during sync

📜 License

BSD 3-Clause. See LICENSE for details.

Metadata

Release files for dotsman 1.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dotsman 1.2.0
File Size Uploaded Provenance Actions
dotsman-1.2.0.tar.gz 41.2 kB With provenance Details for dotsman-1.2.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for dotsman 1.2.0
File Interpreter ABI Platform Actions
dotsman-1.2.0-py3-none-any.whl Python 3 none any Details for dotsman-1.2.0-py3-none-any.whl

Total release size: 56.6 kB

Release files / dotsman-1.2.0.tar.gz

Download URL dotsman-1.2.0.tar.gz
Size 41.2 kB
Tags Source
SHA-256 checksum
How to use checksums
95d03b1b2e686ded5a4f9e693269d053168672a7b4d48c2b8e801f84da2fda2f
BLAKE2b-256 checksum
How to use checksums
f99a199d4083ef5530f5327926a18ad6b9ea5e7dc761754813fb61a3b99e25f4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 26, 2026.

Transparency log

Release files / dotsman-1.2.0-py3-none-any.whl

Download URL dotsman-1.2.0-py3-none-any.whl
Size 15.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
53e5755887584d31528ed18aba037ec52bca0cdc5b1870f5f1345dc1dd0cd94c
BLAKE2b-256 checksum
How to use checksums
4aedee40230f883f242111435e5af0a04138bcf0ce3835e539bcdf72b5ca6f9a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 26, 2026.

Transparency log

Security for dotsman 1.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for dotsman-1.2.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 26, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page