Skip to main content

Personal system manager: dotfiles, profiles, and tool installations across machines.

Project description

pauldot

Personal system manager: dotfiles, profiles, and tool installations across machines. File-first, written in Python, fork-friendly.

What it does

  • Manages ~/.zshrc (and other dotfiles) from a single git repo
  • Layers machine-specific profiles (work, personal) on top of a shared base
  • Declares desired tools and installs them on apply
  • Quick CLI for daily tasks: adding aliases, switching profiles, syncing
  • One-line bootstrap on a fresh machine

Install

uv tool install pauldot

Quick start (new dotfiles repo)

# 1. Create your dotfiles repo on GitHub
gh repo create <you>/dotfiles --private --clone

# 2. Scaffold the structure (optionally porting your existing ~/.zshrc)
pauldot init --scaffold ./dotfiles --port-existing-zshrc

# 3. Edit pauldot.toml and bootstrap.sh, then push
cd dotfiles && git add . && git commit -m "init" && git push

# 4. On any new machine
curl -sSL https://raw.githubusercontent.com/<you>/dotfiles/main/bootstrap.sh | sh

--port-existing-zshrc is optional but recommended on first setup — it reads your current ~/.zshrc, moves alias lines into files/aliases.zsh, and writes everything else into files/zshrc.base.

Run pauldot help fork for the full walkthrough.

Quick start (existing dotfiles repo)

pauldot init git@github.com:<you>/dotfiles
pauldot apply

If your repo is private, set up GitHub CLI first — pauldot help gh walks you through it.

Commands

pauldot init [<repo-url>]                            Clone your dotfiles repo and configure this machine
pauldot init --scaffold <path>                       Generate a starter dotfiles repo structure
pauldot init --scaffold <path> --port-existing-zshrc  Also port aliases and config from ~/.zshrc into the scaffold
pauldot apply                    Reconcile current profile (zshrc + tools)
pauldot status                   Dry-run apply — show what would change
pauldot doctor                   Health check

pauldot profile show             Show the active profile
pauldot profile list             List available profiles
pauldot profile set <name>       Switch profile

pauldot tool list                List all defined tools and install status
pauldot tool install [<name>]    Install a tool (or all profile tools)
pauldot tool add                 Interactively add a tool to tools.toml
pauldot tool remove <name>       Remove a tool from tools.toml

pauldot alias add <key> <value>  Add an alias to aliases.zsh
pauldot alias list               List defined aliases

pauldot sync                     Pull latest changes; push local commits
pauldot absorb                   Absorb external zshrc modifications into source files
pauldot absorb --dry-run         Show what would be absorbed without writing
pauldot absorb --target <file>   Absorb into a specific source file (default: zshrc.base)
pauldot edit [profile|tools|zshrc|pauldot]  Open a dotfiles file in $EDITOR

pauldot help bootstrap           Bootstrap walkthrough for new machines
pauldot help gh                  GitHub CLI auth walkthrough
pauldot help fork                How to set up your own dotfiles repo

Dotfiles repo layout

~/.pauldot/
├── pauldot.toml           # top-level config (shell, git, bootstrap settings)
├── profiles/
│   ├── base.toml          # shared base profile
│   └── personal.toml      # extends base; machine-specific overrides
├── files/
│   ├── zshrc.base         # base zsh config
│   ├── zshrc.personal     # profile-specific zsh config
│   └── aliases.zsh        # managed by `pauldot alias add`
├── tools/
│   └── tools.toml         # tool definitions (check + install commands)
└── bootstrap.sh           # one-liner for new machines

~/.zshrc is a symlink to a generated file that sources these in order.

Local state

~/.config/pauldot/state.toml    # active profile + repo URL (not committed)

Development

make install    # uv sync
make test       # uv run pytest
make lint       # uv run ruff check .
make format     # uv run ruff format .

Requires Python 3.14+ and uv.

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

pauldot-0.3.0.tar.gz (41.8 kB view details)

Uploaded Source

Built Distribution

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

pauldot-0.3.0-py3-none-any.whl (25.3 kB view details)

Uploaded Python 3

File details

Details for the file pauldot-0.3.0.tar.gz.

File metadata

  • Download URL: pauldot-0.3.0.tar.gz
  • Upload date:
  • Size: 41.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for pauldot-0.3.0.tar.gz
Algorithm Hash digest
SHA256 3a9c5f9a3ab73f567d18f6936619d6d8b11ea33ee4d8c82ef1036240a5d7debd
MD5 852ef20db21a2a78a6d34b9d5696262d
BLAKE2b-256 f6953c90e8802bb2992f1b18dedb57fc2e0425fa14a87d1bb42c35a910d329d1

See more details on using hashes here.

File details

Details for the file pauldot-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: pauldot-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 25.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for pauldot-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e4d48ea605cb72595e54caa1f2788ea91bbfa10a553b85a5727bf30018384758
MD5 a1076dfda336381066302934b960f049
BLAKE2b-256 dcad0863280e30b584ce8e5a6e8b711d75f47711b3227b24245b2c4e5f85f669

See more details on using hashes here.

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