A tool to manage and synchronize dotfiles across multiple systems.
Project description
Dotfile Manager
A flexible, Python-based tool for managing, synchronizing, and linking your dotfiles across systems using a manifest-driven approach.
Features
- Manifest-based configuration: Supports TOML, YAML, and JSON formats.
- Git integration: Synchronize dotfiles with remote repositories.
- Automatic linking: Create symlinks for dotfiles as specified in the manifest.
- System import: Generate manifests from your current dotfiles.
- Orphaned file detection: Find and manage unmanaged files in your dotfiles directory.
- Customizable: Easily extendable and configurable.
Goals
Check pending features at goals.md
Installation
Clone the repository and install dependencies:
git clone https://github.com/yourusername/dotfile-manager.git
cd dotfile-manager
pip install -e .
Usage
All commands are available via the CLI app:
dfman <command> [options]
Commands Overview
Below are the main commands with usage and examples.
init
Initialize the dotfile manager and create a manifest.
dfman init
- Prompts for manifest format, root directory, repository URL, and other settings.
- Creates a manifest file and initializes the dotfiles directory.
check
Print the current manifest in a human-readable format.
dfman check
sync
Synchronize dotfiles with the remote repository (pull and/or push changes).
dfman sync --pull --save --m "Sync message"
--pull: Pull changes from remote (default: True)--save: Push local changes (default: True)--m: Commit message
review
Show the current status of the dotfiles git repository.
dfman review
link
Create symlinks for dotfiles as specified in the manifest.
dfman link
dfman link ~/.bashrc ~/.vimrc
- If no files are specified, links all dotfiles in the manifest.
from-system
Import dotfiles from your system into the manifest and dotfiles directory.
dfman from-system
dfman from-system ~/.bashrc ~/.vimrc
- Moves/copies files from your home directory into the managed directory and updates the manifest.
download
Clone a remote dotfiles repository and set up the manifest.
dfman download --repository-url <url> --branch main
- Downloads the repository and links the manifest file.
edit-file
Edit a file using your preferred editor and add it to the manifest.
dfman edit-file ~/.bashrc --editor nvim
- Opens the file in the specified editor, creates a symlink, and updates the manifest.
edit-manifest
Edit the manifest file directly in your editor.
dfman edit-manifest --editor nvim
unlink
Remove symlinks for specified dotfiles (or all if none specified).
dfman unlink
dfman unlink ~/.bashrc
remove
Remove dotfiles from the manifest and unlink them.
dfman remove ~/.bashrc ~/.vimrc
list-dotfiles
List all dotfiles in the manifest.
dfman list-dotfiles
map-orphaned-files
Find and map orphaned files in the dotfiles directory (files not tracked in the manifest).
dfman map-orphaned-files
log
Show the git log of the dotfiles repository.
dfman log --limit 20
exec
Execute a command on a dotfile (e.g., open with an editor or print contents).
dfman exec ~/.bashrc --with-command nvim
dfman exec ~/.bashrc
save-changes
Save changes to the manifest and optionally push them to the remote repository.
dfman save-changes --m "Commit message" --save
--m: Commit message for the changes.--save: Push changes to the remote (default: True). If not set, only commits locally.
Manifest Example
[dotfile_manager]
root = "~/dotfiles"
repository_url = "git@github.com:yourusername/dotfiles.git"
repository_branch = "main"
dotfiles = [
{ name = ".bashrc", location = ".bashrc" },
{ name = ".vimrc", location = ".vimrc" }
]
Project Structure
dotfile_manager/
app.py # CLI entrypoint
utils.py # Utilities and helpers
linker/ # Symlink logic
manifest/ # Manifest schema, loader, and format logic
syncer/ # Git integration
Requirements
- Python 3.13+
- escudeiro
- gitpython
- termcolor
- ruamel.yaml
- tomlkit
- orjson
- cyclopts
- questionary
License
Apache License
Contributions welcome! Send your pull requests.
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 dfman-0.1.2.tar.gz.
File metadata
- Download URL: dfman-0.1.2.tar.gz
- Upload date:
- Size: 24.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
97d5232c0a9a746a8313768afc093c87062894603bf8010126e0e7caec709cf9
|
|
| MD5 |
a8b4b65fdbf5f69fc3af3cf9b012fcb4
|
|
| BLAKE2b-256 |
6e248fbafdc863f9d37c95436adb87b68ff3d96f8163afe078cc6750a32cab6f
|
File details
Details for the file dfman-0.1.2-py3-none-any.whl.
File metadata
- Download URL: dfman-0.1.2-py3-none-any.whl
- Upload date:
- Size: 28.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3d8e21f3c148c1ddb5e2506cc7689f86d62714a35ab447290edce7c9b2e7884d
|
|
| MD5 |
e3e6cc463c7e1c800437e05a6c6e6052
|
|
| BLAKE2b-256 |
770ef058775f28ac3297062f6a482c55375f4915a65d55aa3061d7bac10f41fc
|