A powerful CLI tool to profile your OS by saving, applying, exporting, and importing system configurations as named profiles. Designed to manage dot files and service configurations in a centralized Git repository (local or remote), dotctl enables seamless system replication across machines. Supports pre/post hook scripts, making it ideal for setting up servers or desktops with consistent environments.
Project description
DotCtl
dotctl is a powerful CLI tool to manage, save, apply, export, and import system configurations as named profiles.
It helps centralize dotfiles and service configurations in Git repositories for seamless replication across systems.
Designed for developers and sysadmins, it supports pre/post hook scripts and is ideal for setting up consistent environments across desktops and servers.
๐ Table of Contents
- DotCtl
๐ Features
- ๐ฆ Profile Management โ Create, switch, save, remove, and apply system profiles.
- ๐ Pre/Post Hooks โ Run scripts before or after activating a profile (e.g., install packages, restart services).
- ๐ Git Integration โ Sync profiles with local or remote Git repositories.
- ๐ Portable Configs โ Export/import profiles using
.dtsvfiles for easy backups and sharing. - โ๏ธ Custom Configs โ Define tracking rules via
dotctl.yaml.
๐ Profile Config Structure (dotctl.yaml)
The dotctl.yml config file defines what files and directories to track, save, and export as part of a system profile. This enables seamless migration, sharing, and restoration of system configs and personalizationsโperfect for dotfiles, apps, or entire setups like KDE.
๐ง Concept Overview
The config has two main sections:
save:
Specifies config files or directories that should be version-controlled (typically small files like dotfiles).
These are committed to Git and restored viadotctl apply.export:
For large or non-versioned files (like fonts, themes, or binaries) that shouldn't go into Git, but you still want to package and move usingdotctl export/import.
This is helpful in offline environments or when syncing across machines.
Each section can define any number of data blocks, and every block contains:
location: A base directory (like$HOMEor$CONFIG_DIR).entries: A list of files/directories to include relative to thelocation.
๐ Available Path Keys
To simplify path definitions, these keys can be used in location:
| Key | Path |
|---|---|
$HOME |
/home/<user> |
$APP_DIR |
~/.dotctl |
$CONFIG_DIR |
~/.config |
$SHARE_DIR |
~/.local/share |
$BIN_DIR |
~/.local/bin |
$SYS_SHARE_DIR |
/usr/share |
$SYS_CONFIG_DIR |
/etc |
Use them to make profiles portable across systems.
โ Example: Minimal Config
save:
configs:
location: $HOME
entries:
- test.txt
export:
share_folder:
location: $HOME/.local/share
entries: []
home_folder:
location: $HOME/
entries: []
๐ป Real World: Full Ubuntu + KDE Config
save:
configs:
location: $CONFIG_DIR
entries:
- gtk-2.0
- gtk-3.0
- gtk-4.0
- Kvantum
- latte
- dolphinrc
- konsolerc
- kcminputrc
- kdeglobals
- kglobalshortcutsrc
- klipperrc
- krunnerrc
- kscreenlockerrc
- ksmserverrc
- kwinrc
- kwinrulesrc
- plasma-org.kde.plasma.desktop-appletsrc
- plasmarc
- plasmashellrc
- gtkrc
- gtkrc-2.0
- lattedockrc
- breezerc
- oxygenrc
- lightlyrc
- ksplashrc
- khotkeysrc
- autostart
app_layouts:
location: $HOME/.local/share/kxmlgui5
entries:
- dolphin
- konsole
home_folder:
location: $HOME/
entries:
- .zshrc
- .p10k.zsh
sddm_configs:
location: $SYS_CONFIG_DIR
entries:
- sddm.conf.d
export:
home_folder:
location: $HOME/
entries:
- .fonts
- .themes
- .icons
- .wallpapers
- .conky
- .zsh
- .bin
- bin
share_folder:
location: $SHARE_DIR
entries:
- plasma
- kwin
- konsole
- fonts
- kfontinst
- color-schemes
- aurorae
- icons
- wallpapers
root_share_folder:
location: $SYS_SHARE_DIR
entries:
- plasma
- kwin
- konsole
- fonts
- kfontinst
- color-schemes
- aurorae
- icons
- wallpapers
- Kvantum
- themes
sddm:
location: $SYS_SHARE_DIR/sddm
entries:
- themes
๐ฆ Profile Usage Flow (e.g., nginx)
For a service like nginx, your profile might:
save:files like/etc/nginx/nginx.conf,/etc/nginx/sites-*- Include a pre-hook to install nginx (
apt-get install -y nginx) - Use a post-hook to reload the service (
systemctl reload nginx)
๐ Profile Workflow Diagram
This diagram shows the typical lifecycle of using a dotctl profile, from saving configs to applying them on another machine:
โโโโโโโโโโโโโโโโ
โ dotctl.yml โ
โโโโโโโโฌโโโโโโโโ
โ
โโโโโโโโโโโผโโโโโโโโโโโ
โ `save` Section โ โโโโโ Config Files
โโโโโโโโโโฌโโโโโโโโโโโโ
โ
โโโโโโโโโโผโโโโโโโโโโโโ
โ dotctl save โ
โโโโโโโโโโฌโโโโโโโโโโโโ
โ
โผ
Push to Git Repository
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโ
โ Transfer to New PC โ
โโโโโโโโโโฌโโโโโโโโโโโโโ
โ
โโโโโโโโโผโโโโโโโโโโโ
โ dotctl apply โ
โโโโโโโโโฌโโโโโโโโโโโ
โ
โโโโโโโโโโโโโผโโโโโโโโโโโโโ
โ Pre-hook (e.g. install)โ
โโโโโโโโโโโโโฌโโโโโโโโโโโโโ
โผ
Apply saved config files
โ
โโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโ
โ Post-hook (e.g. restart/reload)โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโ
โ dotctl export โ
โโโโโโโโโโฌโโโโโโโโโโโโโ
โผ
Create `.dtsv` file
โ
Transfer `.dtsv` file
โผ
โโโโโโโโโโโโโโโโโโโโโโโ
โ dotctl import โ
โโโโโโโโโโโโโโโโโโโโโโโ
๐ Profile Block Table
| Section | Field | Description |
|---|---|---|
save |
location |
Base path of the tracked files (can use key like $CONFIG_DIR) |
entries |
List of files/folders to track under that location | |
export |
location |
Base path of export files (e.g., large assets not suited for Git) |
entries |
List of assets or binaries to package in .dtsv |
๐ Example Workflow Table
| Action | Command | Description |
|---|---|---|
| Save configs | dotctl save |
Pulls files defined in save and stores in repo |
| Export assets | dotctl export |
Package large, non-Git assets into .dtsv file |
| Transfer assets | scp profile.dtsv ... |
Manually copy to another machine |
| Import assets | dotctl import |
Unpack .dtsv on another system |
| Apply profile | dotctl apply |
Pull from repo, run pre/post hooks, and apply saved configs |
๐ง Installation
pip install dotctl
๐ Usage
dotctl [OPTIONS] <COMMAND> [ARGS]
Run dotctl -h for global help or dotctl <COMMAND> -h for command-specific help.
๐ ๏ธ Commands
๐ init
Initialize a new profile.
dotctl init [-h] [-u <git-url>] [-p <profile>] [-c <config-path>] [-e <env>]
Examples:
dotctl init -e kde
dotctl init -u https://github.com/user880/dots.git -p mydesktop
dotctl init -c ./my_custom_config.yaml
Options:
-e, --envโ Target environment (e.g., kde, gnome, server).-u, --urlโ Git URL to clone profile from.-p, --profileโ Activate this profile after init.-c, --configโ Path to custom YAML config.
๐พ save
Save current system state to the active profile.
dotctl save [-h] [-p <password>] [--skip-sudo] [profile]
Examples:
dotctl save
dotctl save my_web_server --skip-sudo
dotctl save my_web_server -p mYsecretp@ssw0rd
Options:
--skip-sudoโ Ignore restricted resources.-p, --passwordโ Password for restricted resources.
๐ list / ls
List all profiles.
dotctl list [-h] [--details] [--fetch]
Examples:
dotctl list
dotctl list --details
dotctl list --fetch
Options:
--detailsโ Show extended info.--fetchโ Refresh remote data.
๐ switch / sw
Switch to another profile.
dotctl switch [-h] [--fetch] [profile]
Examples:
dotctl switch MyProfile
dotctl sw MyProfile --fetch
Options:
--fetchโ Refresh profile info before switching.
๐ create / new
Create a new, empty profile.
dotctl create [-h] [--fetch] [-c <path>] [-e <env>] profile
Examples:
# Create a new profile from current active profile.
dotctl create myserver
# Create a empty new profile from a specific environment.
dotctl create -e kde
# Create a empty new profile from a custom config.
dotctl create -c ./my_custom_config.yaml
Options:
--fetchโ Sync with remote before creating.-c, --configโ Path to custom YAML config.-e, --envโ Target environment (e.g., kde, gnome, server).
โ remove / rm / delete / del
Remove a profile locally and/or remotely.
dotctl remove [-h] [-y] [--fetch] <profile>
Examples:
dotctl rm MyProfile
dotctl del MyProfile --fetch
dotctl del MyProfile -y
Options:
--fetchโ Refresh data before removal.-y, --no-confirmโ Skip confirmation prompt.
๐งช apply
Apply a saved profile.
dotctl apply [-h] [-p <password>] [--skip-sudo] [--skip-hooks] [--skip-pre-hooks] [--skip-post-hooks] [--ignore-hook-errors] [--hooks-timeout <timeout>] [profile]
Examples:
dotctl apply
dotctl apply mydesktop --skip-hooks
dotctl apply mydesktop --hooks-timeout 10
dotctl apply MyProfile --skip-pre-hooks --ignore-hook-errors
Options:
--skip-sudoโ Ignore restricted resources.--skip-hooksโ Skip all hooks.--skip-pre-hooksโ Skip only pre-hooks.--skip-post-hooksโ Skip only post-hooks.--ignore-hook-errorsโ Donโt abort if hooks fail.--hooks-timeoutโ Timeout in seconds for hooks.-p, --passwordโ Password for restricted actions.
๐ค export
Export a profile to .dtsv.
dotctl export [-h] [-p <password>] [--skip-sudo] [profile]
Examples:
dotctl export
dotctl export my_web_server --skip-sudo
dotctl export my_web_server -p mYsecretp@ssw0rd
Options:
--skip-sudo,-psame as above.
๐ฅ import
Import a .dtsv profile.
dotctl import [-h] [-p <password>] [--skip-sudo] <file.dtsv>
Examples:
dotctl import my_web_server.dtsv
dotctl import /data/backup/web.dtsv --skip-sudo
Options:
--skip-sudo,-psame as above.
๐ฅ wipe
Remove all local profiles.
dotctl wipe [-h] [-y]
Examples:
dotctl wipe
dotctl wipe -y
Options:
-y, --no-confirmโ Do not prompt before wiping.
๐งโ๐ป Development & Publishing
Setup Development Environment
python -m venv venv
source venv/bin/activate # Linux/macOS
venv\Scripts\activate # Windows
pip install -r requirements.txt
Test the new code
cd src
python -m dotctl.main --help
python -m dotctl.main new my_profile
python -m dotctl.main save
python -m dotctl.main apply
Build the Package
python -m build
Publish to TestPyPI
twine upload --repository testpypi dist/*
Publish to PyPI
twine upload --repository pypi dist/*
๐ Contact
- Maintainer: Pankaj Jackson
- Support: Open an Issue
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 dotctl-1.0.6.tar.gz.
File metadata
- Download URL: dotctl-1.0.6.tar.gz
- Upload date:
- Size: 27.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
580824411151cf6011eb6471d6db5eab298fa076f594575ebe6b6d9925ba777a
|
|
| MD5 |
d6a83d560ebab5d166337dd9bdb068a3
|
|
| BLAKE2b-256 |
e8517591221d0b624c0265c89018f8e1e52850e22a1cdecdb0d34544931a79ab
|
File details
Details for the file dotctl-1.0.6-py3-none-any.whl.
File metadata
- Download URL: dotctl-1.0.6-py3-none-any.whl
- Upload date:
- Size: 32.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd1472a01e1aa0b5046b2d2871bc44d73558bef9bb76db2e36f0cb425d23fc3e
|
|
| MD5 |
639e3c0e2c719cca74ded9ae311781cd
|
|
| BLAKE2b-256 |
fb21e81990065fe35a120a7deea1832baa9e05303711ce4e507d84d1c66b56d9
|