# clauda installer for Windows. # # irm https://clauda-install.pages.dev/install.ps1 | iex # # What it does: # 1. Checks for Claude Code (`claude`). If missing, installs it with the # official installer: irm https://claude.ai/install.ps1 | iex # 2. Installs clauda (clauda.cmd + clauda-impl.ps1) into # %LOCALAPPDATA%\Programs\clauda # 3. Adds that folder to your user PATH so you can type `clauda`. # # The implementation is named clauda-impl.ps1 (not clauda.ps1) and is launched # by clauda.cmd with -ExecutionPolicy Bypass, so `clauda` works even when the # system PowerShell execution policy is Restricted. # # The clauda scripts are embedded below (base64), so this installer needs no # other downloads. $ErrorActionPreference = 'Stop' function Info([string]$m) { Write-Host $m -ForegroundColor Cyan } function Ok([string]$m) { Write-Host $m -ForegroundColor Green } function Warn([string]$m) { Write-Host $m -ForegroundColor Yellow } Write-Host "" Write-Host " clauda installer (Windows)" -ForegroundColor Cyan Write-Host " ------------------------------------------------------------" # --------------------------------------------------------------------------- # 1. Ensure Claude Code is installed # --------------------------------------------------------------------------- $claude = Get-Command claude -ErrorAction SilentlyContinue if ($claude) { Ok " [1/3] Claude Code found: $($claude.Source)" } else { Warn " [1/3] Claude Code not found - installing it first (official installer)..." try { Invoke-RestMethod 'https://claude.ai/install.ps1' | Invoke-Expression } catch { Warn " Automatic Claude Code install failed: $($_.Exception.Message)" Warn " Install it manually, then re-run this installer:" Warn " irm https://claude.ai/install.ps1 | iex" } $claude = Get-Command claude -ErrorAction SilentlyContinue if ($claude) { Ok " Claude Code installed: $($claude.Source)" } else { Warn " Claude Code is not on PATH yet (a new terminal may be required)." Warn " Continuing to install clauda anyway." } } # --------------------------------------------------------------------------- # 2. Install clauda # --------------------------------------------------------------------------- $installDir = Join-Path $env:LOCALAPPDATA 'Programs\clauda' New-Item -ItemType Directory -Force -Path $installDir | Out-Null # Remove a stale flat clauda.ps1 from older installs: if it sits next to # clauda.cmd on PATH, PowerShell would run it (and hit the execution policy) # instead of the .cmd launcher. $stalePs1 = Join-Path $installDir 'clauda.ps1' if (Test-Path -LiteralPath $stalePs1) { Remove-Item -LiteralPath $stalePs1 -Force } $ps1B64 = '77u/IyEvdXNyL2Jpbi9lbnYgcHdzaAojCiMgY2xhdWRhIC0gbGF1bmNoIENsYXVkZSBDb2RlIGFnYWluc3QgdGhlIGRlZmF1bHQgQVBJIGVuZHBvaW50IHdpdGggeW91ciB0b2tlbi4KIwojIGBjbGF1ZGEgW2FyZ3MuLi5dYCAgLT4gIHN0YXJ0cyBDbGF1ZGUgQ29kZSAodG9rZW4tYmlsbGVkKSBhZ2FpbnN0IHRoZSBidWlsdC1pbgojICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgZW5kcG9pbnQsIGluIGFuIGlzb2xhdGVkIENMQVVERV9DT05GSUdfRElSIHNvCiMgICAgICAgICAgICAgICAgICAgICAgICAgaXQgbmV2ZXIgbWl4ZXMgd2l0aCB5b3VyIHN1YnNjcmlwdGlvbiBsb2dpbiBpbiB+Ly5jbGF1ZGUuCiMgICAgICAgICAgICAgICAgICAgICAgICAgT24gZmlyc3QgcnVuIHlvdSBhcmUgYXNrZWQgZm9yIHlvdXIgQVBJIHRva2VuIChoaWRkZW4pOwojICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHNhdmVkIHNvIHlvdSBhcmUgbm90IGFza2VkIGFnYWluLgojCiMgTGF1bmNoZWQgYnkgY2xhdWRhLmNtZCAod2hpY2ggc2V0cyAtRXhlY3V0aW9uUG9saWN5IEJ5cGFzcyksIHNvIGl0IHJ1bnMgZXZlbgojIHdoZW4gdGhlIHN5c3RlbSBQb3dlclNoZWxsIGV4ZWN1dGlvbiBwb2xpY3kgaXMgUmVzdHJpY3RlZC4KCiMgQ2FwdHVyZSBBTEwgYXJndW1lbnRzIHZlcmJhdGltIChpbmNsdWRpbmcgZmxhZ3MgbGlrZSAtcCkuCiRDbGkgPSBAKCRhcmdzKQoKU2V0LVN0cmljdE1vZGUgLVZlcnNpb24gMi4wCiRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU3RvcCcKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQnVpbHQtaW4gZGVmYXVsdHMuIGNsYXVkYSBhbHdheXMgcnVucyBDbGF1ZGUgQ29kZSBhZ2FpbnN0IHRoaXMgZW5kcG9pbnQgYW5kCiMgbW9kZWw7IHlvdSBvbmx5IGV2ZXIgc3VwcGx5IGEgdG9rZW4uIENoYW5nZSB0aGVzZSB2YWx1ZXMgdG8gdGFzdGUuCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiREZWZhdWx0QmFzZVVybCA9ICdodHRwczovL29wZW5hcGktZ2xiLmJvdGltLm1lL2FwaS9sbG0tZ3cnCiREZWZhdWx0TW9kZWwgICA9ICdjbGF1ZGUtb3B1cy00LTgnCgokSG9tZURpciAgICA9IGlmICgkZW52OlVTRVJQUk9GSUxFKSB7ICRlbnY6VVNFUlBST0ZJTEUgfSBlbHNlIHsgJEhPTUUgfQokQ2xhdWRhSG9tZSA9IGlmICgkZW52OkNMQVVEQV9IT01FKSB7ICRlbnY6Q0xBVURBX0hPTUUgfSBlbHNlIHsgSm9pbi1QYXRoICRIb21lRGlyICcuY29uZmlnXGNsYXVkYScgfQokVG9rZW5GaWxlICA9IEpvaW4tUGF0aCAkQ2xhdWRhSG9tZSAndG9rZW4nCiRDb25maWdEaXIgID0gSm9pbi1QYXRoICRDbGF1ZGFIb21lICdjbGF1ZGUtY29uZmlnJwokQ2xhdWRlQmluICA9IGlmICgkZW52OkNMQVVEQV9DTEFVREVfQklOKSB7ICRlbnY6Q0xBVURBX0NMQVVERV9CSU4gfSBlbHNlIHsgJ2NsYXVkZScgfQoKTmV3LUl0ZW0gLUl0ZW1UeXBlIERpcmVjdG9yeSAtRm9yY2UgLVBhdGggJENsYXVkYUhvbWUgfCBPdXQtTnVsbAoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBIZWxwZXJzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIERpZShbc3RyaW5nXSRtKSB7IFtDb25zb2xlXTo6RXJyb3IuV3JpdGVMaW5lKCJjbGF1ZGE6ICRtIik7IGV4aXQgMSB9CgojIEJlc3QtZWZmb3J0OiByZXN0cmljdCB0aGUgdG9rZW4gZmlsZSB0byB0aGUgY3VycmVudCB1c2VyIChjaG1vZCA2MDAgZXF1aXZhbGVudCkuCmZ1bmN0aW9uIFJlc3RyaWN0LUFjbChbc3RyaW5nXSRwYXRoKSB7CiAgICB0cnkgeyAmIGljYWNscyAkcGF0aCAvaW5oZXJpdGFuY2U6ciAvZ3JhbnQ6ciAiJCgkZW52OlVTRVJOQU1FKTooRikiICo+ICRudWxsIH0gY2F0Y2ggeyB9Cn0KCmZ1bmN0aW9uIFJlYWQtSGlkZGVuKFtzdHJpbmddJHByb21wdCkgewogICAgJHNlYyA9IFJlYWQtSG9zdCAtUHJvbXB0ICRwcm9tcHQgLUFzU2VjdXJlU3RyaW5nCiAgICAkYiA9IFtSdW50aW1lLkludGVyb3BTZXJ2aWNlcy5NYXJzaGFsXTo6U2VjdXJlU3RyaW5nVG9CU1RSKCRzZWMpCiAgICB0cnkgeyByZXR1cm4gW1J1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLk1hcnNoYWxdOjpQdHJUb1N0cmluZ0JTVFIoJGIpIH0KICAgIGZpbmFsbHkgeyBbUnVudGltZS5JbnRlcm9wU2VydmljZXMuTWFyc2hhbF06Olplcm9GcmVlQlNUUigkYikgfQp9CgojIFJldHVybiB0aGUgc2F2ZWQgdG9rZW4sIHByb21wdGluZyBmb3IgKGFuZCBzYXZpbmcpIG9uZSBpZiBuZWVkZWQuCmZ1bmN0aW9uIEdldC1Ub2tlbihbc3dpdGNoXSRGb3JjZSkgewogICAgaWYgKC1ub3QgJEZvcmNlIC1hbmQgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJFRva2VuRmlsZSkpIHsKICAgICAgICAkdCA9IChbSU8uRmlsZV06OlJlYWRBbGxUZXh0KCRUb2tlbkZpbGUpKS5UcmltKCkKICAgICAgICBpZiAoJHQpIHsgcmV0dXJuICR0IH0KICAgIH0KICAgICR0ID0gKFJlYWQtSGlkZGVuICJQYXN0ZSB5b3VyIEFQSSB0b2tlbiAoaW5wdXQgaGlkZGVuKSIpLlRyaW0oKQogICAgaWYgKC1ub3QgJHQpIHsgRGllICJhIHRva2VuIGlzIHJlcXVpcmVkIiB9CiAgICBbSU8uRmlsZV06OldyaXRlQWxsVGV4dCgkVG9rZW5GaWxlLCAkdCwgKE5ldy1PYmplY3QgU3lzdGVtLlRleHQuVVRGOEVuY29kaW5nKCRmYWxzZSkpKQogICAgUmVzdHJpY3QtQWNsICRUb2tlbkZpbGUKICAgIHJldHVybiAkdAp9CgpmdW5jdGlvbiBSZXNvbHZlLUNsYXVkZUJpbiB7CiAgICAkYyA9IEdldC1Db21tYW5kICRDbGF1ZGVCaW4gLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKICAgIGlmICgkYykgeyByZXR1cm4gJGMuU291cmNlIH0KICAgIHJldHVybiAkQ2xhdWRlQmluCn0KCmZ1bmN0aW9uIFNob3ctVXNhZ2UgewpAJwpjbGF1ZGEgLSBsYXVuY2ggQ2xhdWRlIENvZGUgYWdhaW5zdCB0aGUgZGVmYXVsdCBlbmRwb2ludCAodG9rZW4tYmlsbGVkKS4KClVzYWdlOgogIGNsYXVkYSBbY2xhdWRlIGFyZ3MuLi5dICAgU3RhcnQgQ2xhdWRlIENvZGUuIE9uIGZpcnN0IHJ1biB5b3UgYXJlIGFza2VkIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgeW91ciBBUEkgdG9rZW4gKGhpZGRlbik7IGl0IGlzIHNhdmVkIGZvciBuZXh0IHRpbWUuCiAgY2xhdWRhIGxvZ2luICAgICAgICAgICAgICBFbnRlciAvIHJlcGxhY2UgdGhlIHNhdmVkIHRva2VuCiAgY2xhdWRhIGxvZ291dCAgICAgICAgICAgICBEZWxldGUgdGhlIHNhdmVkIHRva2VuCiAgY2xhdWRhIGhlbHAgICAgICAgICAgICAgICBUaGlzIGhlbHAKCllvdXIgc3Vic2NyaXB0aW9uIGBjbGF1ZGVgIGNvbW1hbmQgc3RheXMgdW50b3VjaGVkOiBjbGF1ZGEgcnVucyBpbiBhbiBpc29sYXRlZApjb25maWcgZGlyIHNvIHRoZSB0d28gbmV2ZXIgbWl4LgoKRXhhbXBsZXM6CiAgY2xhdWRhICAgICAgICAgICAgICAgICAgICAgICAgIyBpbnRlcmFjdGl2ZSBzZXNzaW9uCiAgY2xhdWRhIC1wICJleHBsYWluIHRoaXMgcmVwbyIgIyBvbmUtc2hvdDsgYXJncyBwYXNzIHRocm91Z2ggdG8gY2xhdWRlCidAIHwgV3JpdGUtT3V0cHV0Cn0KCmZ1bmN0aW9uIEludm9rZS1SdW4oW3N0cmluZ1tdXSRjbGF1ZGVBcmdzKSB7CiAgICAkdG9rZW4gPSBHZXQtVG9rZW4KICAgIE5ldy1JdGVtIC1JdGVtVHlwZSBEaXJlY3RvcnkgLUZvcmNlIC1QYXRoICRDb25maWdEaXIgfCBPdXQtTnVsbAoKICAgICMgU2NydWIgYW55IGluaGVyaXRlZCBhdXRoIHNvIG9ubHkgY2xhdWRhIGRlY2lkZXMuCiAgICBSZW1vdmUtSXRlbSBFbnY6QU5USFJPUElDX0FQSV9LRVkgICAgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKICAgIFJlbW92ZS1JdGVtIEVudjpBTlRIUk9QSUNfQVVUSF9UT0tFTiAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgUmVtb3ZlLUl0ZW0gRW52OkFOVEhST1BJQ19CQVNFX1VSTCAgIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlCgogICAgJGVudjpBTlRIUk9QSUNfQkFTRV9VUkwgICA9ICREZWZhdWx0QmFzZVVybAogICAgJGVudjpBTlRIUk9QSUNfQVVUSF9UT0tFTiA9ICR0b2tlbgogICAgJGVudjpBTlRIUk9QSUNfTU9ERUwgICAgICA9ICREZWZhdWx0TW9kZWwKICAgICRlbnY6Q0xBVURFX0NPREVfRElTQUJMRV9FWFBFUklNRU5UQUxfQkVUQVMgPSAiMSIKICAgICRlbnY6Q0xBVURFX0NPTkZJR19ESVIgICAgPSAkQ29uZmlnRGlyCgogICAgJGJpbiA9IFJlc29sdmUtQ2xhdWRlQmluCiAgICAmICRiaW4gQGNsYXVkZUFyZ3MKICAgIGV4aXQgJExBU1RFWElUQ09ERQp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIERpc3BhdGNoCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlmICgkQ2xpLkNvdW50IC1nZSAxKSB7CiAgICBzd2l0Y2ggLVJlZ2V4ICgkQ2xpWzBdKSB7CiAgICAgICAgJ14oaGVscHwtaHwtLWhlbHApJCcgeyBTaG93LVVzYWdlOyBleGl0IDAgfQogICAgICAgICdebG9naW4kJyAgeyBbdm9pZF0oR2V0LVRva2VuIC1Gb3JjZSk7IFdyaXRlLU91dHB1dCAiY2xhdWRhOiB0b2tlbiBzYXZlZC4iOyBleGl0IDAgfQogICAgICAgICdebG9nb3V0JCcgewogICAgICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkVG9rZW5GaWxlKSB7CiAgICAgICAgICAgICAgICBbSU8uRmlsZV06OkRlbGV0ZSgkVG9rZW5GaWxlKTsgV3JpdGUtT3V0cHV0ICJjbGF1ZGE6IHRva2VuIHJlbW92ZWQuIgogICAgICAgICAgICB9IGVsc2UgeyBXcml0ZS1PdXRwdXQgImNsYXVkYTogbm8gc2F2ZWQgdG9rZW4uIiB9CiAgICAgICAgICAgIGV4aXQgMAogICAgICAgIH0KICAgIH0KfQoKIyBEZWZhdWx0OiBydW4gQ2xhdWRlIENvZGUgYWdhaW5zdCB0aGUgZGVmYXVsdCBlbmRwb2ludCwgcGFzc2luZyBhbGwgYXJncyB0aHJvdWdoLgpJbnZva2UtUnVuICRDbGkK' $cmdB64 = 'QGVjaG8gb2ZmCnJlbSBjbGF1ZGEgbGF1bmNoZXIgKFdpbmRvd3MpLiBSdW5zIHRoZSBQb3dlclNoZWxsIGltcGxlbWVudGF0aW9uIHdpdGggdGhlCnJlbSBleGVjdXRpb24gcG9saWN5IGJ5cGFzc2VkLCBzbyBpdCB3b3JrcyBldmVuIG9uIFJlc3RyaWN0ZWQtcG9saWN5IG1hY2hpbmVzLgpyZW0gVGhlIGltcGxlbWVudGF0aW9uIGlzIG5hbWVkIGNsYXVkYS1pbXBsLnBzMSAobm90IGNsYXVkYS5wczEpIHNvIHRoYXQgdHlwaW5nCnJlbSBiYXJlIGBjbGF1ZGFgIGluIFBvd2VyU2hlbGwgcmVzb2x2ZXMgdG8gVEhJUyAuY21kLCBuZXZlciB0aGUgLnBzMS4Kc2V0bG9jYWwKcG93ZXJzaGVsbCAtTm9Qcm9maWxlIC1FeGVjdXRpb25Qb2xpY3kgQnlwYXNzIC1GaWxlICIlfmRwMGNsYXVkYS1pbXBsLnBzMSIgJSoKZXhpdCAvYiAlRVJST1JMRVZFTCUK' [IO.File]::WriteAllBytes((Join-Path $installDir 'clauda-impl.ps1'), [Convert]::FromBase64String($ps1B64)) [IO.File]::WriteAllBytes((Join-Path $installDir 'clauda.cmd'), [Convert]::FromBase64String($cmdB64)) Ok " [2/3] Installed clauda -> $installDir" # --------------------------------------------------------------------------- # 3. Add clauda to the user PATH # --------------------------------------------------------------------------- $userPath = [Environment]::GetEnvironmentVariable('Path', 'User') $already = $false if ($userPath) { foreach ($p in ($userPath -split ';')) { if ($p -and $p.TrimEnd('\') -ieq $installDir.TrimEnd('\')) { $already = $true; break } } } if ($already) { Info " [3/3] PATH already contains $installDir" } else { $newPath = if ($userPath) { "$userPath;$installDir" } else { $installDir } [Environment]::SetEnvironmentVariable('Path', $newPath, 'User') Ok " [3/3] Added $installDir to your user PATH" } # Make it usable in the current window too. if (-not (";$env:Path;".ToLower().Contains(";$($installDir.ToLower());"))) { $env:Path = "$env:Path;$installDir" } Write-Host " ------------------------------------------------------------" Ok " Done. Open a NEW terminal and just run:" Write-Host "" Write-Host " clauda" Write-Host "" Write-Host " The first run asks for your API token (hidden), then starts Claude Code." Write-Host "" Info " (In THIS window, if 'clauda' isn't found yet, use: clauda.cmd ...)" Write-Host ""