Windows from zero

For a Windows PC that has never had KernelHub. Every step can be copied, and every step says what success looks like: install Node, install KernelHub with one line, log in a Runtime, pair your phone, send a real task, watch it deliver.

How to use this page
Work from top to bottom, one step at a time. Every step tells you where to open, which line to copy, what success looks like, and what to do if you don't see it. Each command block has a Copy button: click it, paste into PowerShell, press Enter. If your network works, install online — sections 1 and 2 (recommended). Blocked network: section 5. Only when the machine is fully offline: the bundle in section 4.

1 · Before you start: what this PC is missing

You have a Windows 10 / 11 PC that has never had KernelHub on it, and you want to get to "send work from my phone, have this PC do it". First, what it ships with and what it lacks:

ThingOn a fresh Windows?Notes
Windows 10 / 11Official builds for both x64 and ARM64; the installer detects which one you have.
PowerShellYesWindows PowerShell 5.1 is built in. Every command on this page is written for it.
curl.exe / tar / certutilYesBuilt in since Windows 10 1803. This page uses them to download and verify.
Node.js / npmNoThe single most important row on this page. The installer does not install Node for you. Without npm it cannot install an AI coding tool (a Runtime), and you end up with "KernelHub is installed, but it cannot run a single task".
A logged-in RuntimeNoKernelHub ships no model. It drives a CLI coding agent that you installed and logged into yourself (Claude Code by default). Installed is not usable: until you log in, tasks still cannot run.
A phoneWith the KernelHub app installed, for scanning the pairing code, sending tasks and approving.
Three rules (follow them in this order and you skip most of the redo)
  1. Install Node first, then KernelHub. The other way round, you end up unable to work (it is recoverable: once Node is in, run the install command again).
  2. Log the Runtime in once after installing (type claude and follow the prompts). Otherwise every task comes back with "no runtime here can run it".
  3. After pairing, keep icloser run open (or install it as a background task). Pairing only introduces your phone to this PC; the thing that actually picks up work is icloser run.

How to open PowerShell

Press Win + R, type powershell, press Enter. A blue (or black) window means you're in. Only two places on this page need "Run as administrator", and they say so.

2 · With internet access: the shortest path (recommended, 13 steps)

If your network works, use this section. Installing online always gives you the build named in the official manifest, with fewer steps, automatic checksum verification, and the same one-line command for later upgrades. The offline bundle in section 4 is a fallback for machines with no network at all, or where only local packages are allowed: it adds a dozen more steps, and it only solves installing — pairing and sending tasks still need a route to the control plane.

One line per step, copy and run. If something is blocked or you're offline, jump to the matching section.

Your situationSymptomGo to
Internet worksThis section, step 1 through step 13
icloser.xyz unreachableStep 4's irm hangs or times outSection 5 · proxy / mirror; or section 4, offline bundle
registry.npmjs.org unreachablenpm install -g hangs / ECONNRESETSection 5 · npm mirror
nodejs.org / github.com unreachableNode or tools won't downloadSection 5 · proxy; or section 4, offline bundle
No network at allNothing downloadsSection 4, offline bundle — and read its three limits to the end

Step 1 · Check whether this PC has Node

PS> node -v; npm -v

Success looks like: two version numbers (for example v24.21.0 and an npm version). Node is already there — skip to step 4.

On a fresh PC you will see: red text containing "is not recognized as the name of a cmdlet" (on a Chinese system: 「无法将“node”项识别为 cmdlet」). Node is missing — do step 2.

Step 2 · Install Node.js (npm comes with it)

Pick one of two ways. The current LTS is Node v24.21.0 (from the official nodejs.org release index).

Way A: one command (needs winget — Windows 11 and recent Windows 10 have it)

PS> winget install --id OpenJS.NodeJS.LTS --accept-source-agreements --accept-package-agreements

If Windows asks "Do you want to allow this app to make changes to your device?", click Yes. The winget catalogue can trail nodejs.org by a few patch versions; that's fine.

Way B: no winget — pinned version, checked against the official SHA-256 before it installs, stops on mismatch

PS> $v='v24.21.0'; $h='bb0eaee134f9357f22aea915ee793343e627aefc1e66488164bac6915bce2cac'; $f="$env:TEMP\node-$v-x64.msi"; curl.exe -L -o $f "https://nodejs.org/dist/$v/node-$v-x64.msi"; if(((certutil -hashfile $f SHA256 | Select-Object -Index 1).Trim() -replace ' ','').ToLower() -ne $h){ throw 'SHA-256 mismatch - stopped, nothing installed' } else { msiexec /i $f }

Only when the check passes does the Node setup wizard open; click Next through it (an admin prompt may appear — click Yes). For a silent install, replace the trailing msiexec /i $f with msiexec /i $f /qn.

The bb0eaee1… value is the node-v24.21.0-x64.msi line from the official nodejs.org SHASUMS256.txt, checked character by character when this page was written. If you see red text "SHA-256 mismatch - stopped, nothing installed": the download was broken or swapped. Run it again; if it keeps failing, use Way A or the proxy in section 5.

Step 3 · Close PowerShell and open a new one

After Node is installed, the old window doesn't know about it. Close it, open a new one as in section 1, and run again:

PS> node -v; npm -v

Success: two version numbers. Still red: sign out or restart Windows, then try again.

Step 4 · Install KernelHub with one line

PS> irm https://icloser.xyz/install.ps1 | iex

It does these things in order — you don't have to do anything, just watch:

What it doesDetails
Reads the release manifestFetches stable.json from kernelhub.icloser.xyz; refuses to install unless it says READY, with no override. (The script itself is served from icloser.xyz — two different hosts.)
Downloads and verifiesDownloads icloser.exe, checks SHA-256 and size, deletes it and stops on mismatch.
Where it goes%LOCALAPPDATA%\Programs\icloser\icloser.exe, plus three legacy names icli / kernelhub-cli / devnexus-cli.
PATHAdds that folder to your user PATH and to the current window. System PATH is untouched; no admin needed.
Entry checkUsing the PATH and PATHEXT a new terminal will have, checks which file you actually get when you type icloser / icli. If it is not the copy just installed, prints every match in order, what you will get, and three ways out; it does not change your PATH, remove other tools, or refuse to install.
Self-checkRuns icloser version on the spot and compares it with the manifest's version and build.
Local consoleAlso downloads kernelhub-desktop.exe; if that fails, the CLI install still stands.
One Runtimenpm install -g @anthropic-ai/claude-code (only claude, by default).

On success these lines appear (verbatim from the install.ps1 source, not a transcript from a real Windows machine; lines starting with v are green):

v SHA-256 verified
v Installed to C:\Users\<you>\AppData\Local\Programs\icloser\icloser.exe
v Aliases: icli (short name), kernelhub-cli / devnexus-cli (legacy, still work)
v Added C:\Users\<you>\AppData\Local\Programs\icloser to your user PATH
v Typing icloser / icli gets you this install (checked against a new terminal's PATH and PATHEXT)
v icloser 1.0.2 (build 202609161352, commit a4099c062543)
Installing runtime claude (npm install -g @anthropic-ai/claude-code) ...
v Installed runtime: claude (@anthropic-ai/claude-code)

If you see these two lines instead, step 2 was skipped or didn't take effect. KernelHub itself is installed, only the Runtime isn't. Go back to steps 2 and 3, install Node, then run this step's command again (verbatim from the install.ps1 source, not a transcript from a real Windows machine):

  ! No npm on this machine, so no runtime was installed (KernelHub itself is installed)
     Install Node.js (it ships npm), then run this installer again.

Step 5 · Check which version you got

PS> icloser version

Success: one line containing both 1.0.2 and 202609161352 (this line's shape was checked on a real Windows machine):

icloser 1.0.2 (build 202609161352, commit a4099c062543)

"icloser is not recognized as the name of a cmdlet": close the window, open a new one and retry; if it still fails, run step 4 again.

It prints a different version, or some other tool's help menu
Something with the same name sits earlier on your PATH and wins icloser. Two cases seen on a real machine:
  • An npm global package that is also called iCloser (…\npm\iCloser.ps1 / .cmd).
  • An old MSI install (C:\Program Files\KernelHub\bin). Windows looks at the system PATH before the user PATH, so it always comes before the copy just installed.
PowerShell walks the PATH one directory at a time; inside one directory .ps1 wins over .exe / .cmd, whether or not PATHEXT lists .PS1 (confirmed on a real Windows machine, 2026-09-16).
Easiest: use icli, the short name the installer creates alongside, pointing at the copy just installed:
PS> icli version
To see who took the name (every match, in the order PowerShell actually uses):
PS> Get-Command -All icloser
To give the name icloser back to this copy: remove the old MSI under Settings → Apps → KernelHub → Uninstall; for the npm one, find the package with npm ls -g, then npm rm -g it. The yellow block the installer printed in step 4 lists the exact paths on this machine and these same options.

Step 6 · Log the Runtime in once

PS> claude

The first run walks you through logging in (usually by opening a browser). Follow the prompts; once you reach the chat screen, type /exit or press Ctrl + C twice to leave.

Then see which Runtimes this PC recognises and whether they're logged in:

PS> icloser runtimes

Success: the Claude Code row no longer says not installed, and its state isn't NOT_INSTALLED. If it's still stuck on login, the state reads STARTABLE_NOT_AUTHED or "unknown" (STARTABLE_AUTH_UNKNOWN) — log in again.

Step 7 · Go to your project folder

Change D:\your-project below to your real project folder (where the code you want your AI employees to change lives):

PS> cd D:\your-project

Don't do this in your Downloads folder or in the folder you unpacked an installer into: that whole folder becomes the AI employee's workspace. KernelHub refuses folders that look like an unpacked install bundle.

Step 8 · Pair your phone

PS> icloser pair

It does three things in turn:

  1. Creates a workspace in the current folder.
  2. Asks how far the agent may go on this machine — just press Enter for tier 3, read + write + execute: it can change files and run builds and tests. Most people pick this.
  3. Draws a QR code in the window, with a "paste this if you can't scan" link below it.

Scan the code with the KernelHub app on your phone. At the end it says the next step is to keep icloser run going so what you say on the phone gets picked up.

QR code scrolled away? Do not run pair again. Pairing again creates a new, empty workspace, and none of your earlier tasks are in it. Bring the code back with:
PS> icloser qr

You can also do it graphically: open KernelHub Desktop, click "Connect phone", and scan with your phone. Either works.

Step 9 · Enter an invitation code in the phone app

The first time a brand-new account runs pair, the window shows this (measured on Mac and Linux; Windows runs the same CLI):

  账户 7a9e5014 还没有使用权 —— 在 iPhone 或 Android 上输入一次邀请码即可,
  这台机器会自动继承(CLI 上没有激活入口)

It says, in Chinese: this account has no access yet — enter an invitation code once on iPhone or Android and this machine inherits it; the CLI has no activation entry. Open the KernelHub app on your phone and enter your invitation code there. Once it is redeemed, this computer inherits it automatically; nothing to type here.

How to get a code: Access & activation. An account that is already active says access was inherited during pair, and you skip this step.

Step 10 · Start taking work

PS> icloser run

Leave this window open. It keeps running and checks for new tasks every few seconds — it is what picks up the tasks you send from your phone. Its first lines say which workspace it joined and which Runtime it chose.

Step 11 · Send a real task and watch it deliver

With the step 10 window still open, pick up your phone:

  1. In the KernelHub app, choose the workspace you just paired and type one sentence into the box. Name the file if you know it, for example "Add a line with today's date at the end of README.md. Don't commit."
  2. The icloser run window on your computer scrolls a few new lines — the task has been picked up. On the phone the task card turns into a live view: which files it read, which commands it ran, which files it changed.
  3. If the task lacks a permission tier, it stops before acting and shows a card; approving applies to this task only.
  4. When it finishes, tap the card's changes to read the diff line by line, then read the result: what it did, what it changed, what it couldn't do. Not happy? Ask for changes, and the same task carries on.

Success: the task shows as done, the changes show the new line in README.md, and the file on your computer really has that extra line.

No Go / Python on a fresh machine? The first task does not stop for it
KernelHub checks the machine-level base tools (Go, Python) on the way. If one is missing and this machine has not been allowed to access the internet, the task carries on and no card is raised; the icloser run window just logs one line (verbatim from the CLI source, in Chinese: the base tool is not installed, no card, not blocking, the task carries on; to fill it in run icloser env bootstrap go, or allow exec + web for this device):
  ⓘ go:KernelHub Base(机器级,与这条任务无关)没装上 —— 不挂卡、不阻塞,这条任务照常往下跑。要补齐:在这台机器上跑 icloser env bootstrap go,或在设备权限里批 exec + web 后它会自动补上。
A card appears only when the task really needs it — the request names it (say, it mentions go build) or the work actually runs it — and the install is refused; approving applies to this one task only. On a machine that already allows exec and internet access it installs the tool and carries on without any card (seen on a real Windows machine).

Nobody picks it up: check that the step 10 window is still open; if it's still stuck, do the health check in the next step.

Step 12 · Health check (in a second PowerShell)

The step 10 window is busy, so open another PowerShell, cd to the same project folder, and run:

PS> icloser doctor

It checks the service, gateway, queue, permissions and Runtimes in one go. Whatever is wrong, it tells you what to type next.

Step 13 · Keep working after you close the window: run it in the background

Once the step 10 window is closed, nobody picks up tasks from your phone. To have it start by itself when you sign in to Windows, run this in your project folder (no admin needed; it runs as your own account):

PS> icloser daemon install

Success (verbatim from the CLI source, in Chinese: "background task installed (scheduled task: iCloser Agent)"). Installed on a real Windows machine on 2026-09-16: icloser daemon status showed it running, icloser doctor reported the background service as installed and running, and a task was picked up and delivered through it:

✓ 常驻已装好(计划任务:iCloser Agent)

Check on it any time:

PS> icloser daemon status

With the background task installed, you can close the manual icloser run from step 10 — running both is redundant.

Advanced: run even before anyone signs in (Windows service) — read all of this first
Only a machine that must take work with nobody signed in needs this. For a normal user, icloser daemon install above is enough and needs no password; don't install both.
  • It needs PowerShell opened with "Run as administrator".
  • It must be your own account, written as MACHINE\user (for example JIMPC\Jim). A bare user name is not accepted by the Windows service manager (measured on a real machine, 2026-09-16). Not LocalSystem: it can't see your Runtime login, and the command refuses it.
  • ⚠️ The password can currently only be given on the command line. It stays in your PowerShell history and is visible in the process command line while it runs. This is a known defect, not fixed yet. Never copy the line you typed the password into to anyone, or paste it into a chat or ticket — on a real machine a password ended up in a session log exactly this way.
  • How to type it: in the admin PowerShell, first type just icloser service install. It refuses and prints the full command to fill in, with the account already filled in as MACHINE\user; put in your own password and run that.
  • Starting the service afterwards may fail with logon failure. Seen on a real machine; the cause is not established. On a PC signed in with a Microsoft account or a PIN, one possibility is that the password the service needs is not the one you unlock with — only a possibility. If it happens, remove it with icloser service uninstall and go back to icloser daemon install.

3 · Common things after installing

Add another Runtime (no need to rerun the whole install)

Only claude is installed by default. These can be installed with npm: claude, codex, qwen, codebuddy, opencode, kimi, mimo, pi. This line installs codex; swap in any of them:

PS> icloser env bootstrap codex

Or pick it through the installer (again, swap codex for the one you want):

PS> $env:KERNELHUB_RUNTIME='codex'; irm https://icloser.xyz/install.ps1 | iex

Each one needs its own login (type its name, for example codex). Google's entry is agy (Antigravity); it does not come from npm — install it from Google's official channel.

Local console

The console is a separate program; icloser run doesn't start it. Start it (this window stays busy too):

PS> kernelhub-desktop

Then open http://127.0.0.1:18092 in your browser. It listens only on the loopback address, so nothing outside this PC can reach it. To see whether it's running and at what address:

PS> icloser console

If it's running, this opens it in your default browser:

PS> icloser open

4 · No network at all: the offline bundle (fallback — skip it if you can reach the internet)

Make sure online really is impossible first. If the network is merely slow or drops now and then, just re-run the lines in section 2. If a proxy or firewall is blocking you, see section 5. Use this section only when the machine is fully offline, or policy allows local packages only.
The bundle details in this section come from the packaging record made on the Windows machine; this site has not downloaded and re-verified the bundle itself. File name, cloud-drive link, size and SHA-256 are reproduced as recorded — verify the SHA-256 before using it.

The offline bundle carries Node, 7-Zip, Python, Git, document tools, the Runtime packages and the three KernelHub programs, so installing needs no outside network.

ItemValue
File namekernelhub-from-zero-windows-x64-20260913.zip
Cloud-drive linkhttps://pan.baidu.com/s/16hoTpt3MoPlqjtgw5w6DyA
Extraction code2b3w
Size970,619,689 bytes (about 925.6 MiB)
Bundle checkUse the kernelhub-from-zero-windows-x64-20260913.zip.sha256 file that sits next to the bundle. This page prints no fixed hash — the bundle has been repacked once already (same byte count, new hash), and a hard-coded number would make people think the file was tampered with.
Entries50; unpacks to kernelhub-from-zero-windows-x64\, with the installers under winx64\

4.1 Verify the bundle first, then unpack

These commands assume the bundle is in your Downloads folder; if not, change the path.

Download the bundle and the .sha256 file next to it into the same folder. The line below reads that file, computes the hash and compares them for you:

PS> $zip="$env:USERPROFILE\Downloads\kernelhub-from-zero-windows-x64-20260913.zip"; if(-not (Test-Path -LiteralPath $zip)){'Bundle not found - change $zip to the real path'}elseif(-not (Test-Path -LiteralPath "$zip.sha256")){'The .sha256 file is missing - it sits next to the bundle; download both, then run this line'}else{$want=[regex]::Match((Get-Content -Raw -LiteralPath "$zip.sha256"),'[0-9a-fA-F]{64}').Value.ToLower(); $got=((certutil -hashfile $zip SHA256 | Select-Object -Index 1) -replace ' ','').ToLower(); if($want -eq ''){'No 64-character hash inside the .sha256 file - make sure it downloaded fully'}elseif($got -eq $want){"OK $got"}else{"MISMATCH expected $want got $got"}}

Success: it prints OK followed by the hash:

OK  <the hash from the .sha256 file>

If it does not match, do not use it — the transfer was damaged or tampered with; download both files again:

MISMATCH  expected <from the .sha256 file>  got <computed on this machine>

Unpack to D:\kh-apps (every later command assumes this location):

PS> $zip="$env:USERPROFILE\Downloads\kernelhub-from-zero-windows-x64-20260913.zip"; New-Item -ItemType Directory -Force -Path D:\kh-apps | Out-Null; Expand-Archive -LiteralPath $zip -DestinationPath D:\kh-apps -Force; 'Unpacked:'; Test-Path 'D:\kh-apps\kernelhub-from-zero-windows-x64\winx64\stable.json'

Success: the last line is True:

Unpacked:
True

Each command below starts with $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; so that every line can be copied and run on its own. If you unpacked somewhere else, change that bit at the start of each line.

4.2 Install order (follow it, don't skip)

① Install 7-Zip (every .7z below needs it; a graphical installer opens):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; & "$P\winx64\missing\7z2603-x64.exe"

Confirm it's there (it should print a path to 7z):

PS> where.exe 7z

② Unpack Node.js 26.8.2 (everything offline depends on it: without npm, no Runtime installs):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; & "C:\Program Files\7-Zip\7z.exe" x "$P\winx64\missing\node-26.8.2-win32-x64.7z" -o"D:\tools\node" -y

Find node.exe, add it to this window's PATH and check (two version numbers means success):

PS> $ndir=(Get-ChildItem -Path D:\tools\node -Recurse -Filter node.exe | Select-Object -First 1).DirectoryName; $env:Path="$ndir;$env:Path"; node -v; npm -v

Write it into your user PATH so every new window has it:

PS> $ndir=(Get-ChildItem -Path D:\tools\node -Recurse -Filter node.exe | Select-Object -First 1).DirectoryName; $u=[Environment]::GetEnvironmentVariable('Path','User'); if(-not $u){$u=''}; if(($u -split ';') -notcontains $ndir){ [Environment]::SetEnvironmentVariable('Path',($u.TrimEnd(';') + ';' + $ndir),'User'); 'Added to PATH' } else { 'Already on PATH' }

③ Install the three KernelHub programs (no admin) — this line does what the installer does: copies the CLI and console into %LOCALAPPDATA%\Programs\icloser, creates the three legacy names, writes your user PATH, then checks itself:

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; $D="$env:LOCALAPPDATA\Programs\icloser"; New-Item -ItemType Directory -Force -Path $D | Out-Null; Copy-Item "$P\winx64\icloser_windows_amd64.exe" "$D\icloser.exe" -Force; Copy-Item "$P\winx64\kernelhub-desktop_windows_amd64.exe" "$D\kernelhub-desktop.exe" -Force; foreach($a in 'icli','kernelhub-cli','devnexus-cli'){ Set-Content -Path "$D\$a.cmd" -Encoding ASCII -Value ("@echo off`r`n`"%~dp0icloser.exe`" %*`r`nexit /b %ERRORLEVEL%") }; $u=[Environment]::GetEnvironmentVariable('Path','User'); if(-not $u){$u=''}; if(($u -split ';') -notcontains $D){ [Environment]::SetEnvironmentVariable('Path',($u.TrimEnd(';') + ';' + $D),'User') }; $env:Path="$env:Path;$D"; icloser version

Success: the last line is icloser's version line, and its version and build match the bundle's own winx64\stable.json (the bundle was packed on 2026-09-13 and carries the version of that day, not the current release this page describes). The other way (needs admin) is the MSI:

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; $j=Get-Content "$P\winx64\stable.json" -Raw -Encoding UTF8 | ConvertFrom-Json; msiexec /i "$P\winx64\$($j.apps.windows_desktop_x64.file)"

④ Install Runtimes — order matters: the real package first, then the wrapper

Why the order can't be reversed
Four of the top-level tgz files are empty wrappers: claude 27,741 bytes, codex 4,902, opencode 3,051, mimo 5,310 — too small to hold a CLI. The real program is another package under platform-win-x64\. Install only the wrapper and npm goes online for the real one; offline you get a wrapper that won't start, with an error that doesn't say "incomplete package".
RuntimeWrapper size (bytes)Windows real package in the bundle?
claude27,741Yes: platform-win-x64\anthropic-ai-claude-code-win32-x64-2.1.270.tgz
codex4,902Yes: platform-win-x64\openai-codex-0.154.0-win32-x64.tgz
opencode3,051Yes: platform-win-x64\opencode-windows-x64-1.18.30.tgz
mimo5,310Yes: platform-win-x64\mimo-ai-mimocode-windows-x64-0.1.14.tgz
qwen28,929,854Ships dist/vendor, but its full dependency tree is not bundled
codebuddy54,680,912Ships dist/vendor; same as above
kimi19,646,415Ships dist/native; same as above
pi6,986,356Declares 18 regular dependencies, none bundled

First the four real packages:

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\platform-win-x64\anthropic-ai-claude-code-win32-x64-2.1.270.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\platform-win-x64\openai-codex-0.154.0-win32-x64.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\platform-win-x64\opencode-windows-x64-1.18.30.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\platform-win-x64\mimo-ai-mimocode-windows-x64-0.1.14.tgz"

Then the eight wrappers (top-level tgz):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\anthropic-ai-claude-code-2.1.270.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\openai-codex-0.154.0.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\qwen-code-qwen-code-0.23.3.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\tencent-ai-codebuddy-code-2.150.0.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\opencode-ai-1.18.30.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\moonshot-ai-kimi-code-0.42.0.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\mimo-ai-cli-0.1.14.tgz"
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; npm install -g "$P\winx64\earendil-works-pi-coding-agent-0.85.1.tgz"

The ninth, agy (Antigravity), doesn't use npm: run Google's official installer from the bundle, then check it:

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; & "$P\winx64\missing\antigravity-cli-1.2.2-windows-x64.exe"
PS> agy --version

⑤ Log each one in: type each name once in PowerShell (claude, codex, qwen, codebuddy, opencode, kimi, mimo, pi, agy) and follow the login prompts, or it can't run tasks.

⑥ Connect your phone and start taking work: go back to section 2 and do step 7 (project folder) through step 13. Do not pick a project folder under D:\kh-apps.

4.3 Basic tools in the bundle (as needed — you don't need all of them)

The D:\tools\… folders are just examples; put them anywhere, and add their bin folder to PATH.

Python 3.12.10 (portable, no registry, no admin):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; New-Item -ItemType Directory -Force -Path D:\tools\python312 | Out-Null; tar -xzf "$P\winx64\missing\cpython-3.12.10+20250409-x86_64-pc-windows-msvc-install_only.tar.gz" -C D:\tools\python312 --strip-components=1; D:\tools\python312\python.exe -V

Python 3.14.7 (also in the bundle; pick per project):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; New-Item -ItemType Directory -Force -Path D:\tools\python314 | Out-Null; tar -xzf "$P\winx64\missing\cpython-3.14.7+20260901-x86_64-pc-windows-msvc-install_only.tar.gz" -C D:\tools\python314 --strip-components=1; D:\tools\python314\python.exe -V

Portable Git (self-extracting; -o / -y are the usual 7z self-extractor switches, marked untested in the source notes):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; & "$P\winx64\missing\PortableGit-2.55.0.5-64-bit.7z.exe" -o"D:\tools\git" -y; & "D:\tools\git\cmd\git.exe" --version

uv (Python package manager):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; Expand-Archive -Path "$P\winx64\missing\uv-x86_64-pc-windows-msvc.zip" -DestinationPath D:\tools\uv -Force

ripgrep (rg.exe):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; Expand-Archive -Path "$P\winx64\missing\ripgrep-15.2.0-x86_64-pc-windows-msvc.zip" -DestinationPath D:\tools\rg -Force

jq (single exe):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; New-Item -ItemType Directory -Force -Path D:\tools\rg | Out-Null; Copy-Item "$P\winx64\missing\jq-windows-amd64.exe" D:\tools\rg\jq.exe -Force

pandoc 3.11 (document conversion):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; Expand-Archive -Path "$P\winx64\missing\pandoc-3.11-windows-x86_64.zip" -DestinationPath D:\tools\pandoc -Force

poppler (includes pdftotext.exe):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; Expand-Archive -Path "$P\winx64\missing\Release-26.07.0-0.zip" -DestinationPath D:\tools\poppler -Force

Python document-processing packages (this one needs internet; use whichever python.exe you installed):

PS> D:\tools\python312\python.exe -m pip install python-docx openpyxl xlrd python-pptx pypdf pdfplumber PyMuPDF pandas odfpy markdownify markitdown beautifulsoup4 lxml reportlab Jinja2 tabulate Pillow pytesseract pdf2image

Note: pytesseract also needs Tesseract itself; pdf2image needs the poppler above. imagemagick, also used for documents, is not in the bundle — if you need it, get the Windows build from imagemagick.org and verify its hash yourself.

4.4 Three limits of the offline route (you need to know these)

Limit 1 · Installed is not the same as able to receive tasks. The agent runs locally, but what carries a task from your phone to this PC is the control plane, and that link needs a network. The bundle solves installing; on a blocked network you still need a path to the control plane (the proxy / tunnel in section 5), or you'll get stuck at pairing.
Limit 2 · For four Runtimes the real program isn't in the top-level tgz. claude / codex / opencode / mimo must follow 4.2's "real package first, wrapper second". qwen / codebuddy / kimi / pi don't carry their full dependencies — to be fully offline, npm install -g them on a machine with internet, then pack up the global node_modules and bring it over.
Limit 3 · npm install -g on a local tgz still looks for the online registry to resolve dependencies. If you have a proxy, set up section 5's proxy and npm settings before installing; with no network at all, use limit 2's approach.

5 · Blocked network: getting your commands out

First use the table at the start of section 2 to work out which part is blocked. Every command below can be copied on its own.

5.1 Set a proxy (for this window only)

Replace PORT with your own proxy's address and port (your proxy app's settings show it, often called mixed-port or HTTP port). curl.exe reads http_proxy / https_proxy, while PowerShell's irm uses .NET's default proxy — this line sets both, then checks:

PS> $proxy='http://127.0.0.1:PORT'; $env:http_proxy=$proxy; $env:https_proxy=$proxy; [Net.WebRequest]::DefaultWebProxy=New-Object Net.WebProxy($proxy); curl.exe -sS -o NUL -w "install.ps1 -> HTTP %{http_code}`n" https://icloser.xyz/install.ps1

Success:

install.ps1 -> HTTP 200

No HTTP 200: the proxy address or the proxy itself is wrong; don't go further yet. Once it works, section 2's commands need no changes — just run them in this same window.

5.2 Use an npm mirror

Switch to a mirror and check (it echoes the mirror address):

PS> npm config set registry https://registry.npmmirror.com; npm config get registry

Use the mirror for one command only, without changing global settings:

PS> npm install -g @anthropic-ai/claude-code --registry=https://registry.npmmirror.com

With a proxy, tell npm about it as well:

PS> if($env:http_proxy){ npm config set proxy $env:http_proxy; npm config set https-proxy $env:http_proxy; npm config get proxy } else { 'Set $env:http_proxy first (previous command), then run this line' }

registry.npmmirror.com is a common public mirror; to use another one, swap the address.

5.3 Use a pip mirror

Save it in pip's config so every install uses the Tsinghua mirror, and check:

PS> D:\tools\python312\python.exe -m pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple; D:\tools\python312\python.exe -m pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn; D:\tools\python312\python.exe -m pip config list

Just this once:

PS> D:\tools\python312\python.exe -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx openpyxl pandas

5.4 Point KernelHub's own downloads at a mirror

For company networks with an internal mirror (it must mirror the official folder exactly; the manifest's SHA-256 is still checked):

PS> $env:KERNELHUB_INSTALL_BASE='https://your-mirror.example.com/kernelhub'; irm https://icloser.xyz/install.ps1 | iex

Note: this only changes where the manifest and packages come from — the installer script itself still comes from icloser.xyz.

5.5 Three more installer switches

Install somewhere else (default %LOCALAPPDATA%\Programs\icloser):

PS> $env:KERNELHUB_BIN_DIR='D:\tools\icloser'; irm https://icloser.xyz/install.ps1 | iex

Install no Runtime at all (CLI only):

PS> $env:KERNELHUB_SKIP_RUNTIME=1; irm https://icloser.xyz/install.ps1 | iex

Install a specific one: see the codex line in section 3 and swap codex for the one you want.

6 · Verify the files yourself

"The file is there" is not "it is installed". These checks need no network and use Windows' built-in certutil.

Check the installed icloser.exe (the one installed online in step 4: x64 against the first row of the table below, ARM64 against the second):

PS> certutil -hashfile "$env:LOCALAPPDATA\Programs\icloser\icloser.exe" SHA256

For the three programs in the offline bundle, one line each compares against the bundle's manifest (a line starting with OK means it matches):

PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; $j=Get-Content "$P\winx64\stable.json" -Raw -Encoding UTF8 | ConvertFrom-Json; $g=((certutil -hashfile "$P\winx64\icloser_windows_amd64.exe" SHA256)[1] -replace ' ','').ToLower(); if($g -eq $j.platforms.'windows-amd64'.sha256.ToLower()){"OK icloser $g"}else{"MISMATCH expected $($j.platforms.'windows-amd64'.sha256) got $g"}
OK  icloser  <the hash recorded in the bundle's winx64\stable.json>
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; $j=Get-Content "$P\winx64\stable.json" -Raw -Encoding UTF8 | ConvertFrom-Json; $g=((certutil -hashfile "$P\winx64\kernelhub-desktop_windows_amd64.exe" SHA256)[1] -replace ' ','').ToLower(); if($g -eq $j.desktop.'windows-amd64'.sha256.ToLower()){"OK desktop $g"}else{"MISMATCH expected $($j.desktop.'windows-amd64'.sha256) got $g"}
PS> $P='D:\kh-apps\kernelhub-from-zero-windows-x64'; $j=Get-Content "$P\winx64\stable.json" -Raw -Encoding UTF8 | ConvertFrom-Json; $g=((certutil -hashfile "$P\winx64\$($j.apps.windows_desktop_x64.file)" SHA256)[1] -replace ' ','').ToLower(); if($g -eq $j.apps.windows_desktop_x64.sha256.ToLower()){"OK msi $g"}else{"MISMATCH expected $($j.apps.windows_desktop_x64.sha256) got $g"}
FileBytesSHA-256
icloser_windows_amd64.exe (online install, v1.0.2)13,111,296eafd5e4749736b039ee5ade97137f10aa864b4a09c92b5d5b25bd36dd0050ce6
icloser_windows_arm64.exe (online install, v1.0.2)12,070,400d652cb0275e5a23bcbf6c3bc682f99a09e6419fff11bd2f3673f6e92adafe067
KernelHub-Setup-1.0.2-windows-x64.msi (download page · Windows x64 installer, v1.0.2)9,154,560fa7a9af8b657dce72ebc2a4f9b29c4aaf4ddaf59b1c759f900296b7688d595e6
KernelHub-1.0.2-windows-arm64-portable.zip (download page · Windows ARM64 portable, v1.0.2)7,961,700e4de254b316cd6d18ca14d2b894aca568606284180c067efdf0bc74394d347fe
CLI, console and MSI inside the offline bundleWhatever the bundle's own winx64\stable.json says — not printed here (the three lines above compare it for you)
node-v24.21.0-x64.msi (step 2, Way B)bb0eaee134f9357f22aea915ee793343e627aefc1e66488164bac6915bce2cac
Offline bundle zip (section 4)970,619,689Whatever the .zip.sha256 file next to the bundle says — not printed here (the line in 4.1 compares it for you)

The first four rows are read from this release's manifest stable.json when this page is built; the files inside the offline bundle get no numbers here — the bundle was packed on 2026-09-13, is not the same batch as this release, and its own stable.json is the reference for their hashes; the Node row comes from nodejs.org's SHASUMS256.txt; the zip row comes from the packaging record.

Check every file in the bundle (optional; close to 1 GB, so it takes a while; prints ok for each good file):

PS> $ws='D:\kh-apps\kernelhub-from-zero-windows-x64'; (([IO.File]::ReadAllText("$ws\SHA256SUMS-安装包.txt",[Text.Encoding]::UTF8)) -split "`r?`n") | ForEach-Object { if($_ -match '^([0-9a-f]{64}) (.+)$'){ $f=Join-Path $ws ($Matches[2] -replace '/','\'); if(-not (Test-Path -LiteralPath $f)){ "MISSING : $($Matches[2])"; return }; $got=((certutil -hashfile "$f" SHA256) | Select-Object -Index 1).Trim() -replace ' ',''; if($got.ToLower() -ne $Matches[1]){ "MISMATCH: $($Matches[2])" } else { "ok : $($Matches[2])" } } }

7 · Common errors: symptom → cause → the one line to run

What you seeCauseWhat to do
node / npm not recognized as a cmdletNode not installed, or no new window after installingDo step 2; close and reopen the window afterwards
Installer prints ! No npm on this machine, so no runtime was installedKernelHub was installed before NodeInstall Node, open a new window, run irm https://icloser.xyz/install.ps1 | iex again
icloser not recognized as a cmdletThe old window didn't get the new PATHClose and reopen; if still failing, rerun step 4
irm hangs, times out, or the connection is closedicloser.xyz is blockedProxy in 5.1; or the offline bundle in section 4
npm install -g hangs / ECONNRESETThe official npm registry is blockednpm mirror in 5.2
Tasks come back with "no runtime here can run it"Runtime not installed or not logged inType claude to log in, then check with icloser runtimes
Phone paired, but tasks just sit thereicloser run isn't open and no background task is installedRun icloser run in the project folder, or icloser daemon install from step 13
icloser version prints a different version, or another tool's help menuSomething with the same name earlier on PATH took the name (an npm global iCloser, an old MSI)Use icli; see step 5
icloser doctor says the background service is installed but not runningThe scheduled task was endedDo what it prints: icloser run to start it here, or icloser daemon install to reinstall
The QR code scrolled awayThe window scrolledType icloser qrdon't pair again
service install says --password is missing, or that you must name an accountA Windows service needs an account and passwordUse icloser daemon install from step 13, which needs no password; if you really want a service, read the "Advanced" block in step 13 first (the password stays in your command history)
Service installed, but starting it fails with logon failureCause not established; on a PC signed in with a Microsoft account / PIN the password may not matchicloser service uninstall, then use icloser daemon install
Service shows Running but every task failsIt runs as LocalSystem and can't see your loginRemove it and use your own account, or use icloser daemon install
Windows warns "unknown publisher" / SmartScreen blocks itThe Windows builds aren't Authenticode-signed yetVerify the SHA-256 as in section 6; only if it matches, choose "Run anyway"
SHA-256 doesn't matchBroken or swapped downloadDelete and download again; don't install it
Errors mid-download, or Download failed … the manifest and the server disagreeMost likely the network dropped mid-download (measured on Mac / Linux, where the installer says the same thing in Chinese; Windows uses the same check)Run the same command again

8 · Uninstall / clean up completely

① If you installed the background task, remove it first (from any folder):

PS> icloser daemon uninstall

② See exactly what would be deleted (list only):

PS> Get-ChildItem -Force -Directory "$env:USERPROFILE" | Where-Object { $_.Name -in @('.kernelhub','.kernelhub-gate','.kernelhub-protected') } | Select-Object FullName

③ Delete the data folders. The three hold configuration and the task ledger, identity credentials, and the protected root; it's only clean once all three are gone. You'll have to pair again afterwards:

PS> Remove-Item -Recurse -Force "$env:USERPROFILE\.kernelhub","$env:USERPROFILE\.kernelhub-gate","$env:USERPROFILE\.kernelhub-protected" -ErrorAction SilentlyContinue

④ Delete the programs:

PS> Remove-Item -Recurse -Force "$env:LOCALAPPDATA\Programs\icloser"

Finally, in Settings → System → About → Advanced system settings → Environment Variables, you can remove the …\Programs\icloser entry from your user Path. Node and the Runtimes are things you installed yourself; remove them with their own uninstallers.