DevProfile mod-0-dev
winget install --id=mod-0-dev.DevProfile -e Portable developer-environment snapshot for Windows — capture packages and configs, preview, then replay them on another machine.
winget install --id=mod-0-dev.DevProfile -e Portable developer-environment snapshot for Windows — capture packages and configs, preview, then replay them on another machine.
A portable developer-environment snapshot tool for Windows. Tick what you want to capture from your machine, export it to a folder (OneDrive, USB stick, anywhere), then replay it on another machine with a preview-before-apply step.
Unlike winget export (packages only) or chezmoi (configs only, CLI/git), DevProfile
captures both packages and developer configs behind a friendly GUI — plus a
headless CLI for scripted bootstraps — offline-portable, Windows-first.
DevProfile.slnx
src/
DevProfile.Core/ # provider engine — no UI dependency
IProvider.cs # capture / plan / apply contract
ProfileService.cs # orchestration + the provider registry
SecretsCrypto.cs # AES-256-GCM + PBKDF2 passphrase encryption
HostsElevation.cs # single-UAC-prompt handoff for hosts-file writes
Providers/ # one file per capture target
DevProfile.App/ # WPF (net10.0-windows) GUI: Create + Apply pages
DevProfile.Cli/ # devprofile.exe — headless export/plan/apply/refresh
tests/
DevProfile.Core.Tests/ # xunit: crypto, parsing, plan/apply logic, orchestration
Everything the GUI does, scriptable — for bootstrapping a fresh machine from a USB stick, or refreshing a profile from a scheduled task:
devprofile list # providers and what they'd capture here
devprofile export C:\Profiles\Work # capture (add --secrets to include the encrypted bundle)
devprofile refresh C:\Profiles\Work # re-capture an existing profile in place
devprofile plan C:\Profiles\Work # preview what apply would change
devprofile apply C:\Profiles\Work --yes # non-interactive apply
Use --passphrase-env VAR to supply the secrets passphrase non-interactively.
Exit codes: 0 success, 1 something failed, 2 bad usage.
| Category | Providers |
|---|---|
| Packages | winget, npm globals, .NET global tools |
| Git & Hosts | .gitconfig, hosts entries (merge-append, needs admin) |
| VS Code | settings.json, extension list |
| Shell | PowerShell $PROFILE, Windows Terminal settings, user env vars |
| Secrets | .ssh keys + .npmrc — opt-in, passphrase-encrypted |
A profile is just a folder:
MyProfile/
profile.json # manifest: schema, date, source machine, providers included
winget/packages.json # reuses winget's own export format
git-config/gitconfig
vscode-settings/settings.json
vscode-extensions/extensions.txt
...
secrets/secrets.bin # encrypted, only if you opt in
IProvider (Discover / Capture /
Plan / Apply). Adding a new target is one new file; nothing else changes.*.devprofile.bak.devprofile refresh, or the Refresh button when the export folder already
holds a profile). The manifest keeps its identity and gains an UpdatedUtc stamp.*TOKEN*, *SECRET*, …) are
excluded from the cleartext capture (only their names are recorded, and the Apply plan
lists them as manual follow-ups); real secrets only travel in the encrypted bundle.profile.json manifest
(schema devprofile/v1) is refused.dotnet build DevProfile.slnx
dotnet run --project src/DevProfile.App # GUI
dotnet run --project src/DevProfile.Cli -- list # CLI
dotnet test DevProfile.slnx
Requires the .NET 10 SDK and the WindowsDesktop runtime. CI builds and tests on
windows-latest (see .github/workflows/ci.yml).
.ssh / .npmrc); secret-named
env vars are skipped (their names show up in the Apply plan as manual follow-ups).