Set up on Windows
Setup takes three steps on the Setup page. The app opens once the test passes.
Before you start
- The Claude Code CLI, installed and signed in by you. Run
claudeonce to sign in with your Claude plan. - Node.js 20 or later. If it is missing, install it from the Node.js website or with
winget install OpenJS.NodeJS.LTS, then open a new PowerShell window. - Windows PowerShell 5.1 or later. Use PowerShell, not Command Prompt.
1. Your computer and Claude
Choose Windows, tick every way you use Claude (CLI, Desktop app, Cowork), then Continue.
2. Install
Press "Show my install line". Open PowerShell, paste the line and press Enter. It looks like this, with your own Cardinal address and key in place of the dots:
$env:CARDINAL_URL='...'; $env:CARDINAL_TOKEN='tmr_...'; irm .../join.ps1 | iex
If you see "'irm' is not recognized", you pasted it into Command Prompt. Open PowerShell instead. The line holds a new key for this computer and is shown once.
What it does, stopping at the first problem:
- Checks PowerShell can run scripts (full language mode), finds your
claude(it prefersclaude.exein%USERPROFILE%\.local\bin), checks it is signed in with a Claude plan, and checks Node.js. A missing or signed-outclaudeis a warning, not a stop. - Downloads the runner to
%LOCALAPPDATA%\Cardinal\cardinal-runner.mjs. - Writes
%APPDATA%\Cardinal\runner.jsonand adds Cardinal's telemetry settings and session-end hook to%USERPROFILE%\.claude\settings.json, keeping a backup of your old settings. - Registers a Scheduled Task for you only, called "Cardinal runner". It starts at every logon, runs hidden with no window, restarts every minute if it stops, and never runs twice at once.
- Checks the connection to Cardinal.
It ends with: "Done. Now open Claude and ask it one question, then press 'Test my setup' in Cardinal."
3. Test my setup
Open Claude, ask it one question, then press "Test my setup". It turns green when the runner has checked in and Claude's first event has arrived.
Running the line again is safe. It replaces Cardinal's hook instead of adding a second one, and replaces the Scheduled Task.