If you run Claude Code, Codex and OpenClaw on a Windows PC and want one app to chat with all of them, like a messaging app, I know of two that cover all three today: AionUi, a big workspace with an agent of its own, and littleguys, a 7 MB chat app where each agent is a contact.
Disclosure: I make littleguys. It only got a Windows build on November 1, so this post is half answer, half field notes on what broke.
What's out there
- littleguys is free and MIT. Claude Code, Codex, Gemini CLI, OpenClaw and Hermes sit in one list like contacts, you reply and approve their commands from one window, and a little guy by the taskbar clock shows who's working and who needs you. It has no agent of its own.
- AionUi is free and Apache-2.0, and much bigger: it brings its own agent, 20+ CLI agents, office-document assistants and cron tasks. It starts its own session for each chat.
- Happy Desktop runs Claude Code, Codex and Gemini on your subscriptions, with phone apps.
- Orca is the pick if your agents write code and you want each task in its own git worktree.
- One vendor only: the Claude desktop app, OpenClaw Windows Hub and Codex in the ChatGPT app are each very good at exactly one agent.
Two apps that do this on a Mac don't help here: Agent Hub is Apple silicon only, and Aight is an iPhone and Mac app.
What Windows actually changed
littleguys is a Tauri app, Rust underneath, so "port it" sounds like a checkbox. Claude Code did most of the work, which seems fair, since the worst bug was about Claude Code. A Windows CI job went green with 169 Rust tests. And the first release with Windows still had a bug that blocked permission prompts on some PCs.
There's no sh
littleguys follows Claude Code sessions through a small plugin of hooks. On a Mac each hook is a shell one-liner. Claude Code's docs spell out the catch: hooks default to bash on Windows only if Git Bash is installed, and to PowerShell if it isn't. So on a PC without Git for Windows, sh hook.sh ran in PowerShell, where sh doesn't exist. A failing PermissionRequest hook blocks the request, which meant the plugin could stop the very prompts it was there to show. Version 0.2.2 shipped with this. Version 0.2.3 fixed it by never going through sh on Windows:
{
"type": "command",
"shell": "powershell",
"command": "try { & ([scriptblock]::Create([IO.File]::ReadAllText((Join-Path $env:CLAUDE_PLUGIN_ROOT 'hooks\\hook.ps1')))) PermissionRequest 86000 } catch {}; exit 0"
}
Two things in that line earn their keep. The script is read in as a script block, so the execution policy doesn't apply. And it always exits 0, because a hook that dies must never be the reason a prompt can't be answered.
No unix socket, and refused connections are slow
On a Mac the hook talks to the app over a unix socket only this user can open. On Windows it's 127.0.0.1 with a per-launch secret: each launch writes <port> <secret> <pid> to a file next to the hook, and requests without the secret are refused.
Then the hook needs to do nothing, fast, when the app isn't running. On Windows a refused connection takes seconds, and that delay lands on every hook. So the hook checks whether the process is still there first:
if (-not $owner -or -not (Get-Process -Id ([int]$owner) -ErrorAction SilentlyContinue)) { exit 0 }
Your PATH isn't what you think it is
A GUI app doesn't get your terminal's PATH, and a running process keeps the one it started with. littleguys reads the saved PATH from the registry, adds the usual npm, Node and Claude Code folders, and reads it again after installing something. claude might be claude.exe and npx is npx.cmd, so finding a program means trying the extensions too. Everything it spawns needs CREATE_NO_WINDOW, or your screen flashes console windows. And stopping an agent means taskkill on the whole process tree, not just the shim you started.
The updater quit the app mid-run
On the Mac, updates wait until no agent is working. On Windows the updater's install step runs the installer and quits the app at once, which would have cut off an agent mid-run. Now it only downloads in the background, and runs the installer at the same idle moment the Mac relaunches at.
Smaller things
- Claude Code writes attached files as
- name: C:\...on Windows. The transcript parser skipped those, so attached images didn't show. - The tray sprite had to be redrawn white and square for a dark taskbar, and Windows likes to tuck it under the ^ arrow.
- The popover opens above the tray, not below it. Mica and Acrylic stand in for macOS vibrancy.
What still isn't great
- The installer isn't code-signed. The first run says Windows protected your PC. Click More info, then Run anyway. It installs for your user alone, with no admin rights.
- There's no Arm build, and no Linux version.
- It's new. If something doesn't work on your PC, open an issue.
The lesson I'd pass on: CI proved the Rust worked on Windows, and said nothing about what Claude Code does on a PC without Git Bash. Anything that plugs into another tool's hooks needs testing in that tool, on a machine set up like your users' machines, not only in your own test suite.
Drafted with AI help from littleguys' commits and code. I checked it and I stand behind it.
Top comments (0)