Skip to main content

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:

  1. cargo release patch --execute on main
  2. git-cliff generates CHANGELOG.md, cargo-release commits and tags
  3. cargo-dist builds binaries for macOS (aarch64 + x86_64), Linux (x86_64), and Windows (x86_64)
  4. GitHub Release is created with shell/PowerShell installers
  5. PyPI thin-wrapper package is published via OIDC trusted publishing

Contributing

  1. Fork the repository
  2. Create a feature branch from main
  3. Open a pull request — CI runs cargo fmt, cargo clippy, and cargo test

License

MIT — see LICENSE.


Made with ❤️ by Carlos Ferreyra

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

profilectl-0.1.5.tar.gz (3.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

profilectl-0.1.5-py3-none-any.whl (3.9 kB view details)

Uploaded Python 3

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

Hashes for profilectl-0.1.5.tar.gz
Algorithm Hash digest
SHA256 fd69351b29c82491ec67e755aa671a0b5cdae6d2a561e38ebfa94efce28837c4
MD5 d9d884cc0dfd004bdecb27cbd29787c4
BLAKE2b-256 8ed855af2aa37ec94ce03dc479605a8f0186261d68c511484310230e96f7b655

See more details on using hashes here.

Provenance

The following attestation bundles were made for profilectl-0.1.5.tar.gz:

Publisher: publish-pypi.yml on carlosferreyra/profilectl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for profilectl-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 2a66f5615292bf4d8b033980ce04550e49c77d6e796c44ee62def00c97d937cf
MD5 577c6c3f71076214fee26ce53176f59b
BLAKE2b-256 491ee2ccd7fdf3629a97af27e280d44b475ffe97d8aaef1fb0af0ac81cae6b71

See more details on using hashes here.

Provenance

The following attestation bundles were made for profilectl-0.1.5-py3-none-any.whl:

Publisher: publish-pypi.yml on carlosferreyra/profilectl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page