A modern, profile-based dotfiles manager — successor to chezmoi
Project description
profilectl
Cross-platform dotfiles automation for macOS, Linux, and Windows, powered by Rust.
Manage your development environment through profiles — declarative TOML files that describe your symlinks, tools, and environment per machine. Works as a direct CLI or an interactive TUI.
Quick Start
Install via cargo
cargo install profilectl
Install via shell script (macOS/Linux)
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/carlosferreyra/profilectl/releases/latest/download/profilectl-installer.sh | sh
Install via PowerShell (Windows)
powershell -ExecutionPolicy ByPass -c "irm https://github.com/carlosferreyra/profilectl/releases/latest/download/profilectl-installer.ps1 | iex"
Usage
Interactive mode (no arguments)
profilectl
Launches a guided TUI to select a profile, preview changes, and apply them.
CLI subcommands
profilectl sync Apply the active profile (links + tools)
profilectl install Install declared tools via the appropriate package manager
profilectl link Create symlinks defined in the profile
profilectl unlink Remove managed symlinks
profilectl scan Detect installed tools and compare against the profile
profilectl diff Show what would change if the profile were applied
profilectl check Verify all symlinks and tools are in the expected state
profilectl profiles List available profiles
profilectl status Show current profile and system state
Selecting a profile
profilectl --profile work sync
Or set the environment variable:
export PCTL_PROFILE=work
profilectl sync
Profiles
Profiles live in profiles/<name>.toml and describe what a machine should look like:
name = "default"
[[links]]
src = "config/zsh/.zshrc"
dst = "~/.zshrc"
[[links]]
src = "config/git/.gitconfig"
dst = "~/.gitconfig"
[tools]
brew = ["starship", "ripgrep", "bat", "eza"]
cargo = ["cargo-nextest"]
Profiles support inheritance via extends:
name = "work"
extends = "default"
[[links]]
src = "config/zsh/.zshrc.work"
dst = "~/.zshrc"
[tools]
brew = ["awscli", "terraform"]
The work profile inherits all links and tools from default, then adds or overrides its own.
Project Structure
dotfiles/
├── profiles/
│ └── default.toml # Default profile (symlinks + tools)
├── config/
│ ├── zsh/ # Zsh config files
│ ├── git/ # Git config files
│ └── shell/ # Starship prompt config
├── crates/
│ ├── profilectl/ # Binary entry point
│ ├── profilectl-cli/ # Clap subcommands
│ ├── profilectl-config/ # Profile schema and loader
│ ├── profilectl-interactive/ # Inquire TUI
│ └── profilectl-types/ # Shared types and errors
├── scripts/
│ └── release_pypi.py # PyPI thin-wrapper publish script
└── Cargo.toml # Workspace root
See crates/README.md for a description of each crate.
Release Pipeline
Releases are fully automated:
cargo release patch --executeonmain- git-cliff generates
CHANGELOG.md, cargo-release commits and tags - cargo-dist builds binaries for macOS (aarch64 + x86_64), Linux (x86_64), and Windows (x86_64)
- GitHub Release is created with shell/PowerShell installers
- PyPI thin-wrapper package is published via OIDC trusted publishing
Contributing
- Fork the repository
- Create a feature branch from
main - Open a pull request — CI runs
cargo fmt,cargo clippy, andcargo test
License
MIT — see LICENSE.
Made with ❤️ by Carlos Ferreyra
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 profilectl-0.1.5.tar.gz.
File metadata
- Download URL: profilectl-0.1.5.tar.gz
- Upload date:
- Size: 3.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd69351b29c82491ec67e755aa671a0b5cdae6d2a561e38ebfa94efce28837c4
|
|
| MD5 |
d9d884cc0dfd004bdecb27cbd29787c4
|
|
| BLAKE2b-256 |
8ed855af2aa37ec94ce03dc479605a8f0186261d68c511484310230e96f7b655
|
Provenance
The following attestation bundles were made for profilectl-0.1.5.tar.gz:
Publisher:
publish-pypi.yml on carlosferreyra/profilectl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
profilectl-0.1.5.tar.gz -
Subject digest:
fd69351b29c82491ec67e755aa671a0b5cdae6d2a561e38ebfa94efce28837c4 - Sigstore transparency entry: 1367038406
- Sigstore integration time:
-
Permalink:
carlosferreyra/profilectl@113f90994bb845988765e88711b68372ac267a32 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/carlosferreyra
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@113f90994bb845988765e88711b68372ac267a32 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file profilectl-0.1.5-py3-none-any.whl.
File metadata
- Download URL: profilectl-0.1.5-py3-none-any.whl
- Upload date:
- Size: 3.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a66f5615292bf4d8b033980ce04550e49c77d6e796c44ee62def00c97d937cf
|
|
| MD5 |
577c6c3f71076214fee26ce53176f59b
|
|
| BLAKE2b-256 |
491ee2ccd7fdf3629a97af27e280d44b475ffe97d8aaef1fb0af0ac81cae6b71
|
Provenance
The following attestation bundles were made for profilectl-0.1.5-py3-none-any.whl:
Publisher:
publish-pypi.yml on carlosferreyra/profilectl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
profilectl-0.1.5-py3-none-any.whl -
Subject digest:
2a66f5615292bf4d8b033980ce04550e49c77d6e796c44ee62def00c97d937cf - Sigstore transparency entry: 1367038464
- Sigstore integration time:
-
Permalink:
carlosferreyra/profilectl@113f90994bb845988765e88711b68372ac267a32 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/carlosferreyra
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@113f90994bb845988765e88711b68372ac267a32 -
Trigger Event:
workflow_dispatch
-
Statement type: