Unofficial community reference. Not affiliated with 37signals or the Omacom Foundation. Download Omarchy only from omarchy.org.
omarchylinux.org Unofficial field manual

Claude Code or agent CLI not found on Omarchy

Why claude, codex, gh and other mise-backed agent CLIs go missing, hang forever, or print junk on Omarchy 4, and how to rebuild the stubs and fix PATH.

Workaround available Applies to Omarchy 4.0.0 and later Last verified 2026-09-16 on 4.0.4
Short answer

On Omarchy 4 the agent CLIs are not packages. They are tiny mise stubs in ~/.local/bin written by omarchy-mise-install. If claude or codex is not found, run omarchy refresh applications to rewrite every stub, then open a new shell. If the command is found but hangs forever, your PATH puts ~/.local/bin ahead of the mise shims, which makes the stub exec itself.

On this page
  1. The fix
  2. Verify it worked
  3. Why it happens
  4. If that did not work
  5. Related

On Omarchy 4 the coding agents are not packages. claude, codex, opencode, gemini, copilot, crush, grok, pi, omp, gh and the rest are small bash stubs in ~/.local/bin, each written by omarchy-mise-install and each backed by mise. That is why “not found” and “found but broken” have completely different causes here. Checked against v4.0.0 through v4.0.4.

The fix

Work through these in order. Everything below is for Omarchy 4.x; 3.x is at the end.

  1. Find out what the shell actually resolves.

    type -a claude
    ls -l ~/.local/bin/claude

    A stub is a regular file starting with #!/bin/bash and containing mise use -g --quiet.

  2. If the stub is missing, rewrite every stub at once:

    omarchy refresh applications

    That runs install/user/mise.sh, which calls omarchy-mise-install for each shipped tool. For a single tool: omarchy-mise-install claude. For a tool with a non-default backend, pass the package first, for example omarchy-mise-install npm:@xai-official/grok grok.

  3. Open a new shell, or reload PATH in the current one:

    exec bash -l

    ~/.local/bin and ~/.local/share/mise/shims are appended to PATH by default/bash/env-bootstrap, which the login profile, /etc/skel/.bashrc and the uwsm session all source. If you never get a login shell, that bootstrap never runs.

  4. If the command is found but hangs forever, check PATH order. This is the exec loop. The 4.0.4 stub template still has it, and the fix in PR #9175 is open and unmerged:

    printf '%s\n' "$PATH" | tr : '\n' | grep -n 'local/bin\|mise/shims'

    If the .local/bin line number is lower than the mise/shims line, the stub shadows the real binary and execs itself. Fix the thing that prepends ~/.local/bin. The common offender is the uv installer’s env snippet in ~/.bashrc, which prepends $HOME/.local/share/../bin. That path resolves to ~/.local/bin, but because the string differs, the snippet’s own “already on PATH” check does not catch it. Remove that line, or move it above Omarchy’s own bootstrap so the shims stay in front.

    To get work done right now without touching your rc files, bypass the stub:

    mise x claude -- "$(mise which claude)"
  5. If the stub runs but its output is corrupted, it predates the --quiet flag that landed in 4.0.1. Symptoms are a mise ~/.config/mise/config.toml tools: gh@... banner on stdout, and for gh a git push that dies with warning: invalid credential line. Regenerate it:

    omarchy-mise-install gh
    omarchy-mise-install claude

    Nothing regenerates these automatically. The bulk regeneration migration parses an older wrapper format and silently skips every current stub.

  6. If the launcher says claude is not installed. Choose an installed agent with: omarchy default agent <name>, you have no default agent recorded, or the recorded one has no command. Set it:

    omarchy default agent claude

    This writes ~/.config/omarchy/defaults/agent and installs the tool through mise if it is not there. omarchy agent then launches it; Super + Shift + Ctrl + A and the a alias both go through the same path.

  7. If picking the default agent installs an older build than the one you already had, defeat mise’s release cooldown by hand:

    MISE_MINIMUM_RELEASE_AGE=0 mise use -g claude

    omarchy-default-agent is the one place that does not set that variable. The stubs, omarchy-update-mise and the mup alias all do.

On 3.x this page mostly does not apply. Omarchy 3.8.4 shipped claude-code as a pacman package in install/omarchy-base.packages, there was no omarchy-agent, no default-agent picker and no ~/.local/bin stub. If claude is missing on 3.x, reinstall the package. The switch to mise stubs happened in 4.0.0.

Verify it worked

type -a claude          # ~/.local/bin/claude first, then the mise shim
timeout 60 claude --version
mise which claude       # absolute path inside ~/.local/share/mise/installs
claude --version 2>/dev/null | head -1   # no mise banner on stdout
omarchy default agent   # prints the recorded default, empty if none

claude --version should return in seconds. If it is still running after a minute, you are in the exec loop, not a slow download.

Why it happens

omarchy-mise-install writes a stub of this shape:

#!/bin/bash
export MISE_MINIMUM_RELEASE_AGE=0
mise use -g --quiet "claude" || exit 1
exec mise x "claude" -- "claude" "$@"

The last line hands mise x a bare command name. mise x resolves that name through PATH, and how it builds that PATH is the whole story. smartpbx worked out the rule on issue #7360 and guruthechosen confirmed it. With no shims directory on PATH, mise puts the tool’s install directory at the very front, and the stub can never win. With the shims directory present, mise slots the install directory in just ahead of it and does not touch anything earlier. So if ~/.local/bin sits ahead of the shims, the stub finds itself, execs itself, and never returns. exec keeps it in one PID, so ps shows a single command burning a core rather than an obvious fork bomb.

A stock install does not trip this: env-bootstrap appends the shims directory first and ~/.local/bin after it, so the order mise needs is already there. Something else has to push ~/.local/bin to the front, which is why the loop shows up for some people and not others on identical releases.

Two other paths lead to the same symptom. omarchy-mise-install runs rm -f on the target before writing, so a hand-written wrapper you put at one of those names is deleted without a prompt when the stubs are refreshed. And a stale mise registry can make the install itself fail, which leaves you with a stub and no binary behind it; that is what the OpenCode and gh reports on 4.0.0 turned out to be, cleared by updating mise rather than by any Omarchy change.

If that did not work

  • npm-backed agents need the mise environment, not just the path. Running "$(mise which grok)" directly can fail with exec: node: not found, because the npm shim’s fallback is a bare exec node. Always keep mise x in the chain.
  • If omarchy default agent prints Could not install Claude Code with mise, run mise use -g claude by hand and read the full error. A stale registry or a failed attestation shows up there and nowhere else.
  • Update mise itself before blaming Omarchy: sudo pacman -Syu mise-bin. Omarchy 4.0.1 swapped Arch’s mise for the mise-bin package from its own repo (migration 1786952219).
  • If you removed the preinstalls, ~/.local/state/omarchy/preinstalls-removed exists and several migrations deliberately skip writing stubs for you. Install what you want by hand with omarchy-mise-install.
  • A wrapper of your own that was overwritten is probably gone for good. Omarchy configures snapper for the root subvolume only, so pre-update snapshots do not cover /home.

Evidence on the exec loop is strong and current: three separate open reports filed on 4.0.0 and 4.0.1, a confirmation on 4.0.3, matching reproductions in each, and an unmerged PR (#9175) that changes the stub template. Evidence on how often the stub simply goes missing is thinner, and mostly reaches the tracker as a side effect of the other bugs.

Upstream threads about this error

347 issues on the Omarchy tracker match this error cluster. Newest fixes often appear as comments on the most-discussed threads.

IssueStateCommentsOpened
#5478 Hard Crash with AMD GPU on 3.6 since upgrade. Triggered by Chromium use -closed602026-04-28
#1022 2016 MacBook Pro bizarre WiFi behaviorclosed392025-08-24
#2272 Chromium everything is gray?closed362025-10-07
#4821 # No Sound Fix: ASUS ROG Strix G16 (2025) on Omarchy 3.4.1open102026-02-28
#1607 Screenshot not working · fixed by #1714 closed152025-09-11
#6762 ttfx dumps core on every idle lock: omarchy-system-lock kills the screensaver terminal before the renderer · fixed by #6764 #6773 #18 #160 closed222026-08-12
#6888 Stranded-lock recovery never completes: requestSessionLock() early-returns on sessionLock.secure, so the session stays on "lockscreen app died" forever · fixed by #1 open172026-08-14
#7229 Fingerprint reader fails after suspend: fprintd reports "Cannot run while suspended" · fixed by #7158 closed172026-08-17
#9334 Windows VM 4.0.2: launch fails silently after polkit auth (setgid chmod check can never pass)closed152026-08-31
#11019 External monitors on a USB-C dock never return after undocking (aquamarine 0.15.0 regression)open162026-09-09

Accepted answers upstream

Questions people ask

Where does the claude command actually live on Omarchy 4?
At ~/.local/bin/claude, as a four-line bash stub. It runs mise use -g --quiet claude, then execs the real binary through mise x. Nothing is downloaded until the first run.
Is Claude Code still a pacman package like it was on Omarchy 3?
No. Omarchy 3.8.4 listed claude-code in install/omarchy-base.packages. Omarchy 4.0.0 moved Claude Code and the GitHub CLI from packages and npm to mise stubs.
Why does claude --version sit there at 40 percent CPU and never return?
The stub found itself on PATH instead of the real binary and exec'd itself. It stays one PID, so it looks wedged rather than looping. See issues #7360 and #8990.

Sources and credit

Fixes on this page were worked out by husamemadH (First diagnosis of the wrapper exec loop and the merged fix in PR #6350), smartpbx (The PATH rule that decides whether the loop fires, worked out on issue #7360), guruthechosen (Filing issue #7360 with the depth-counted proof of the loop, and showing that npm-backed agents still need the mise x environment for node), LukeSkypewalker (Reproducing the hang with a throwaway wrapper name), jayrascodes (Finding that pre-4.0.1 stubs still pollute stdout and break git credential helpers), yashksaini-coder (Tracing the default-agent picker installing an older build than the one you have). Text here is our own paraphrase; follow the links for the original threads.

Unofficial. Verify against the official manual for your version. Improve this page Markdown version Sources