Stability. The command surface, install flow, and extension points are settled, and new work stays additive where it can. Every push and pull request runs PSScriptAnalyzer, a Windows PowerShell 5.1 + PowerShell 7 parse and load check, a sandboxed install/uninstall cycle, and a functional command suite. Pin
-ExpectedSha256when you want byte-identical installs. Bug reports and PRs are welcome (see CONTRIBUTING.md). A modern PowerShell profile for Windows. The installer drops you into ap10k configure-style install wizard that picks your theme, color scheme, font, and feature toggles — then ships 145+ commands (Unix-style utilities plus git, network, security, sysadmin, WSL, and docker), a tuned Oh My Posh prompt, fuzzy search, zoxide, and a full uninstall + self-update behind it.
# Review-first (recommended): prints the install-bundle SHA256 and STOPS before changing anything.$setup= irm "https://github.com/26zl/PowerShellPerfect/raw/main/setup.ps1"& ([scriptblock]::Create($setup))
# Then apply, pinned to the hash the step above printed (reproducible, integrity-checked):& ([scriptblock]::Create($setup)) -ExpectedSha256 '<hash-printed-above>'Run in an elevated PowerShell window. The default flow above verifies download integrity before touching your machine. Prefer one step and willing to trust-on-download? Append -SkipHashCheck:
& ([scriptblock]::Create($setup)) -SkipHashCheckWhat the hash proves: the printed SHA256 is computed over the bytes you just downloaded, so
-ExpectedSha256guarantees a reproducible, untampered-in-transit apply — not that the bytes match what the maintainer published. For true upstream-authenticity pinning, verify the commit SHA out-of-band (browser / signed tag) before trusting a hash. See SECURITY.md.
The install wizard runs by default — pick theme / scheme / font / features interactively, or pass -SkipWizard for repo defaults. The terminal restarts when setup finishes (new tab in Windows Terminal, or a new window otherwise). For the best experience use PowerShell 7+.
- Requirements · Install Wizard · At a glance · Install (alternatives)
- Updates · Uninstall · Customization · Keyboard Shortcuts
- Commands · Compared to alternatives · Troubleshooting · Tests · Roadmap
| OS | Windows 10 / 11 (Windows Terminal recommended) |
| Shell | Windows PowerShell 5.1 (works) or PowerShell 7+ (recommended; every PS5/PS7 API fork is guarded) |
| Privileges | Elevated session for install/uninstall (font + machine-scope steps). Day-to-day commands need no admin. |
| Network | First install fetches the profile bundle + (optionally) Oh My Posh, a Nerd Font, and CLI tools via winget. TLS 1.2+ is enforced on PS5.1. |
| Optional tools | eza, bat, ripgrep, fzf, zoxide, oh-my-posh — installed by setup; every command degrades gracefully if a tool is absent. |
Inspired by powerlevel10k's p10k configure. Runs automatically on every interactive install — it's the default experience, not an opt-in. Non-interactive environments skip it.
# Default trusted-download flow — wizard runs as part of installation$setup= irm "https://github.com/26zl/PowerShellPerfect/raw/main/setup.ps1"& ([scriptblock]::Create($setup)) -SkipHashCheck
# Bypass the wizard and apply repo defaults (Tokyo Night + CascadiaCode):
.\setup.ps1 -SkipWizard
# Resume a half-finished wizard (state persisted in %TEMP%\psp-wizard-state.json):
.\setup.ps1 -Resume
# Re-run the wizard any time after install (downloads latest setup.ps1 + elevates):
Reconfigure-ProfileSteps (all accept Enter to keep the default / skip):
- Quick start — one-key preset: Tokyo Night scheme, CascadiaCode Nerd Font, VS Code editor, dark chrome, default features. Answer yes to jump straight to the summary.
- Oh My Posh theme — live fetch from JanDeDobbeleer/oh-my-posh/themes via GitHub API. Pick by number or partial name. Network failure falls back to
pure. - Color scheme — curated 7-pack: Tokyo Night (default), Gruvbox Dark, Dracula, Catppuccin Mocha, Nord, One Half Dark, Solarized Dark. Full scheme definitions embedded; no extra network.
- Nerd Font — Caskaydia, JetBrainsMono, FiraCode, Meslo, Hack, or Iosevka. Fetches latest release tag from ryanoasis/nerd-fonts automatically.
- Tab bar color + window chrome — presets (scheme-match, pure black, custom hex) +
applicationThemedark/light. - Terminal appearance — opacity,
useAcrylic, font size, cursor shape, padding, scrollbar state, history size. Each prompt keeps the current default on Enter. - PSReadLine colors — default / derive from chosen scheme / skip.
- Background image — optional path + opacity (0.05–0.50). Skipped by default.
- Editor preference — VS Code, Notepad++, Neovim, Vim, Notepad, or a custom exe. Used by
edit,ep,hosts, etc. - Telemetry opt-out + feature toggles —
psfzf,predictions,startupMessage,perDirProfiles,commandOverrides— y/n per item with sensible defaults.
Design:
- All choices persist to
user-settings.jsonsoUpdate-Profilere-applies them; nothing hardcoded into the profile. - Summary screen at the end with "apply all?" confirmation.
- State file enables
-Resumeif the wizard is interrupted or cancelled. - All 145+ commands and the extensibility system ship regardless of wizard choices; the wizard only selects cosmetics and opt-ins.
| 145+ commands | git, files, unix tools, network, security, developer, sysadmin, WSL, docker, ssh, clipboard |
| Install wizard (default) | Runs automatically when setup is invoked. Picks OMP theme, WT color scheme (7 curated), Nerd Font (6 curated), tab-bar + window chrome, terminal appearance, PSReadLine colors, background, editor, telemetry opt-out, feature toggles. -Resume on interrupt. See Install Wizard for details. |
| Transient prompt | Scrollback shows collapsed $; new input gets the full OMP prompt (opt-in feature flag) |
| Self-updating | Update-Profile syncs profile + theme + WT config with SHA-256 verification. Survives custom profile_user.ps1 + user-settings.json. |
| Full uninstall | Uninstall-Profile restores WT, removes caches, -RemoveTools drops winget packages, -All wipes everything |
| PS5 + PS7 | Installs to both profile directories; every PS5/PS7 API fork is guarded |
| Sandbox-safe | Non-interactive environments skip network calls and UI setup so sessions don't hang |
| Hardened | Passwords/tokens filtered from PSReadLine history; Merge-JsonObject + WT settings merge are unit-tested in CI |
| Tested | Lint, PS5 parse, 100% command-coverage audit, full install + uninstall sandbox - all run on every PR |
Inspired by ChrisTitusTech/powershell-profile; design cues from powerlevel10k and starship.
The one-liner at the top is the recommended path. These are alternatives when you need a local clone or want to tweak defaults without going through the wizard.
Recommended for Oh My Posh: Install the x64 MSI from the releases page (see Oh My Posh) instead of
winget/Store — this profile preserves a direct install and avoids the WindowsApps path. If you already have the MSI install, setup leaves it as is.
git clone https://github.com/26zl/PowerShellPerfect.git
cd PowerShellPerfect
.\setup.ps1 # wizard runs by default
.\setup.ps1 -SkipWizard # apply repo defaults insteadsetup.ps1 auto-detects the local clone when run from the repo directory, so the profile, theme.json, and terminal-config.json are copied from your working tree instead of downloaded from GitHub. It installs the profile to both PS5 and PS7 directories as part of step [1/10]; a separate .\setprofile.ps1 run is only needed if you later want a quick profile-only refresh without re-running the full installer.
When running locally you can override terminal defaults:
.\setup.ps1 -SkipWizard -Opacity 85-ColorScheme "One Half Dark"-FontSize 12Controlled Folder Access: If Windows Defender blocks the setup, allow PowerShell through:
Add-MpPreference-ControlledFolderAccessAllowedApplications "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"Add-MpPreference-ControlledFolderAccessAllowedApplications "C:\Program Files\PowerShell\7\pwsh.exe"
Update-Profile# Sync profile, theme, caches, and Windows Terminal settingsUpdate-PowerShell# Check for new PowerShell 7 releasesUpdate-Tools# Update winget-managed tools; direct/MSI Oh My Posh installs are preservedUpdate-Profile requires hash input by default — either pass the hash the previous run printed as -ExpectedSha256 '<hash>' (ensures file integrity and a reproducible apply) or -SkipHashCheck to bypass. For actual trust pinning against a specific upstream commit, verify the commit SHA out-of-band (browser, signed tag) before using -ExpectedSha256; the hash the tool prints for a first-time download is computed over what was just fetched, so it confirms "this is what I just downloaded" but not "this is what upstream really published". Use -Force to re-apply settings even when nothing changed upstream.
Remove the profile, caches, and Windows Terminal changes:
Uninstall-Profile# Core cleanup: profile files, caches, WT restoreUninstall-Profile-RemoveUserData -RemoveFonts # Everything except the tools (CLI tools and PSFzf stay)Uninstall-Profile-RemoveTools # Also uninstall managed CLI tools and the PSFzf module (including direct/MSI Oh My Posh when detected)Uninstall-Profile-All # Remove everything including tools, fonts, and user dataUninstall-Profile-All -HardResetWindowsTerminal # Same as -All, but also delete WT settings.json so WT recreates factory defaultsUninstall-Profile-All -Force # Also uninstall PSFzf/managed tools when CI or agent guards are activeOptional switches: -RemoveTools (winget-managed tools plus the PSFzf module, and direct/MSI Oh My Posh when registered as MSI), -RemoveUserData (profile_user.ps1, user-settings.json, and your plugins/), -RemoveFonts (Nerd Fonts from both the per-user and machine-wide font stores; the machine-wide store needs admin), -All (everything), -HardResetWindowsTerminal (delete WT settings.json and backups so Windows Terminal recreates defaults). Supports -WhatIf to preview without making changes. A plain Uninstall-Profile preserves user-settings.json, profile_user.ps1, and your plugins/ — only -RemoveUserData/-All delete them.
Four extension points survive updates. From simplest to most powerful:
user-settings.json(%LOCALAPPDATA%\PowerShellProfile\) - JSON overrides. Keys:theme,windowsTerminal,defaults,keybindings- terminal and OMP themedefaults.backgroundImage/backgroundImageOpacity/backgroundImageStretchMode/backgroundImageAlignment- Windows Terminal background imagefeatures- toggle heavy/optional behavior:psfzf,predictions,startupMessage,perDirProfiles(alltrueby default),transientPrompt(collapses previous prompt on Enter; defaultfalse, customize via$script:PSP.TransientPrompt = { ... }inprofile_user.ps1),updateCheck(notifies once a week when main has advanced past the applied commit; defaultfalsesoirm | iexin scripts does not trigger a surprise network call)commandOverrides- redefine any command without editing source:{ "gs": "git status --short" }. Opt-in: setfeatures.commandOverrides = truein the same file. Default off because it compiles JSON strings into executable scriptblocks.trustedDirs- directories whose.psprc.ps1auto-loads (managed byAdd-TrustedDirectory)
profile_user.ps1(Split-Path $PROFILE) - PowerShell overrides (aliases, functions, editor, colors, modules), dot-sourced afteruser-settings.json(so PS-level definitions win over JSONcommandOverridesand feature toggles) and beforeplugins/plugins/*.ps1(%LOCALAPPDATA%\PowerShellProfile\plugins\) - drop-in plugins. Each file is auto-loaded; errors are isolated per plugin.psprc.ps1(per directory) - project-specific profile. Auto-loads oncdinto a directory registered withAdd-TrustedDirectory. Usefunction global:foo/Set-Alias -Scope Globalfor lasting definitions;$env:VARalways persists
Call Start-ProfileTour for a live walkthrough, or Get-ProfileCommand -Category <cat> to list what's available.
Set-TerminalBackground"$env:USERPROFILE\Pictures\bg.png"-Opacity 0.1Set-TerminalBackground-ClearDefault fills the whole tab with low opacity (typical backdrop). For a small corner watermark, add -ResizeWidth 200 -StretchMode none -Alignment bottomRight. Persisted to user-settings.json, applied live to WT.
| Key | Action |
|---|---|
Up / Down | Search history matching current input |
Tab | Menu-style tab completion |
Ctrl+R | Fuzzy search command history (fzf) |
Ctrl+T | Fuzzy file finder (fzf) |
Ctrl+D | Delete character |
Ctrl+W | Delete word backwards |
Alt+D | Delete word forwards |
Ctrl+Left / Ctrl+Right | Jump word backwards / forwards |
Ctrl+Z / Ctrl+Y | Undo / Redo |
Alt+V | Smart paste (inserts clipboard without executing) |
Ctrl+A | Select entire terminal buffer (Windows Terminal) |
Run Show-Help in your terminal for a colored version of this list.
| Command | Description |
|---|---|
edit <file> | Open file in preferred editor |
Edit-Profile / ep | Open profile in preferred editor |
Update-Profile | Sync profile, theme, caches, and WT settings |
Update-PowerShell | Check for new PowerShell 7 releases |
Update-Tools | Update winget-managed tools; direct/MSI Oh My Posh installs are preserved |
Invoke-ProfileWizard / Reconfigure-Profile | Re-run the install wizard to pick a new theme / scheme / font / feature set |
reload | Reload the PowerShell profile |
Show-Help | Show help in terminal |
Uninstall-Profile | Remove profile, caches, and WT changes (-All for everything) |
| Command | Description |
|---|---|
gs | git status |
ga | git add . |
gc <msg> | git commit -m |
gpush / gpull | git push / pull |
gcl <repo> | git clone |
gcom <msg> | git add . + commit |
lazyg <msg> | git add . + commit + push |
g | zoxide jump to github directory |
| Command | Description |
|---|---|
ls / la / ll / lt | eza listings (icons, hidden, long+git, tree) |
cat <file> | Syntax-highlighted viewer (bat) |
ff <name> | Find files recursively |
nf <name> | Create new file |
mkcd <dir> | Create directory and cd into it |
touch <file> | Create file or update timestamp |
trash <path> | Move to Recycle Bin |
extract <file> | Universal extractor (.zip, .tar, .gz, .7z, .rar) |
file <path> | Identify file type via magic bytes |
sizeof <path> | Human-readable file/directory size |
docs / dtop | Jump to Documents / Desktop |
cdb [N] | cd back N entries in history (default 1, previous dir) |
cdh | List the cd history stack (most-recent first) |
| Command | Description |
|---|---|
grep <regex> [dir] | Search for pattern in files (ripgrep) |
head <path> [n] | First n lines of file |
tail <path> [n] [-f] | Last n lines of file |
sed <file> <find> <replace> | Find and replace in file |
which <cmd> | Show command path |
pkill <name> | Kill processes by name |
pgrep <name> | List processes by name |
export <name> <value> | Set environment variable |
| Command | Description |
|---|---|
admin / su | Open elevated terminal |
pubip | Public IP address |
localip | Local IPv4 addresses |
uptime | System uptime |
sysinfo | Detailed system info |
df | Disk volumes |
flushdns | Clear DNS cache |
ports | Listening TCP ports |
checkport <host> <port> | Test TCP connectivity |
portscan <host> [-Ports] | Quick TCP port scan (15 common ports) |
tlscert <domain> [port] | Check TLS certificate expiry and details |
ipinfo [ip] | IP geolocation lookup over HTTPS (no args = your IP) |
whois <domain> | WHOIS domain lookup (registrar, dates, nameservers) |
nslook <domain> [type] | DNS lookup (A, MX, TXT, etc.) |
env [pattern] | Search/list environment variables |
svc [name] [-Count n] [-Live] | htop-like process viewer |
eventlog [n] | Last n event log entries (default 20) |
path | Display PATH entries one per line |
weather [city] | Quick weather lookup |
speedtest | Download speed test |
wifipass [ssid] [-Reveal] | List saved WiFi profiles (passwords masked unless -Reveal) |
hosts | Open hosts file in elevated editor |
Clear-Cache [-IncludeSystemCaches] | Clear user temp/browser caches (optionally system dirs) |
Clear-ProfileCache | Reset profile caches plus OMP internal caches |
duration | Show elapsed time of the last executed command |
Test-ProfileHealth [-PassThru] / psp-doctor | Diagnose install (tools, caches, fonts, PATH, modules); -PassThru also emits the result rows for scripting |
winutil [-ExpectedSha256 <hash>] / winutil -Force | Fetch Chris Titus WinUtil. Safe-by-default: prints source URL and SHA256, then stops. Re-run with -ExpectedSha256 '<hash>' (hash-pinned) or -Force (trust without verification) to stage execution, and PowerShell still asks for a high-impact confirmation before launch. |
harden | Open Harden Windows Security with an explicit confirmation prompt before launch. |
| Command | Description |
|---|---|
journal [log] [-Count n] [-Follow] [-Level ...] | Tail Windows Event Log (journalctl-style) |
lsblk | List disks and partitions with volume info |
htop | Interactive process viewer (uses btop/ntop/htop if installed, else svc -Live) |
mtr <host> | Traceroute with per-hop ping stats |
fwallow / fwblock <name> [-Port n] | Quick Windows Firewall rule (needs admin; supports -WhatIf / -Confirm) |
Find-FileLocker <path> | Show processes holding a file/folder lock (uses Windows Restart Manager API) |
Stop-StuckProcess <name|-Id> | Escalating kill: Stop-Process -Force → taskkill /F → /F /T for processes that ignore normal kill |
Remove-LockedItem <path> [-Recurse] | Find lockers, kill them, then delete. For "file is in use" errors |
| Command | Description |
|---|---|
hash <file> [algo] | File hash (default SHA256) |
checksum <file> <expected> | Verify file hash |
genpass [length] | Random password (default 20), copies to clipboard |
b64 / b64d <text> | Base64 encode / decode |
jwtd <token> | Decode JWT header and payload |
uuid | Generate random UUID (copies to clipboard) |
epoch [value] | Unix timestamp converter (no args = now) |
urlencode / urldecode <text> | URL encode / decode |
vtscan <file> [-Upload] | VirusTotal hash lookup; -Upload submits unknown files |
vt <subcommand> | Full VirusTotal CLI (vt-cli) |
nscan <target> [-Mode ...] | Nmap wrapper with curated scan profiles (Quick/Full/Services/Stealth/Vuln/Ports) |
sigcheck <path> | Authenticode signature details (file or directory) |
ads <path> | List NTFS alternate data streams |
defscan [path] [-Mode Quick/Full] | Windows Defender scan wrapper |
pwnd <password> | HIBP k-anonymity breach lookup (only first 5 SHA1 chars leave the host) |
certcheck <host> [port] | Full TLS probe: chain, SAN, SHA256 pin, cipher |
entropy <file> | Shannon entropy (detect packed/encrypted payloads) |
| Command | Description |
|---|---|
killport <port> | Kill process on a TCP port |
killports (alias for Stop-ListeningPort) | Interactive fzf picker: lists all listening ports (port/PID/process), Tab for multi-select, Enter to kill |
http <url> [-Method POST] [-Body '...'] | HTTP requests, auto-formats JSON |
prettyjson <file> | Pretty-print JSON (accepts pipeline input) |
hb <file> | Upload to hastebin, copy URL (confirms first; -Force/-Confirm:$false to skip) |
timer { command } | Measure execution time |
watch { command } [-Interval n] | Repeat command every n seconds (default 2; like Linux watch) |
bak <file> | Quick timestamped backup |
serve [port] [path] | One-line HTTP server (python or npx) |
gitignore <lang...> | Generate .gitignore from gitignore.io |
gcof | Fuzzy git branch checkout (fzf) |
envload [path] | Load .env file into current session |
tldr <cmd> | Quick command-example lookup (tldr-pages) |
repeat <count> { cmd } [-UntilSuccess] | Repeat a scriptblock |
mkvenv [name] | Create and activate a Python venv |
Inspired by the PowerShell VSCode extension: AST-powered tools that understand PowerShell code.
| Command | Description |
|---|---|
outline <file> | List functions/params/aliases via AST parser |
psym [pattern] [root] | Symbol search across .ps1 files |
lint [path] [-Mode Standard/Strict/Security/CI] [-Fix] | PSScriptAnalyzer wrapper with presets |
Find-DeadCode <file> | Unused params and same-file uncalled functions |
Test-Profile | Profile diagnostics: version, policy, caches, tools, env |
Get-PwshVersions | Enumerate every installed PowerShell |
modinfo <name> | Module details: path, version(s), exports, signature |
psgrep <pattern> [-Kind Command/Variable/String/Function] | AST-based code search (structural grep) |
| Command | Description |
|---|---|
Get-ProfileCommand [-Category ...] [-Name ...] | Query the command registry |
Start-ProfileTour | Interactive walkthrough of every category |
Register-ProfileHook -EventName OnProfileLoad/PrePrompt/OnCd -Action { ... } | Hook lifecycle events |
Register-HelpSection -Title ... -Lines @(...) | Add a section to Show-Help |
Register-ProfileCommand -Name ... -Category ... [-Synopsis ...] | Add to command registry |
Add-TrustedDirectory / Remove-TrustedDirectory [path] | Trust a dir so .psprc.ps1 auto-loads |
Set-TerminalBackground <image> [-Opacity] [-StretchMode] [-Alignment] | Set WT background image (live + persisted); -Clear to remove |
| Command | Description |
|---|---|
dps / dpa | Running / all containers |
dimg | List images |
dlogs <container> | Follow container logs |
dex <container> [shell] | Exec into container |
dstop | Stop all containers |
dprune | System prune |
| Command | Description |
|---|---|
ssh <user@host> | Wraps ssh.exe with ConnectTimeout=10 + keepalive so hung connects fail fast and respond to Ctrl+C (user -o values take precedence) |
Copy-SshKey / ssh-copy-key <user@host> | Copy SSH key to remote (when ssh installed) |
keygen [name] | Generate ED25519 key pair (when ssh installed) |
rdp <host> | Launch RDP session |
| Command | Description |
|---|---|
wsl [args] | Wraps wsl.exe and sets tab title to the distro name during the session |
Get-WslDistro | List installed distros with state + version + default flag (pipe-friendly objects) |
Enter-WslHere / wsl-here [-Distro] | Open a WSL shell in the current Windows directory (auto path-translated) |
Get-WslFile <distro> [path] [-Recurse] | List files inside a distro via the \\wsl$\ UNC path; returns FileInfo objects |
Show-WslTree / wsl-tree <distro> [path] [-Depth N] | Tree-view of a distro path (uses eza when available) |
Open-WslExplorer / wsl-explorer <distro> [path] | Open the distro path in Windows Explorer (GUI file browsing) |
ConvertTo-WslPath <winpath> | Translate Windows path to WSL (handles backslash-dropping quirk) |
ConvertTo-WindowsPath <wslpath> | Translate WSL path to Windows |
Get-WslIp [-Distro] | IPv4 of a running distro (for connecting to in-distro services from Windows) |
Stop-Wsl [-Distro] | Shutdown all distros, or terminate one by name |
Tab-complete works on -Distro for all of these via live Get-WslDistro lookup.
| Command | Description |
|---|---|
cpy <text> | Copy to clipboard |
pst | Paste from clipboard |
icb | Insert clipboard into prompt (never executes) |
Everything in tests/ is tracked and runs locally in seconds.
| File | Run | Purpose |
|---|---|---|
tests/lint.ps1 | pwsh -NoProfile -File tests/lint.ps1 | PSScriptAnalyzer with the exact rule set CI enforces |
tests/test.ps1 | pwsh -NoProfile -File tests/test.ps1 | Full quality gate: lint, PS5 parse, BOM/secret/path scans, install + uninstall sandboxes, 100% command-coverage audit. A trap + PowerShell.Exiting handler sweeps any psp-* sandbox dirs from %TEMP% if you Ctrl+C mid-run. |
tests/rawhunt.ps1 | pwsh -NoProfile -File tests/rawhunt.ps1 | Loads the real profile and exercises every function with real I/O (file ops, network, crypto, git, clipboard, caching, WT settings) |
tests/locallab.ps1 | pwsh -NoProfile -File tests/locallab.ps1 -Wizard | Dev harness: runs all the above and optionally drives setup.ps1 -LocalRepo -Wizard end-to-end; -Restore rolls back to the last sandbox backup |
tests/ci-functional.ps1 | GitHub Actions functional job | What CI runs: full install via setup.ps1 -LocalRepo, profile load under $env:CI, uninstall sandbox, and a coverage audit that refuses to pass unless every function/alias has an Invoke-CommandProbe entry |
CI (.github/workflows/ci.yml) runs three jobs on every push/PR: lint (rule set + secret scan + PS5 parse), install-flow (JSON config + Merge-JsonObject unit tests + curated-scheme/font validation), functional (the full end-to-end). lint and install-flow are configured as required status checks in the repo's branch ruleset (a GitHub setting, not enforced by the workflow file itself).
PowerShellPerfect bundles a prompt (via Oh My Posh), a command suite, and a wizard-driven installer in one. The prompt engines below are great at theming but aren't command suites; ChrisTitusTech's profile is the closest peer.
| PowerShellPerfect | ChrisTitusTech | Oh My Posh | Starship | |
|---|---|---|---|---|
| p10k-style install wizard | ✅ | — | — | — |
| 145+ commands (Unix-style + git/net/security/sysadmin) | ✅ | partial | — | — |
| Prompt theming | ✅ (via Oh My Posh) | ✅ (via Oh My Posh) | ✅ (engine) | ✅ (engine) |
| Hash-verified self-update + full uninstall | ✅ | ✅ | n/a | n/a |
| PS 5.1 + PS 7 (guarded forks) | ✅ | ✅ | ✅ | ✅ (cross-shell) |
| Secret-scrubbed history | ✅ | — | — | — |
| Customization surfaces | user-settings.json + profile_user.ps1 + plugins/ + .psprc.ps1 | profile edits | themes | starship.toml |
| Symptom | Fix |
|---|---|
| Setup blocked by Windows Defender (Controlled Folder Access) | Allow PowerShell through (see the command in Install), or run the clone from a non-protected folder. |
running scripts is disabled on this system | Run Set-ExecutionPolicy -Scope CurrentUser RemoteSigned. (The recommended one-liner runs an in-memory scriptblock, which isn't subject to the script-file execution policy.) |
| Prompt shows boxes / missing glyphs | The terminal font isn't a Nerd Font. Set your Windows Terminal profile font to the one setup installed (e.g. CaskaydiaCove Nerd Font) and restart WT. |
oh-my-posh not found right after install | Reopen the terminal (PATH refresh) or run Update-SessionPathFromRegistry; confirm with psp-doctor. |
| Turned a feature off in the wizard but it still loads | Check the features block in user-settings.json, then restart PowerShell. |
| Something feels off | Run psp-doctor (alias for Test-ProfileHealth): OK/WARN/FAIL per check across tools, caches, fonts, PATH, and modules. |
Further ideas:
- Per-distro WSL auto-configuration (install common tools when a new distro is detected).
profile_user.ps1scaffolder (New-ProfileOverridegenerates a commented starter file).- Auto-fix mode for
psp-doctor/Test-ProfileHealth— today it diagnoses (tools, caches, fonts, PATH, modules); add an opt-in-Fixthat repairs the common issues it surfaces. - Live theme preview (render OMP themes inline during picker rather than just listing names).
MIT. Use it, fork it, rip out what you need. Credit appreciated, not required.