From 9d0849f71754bf02440fab0f06a9184c749c88ab Mon Sep 17 00:00:00 2001 From: Spencer Bull Date: Mon, 7 Sep 2026 20:51:45 -0500 Subject: [PATCH 1/2] Add the Claude desktop app to Install > AI Follows the ChatGPT flow: the Install > AI entry runs omarchy-install-ai-claude in a floating terminal, which installs the claude-desktop package (Anthropic's Linux desktop beta, repacked from their Debian repo in omarchy-pkgs) and opens the app. Remove > AI drops the package along with ~/.config/Claude and ~/.cache/Claude, the Electron directories the desktop app owns, while keeping ~/.claude, ~/.claude.json, and ~/.cache/claude-cli-nodejs: those belong to the Claude Code CLI, which ships in its own package and survives this removal, just as the ChatGPT remover keeps the Codex CLI. The menu mark is a new U+E90E glyph in the Omarchy icon font, from Simple Icons' Claude mark, so it reaches desktops through the next omarchy-settings release. Co-Authored-By: Fable 5 Co-Authored-By: Codex XHigh --- bin/omarchy-install-ai-claude | 15 +++++++++++++++ bin/omarchy-remove-ai-claude | 19 +++++++++++++++++++ default/fonts/omarchy/README.md | 1 + default/fonts/omarchy/omarchy.ttf | Bin 9440 -> 9972 bytes default/omarchy/omarchy-menu.jsonc | 2 ++ manual/17-ai.md | 2 +- test/shell.d/menu-test.sh | 2 +- test/shell.d/remove-ai-test.sh | 18 ++++++++++++++++++ 8 files changed, 57 insertions(+), 2 deletions(-) create mode 100755 bin/omarchy-install-ai-claude create mode 100755 bin/omarchy-remove-ai-claude diff --git a/bin/omarchy-install-ai-claude b/bin/omarchy-install-ai-claude new file mode 100755 index 00000000..85a7e593 --- /dev/null +++ b/bin/omarchy-install-ai-claude @@ -0,0 +1,15 @@ +#!/bin/bash + +# omarchy:summary=Install the Claude desktop app +# omarchy:requires-sudo=true + +set -euo pipefail + +echo "Installing Claude..." +omarchy-pkg-add claude-desktop + +echo "Opening Claude..." +setsid uwsm-app -- /usr/bin/claude-desktop >/dev/null 2>&1 & + +echo "" +echo "Claude has been installed." diff --git a/bin/omarchy-remove-ai-claude b/bin/omarchy-remove-ai-claude new file mode 100755 index 00000000..9c66c5d0 --- /dev/null +++ b/bin/omarchy-remove-ai-claude @@ -0,0 +1,19 @@ +#!/bin/bash + +# omarchy:summary=Remove the Claude desktop app along with its configuration and caches. +# omarchy:requires-sudo=true + +# -u so an unset HOME is an error rather than a set of rm -rf paths rooted at /. +set -euo pipefail + +omarchy-pkg-drop claude-desktop + +# Not ~/.claude, ~/.claude.json, or ~/.cache/claude-cli-nodejs: those belong +# to the Claude Code CLI, which ships in a different package that survives +# this one. The desktop app keeps its state in its own Electron directories. +rm -rf \ + "$HOME/.config/Claude" \ + "$HOME/.cache/Claude" + +echo "" +echo "Claude has been removed." diff --git a/default/fonts/omarchy/README.md b/default/fonts/omarchy/README.md index b731549d..df93aa55 100644 --- a/default/fonts/omarchy/README.md +++ b/default/fonts/omarchy/README.md @@ -16,6 +16,7 @@ The private-use glyphs in `omarchy.ttf` are: - `U+E90B` — Perplexity, from - `U+E90C` — OpenClaw, traced from the lobster mascot the openclaw package ships as `dist/control-ui/favicon.svg`, since upstream publishes no monochrome SVG - `U+E90D` — Cursor, from +- `U+E90E` — Claude, from The agent marks are monochrome so the menu can render them using the active theme's foreground and selection colors. diff --git a/default/fonts/omarchy/omarchy.ttf b/default/fonts/omarchy/omarchy.ttf index 632c91bb5441d37a752681d6d50943ea30e543a3..3c70d8031f15323654523a51fe288297c945edd7 100644 GIT binary patch delta 968 zcmZ9KO=uHa6vxkI4VsikSNsJ5wy_*uozkX8duY^#-5 zL5bkz!2>@Sa8XbZb)|?>9=wGMw}K!-5d=XOZXybbx;37e){W=#pY#8nbLQO5eP8&# z<65)|PXWN$xu>^(|Et0T0O>?NUaA!5?>pgb$o~LvQzxDCCr*rB?ggN$0Fj5~+2Tyk zqv0z6u}e5VSjK`(coX@5p=qH&=>F^Tg&hg9Y(2 z7B-wNR%Y#g-(JK4yfFA=e(vmIq4CoLfQ}LD|K~1d9CwJ6ssa*4b)$IHJs|i6GLBWx zbz@fiIuA>jnd^YIr=wYlZ!nIBwX?Ei@anCwH|^?A(4-P_^9~CWY{{ zAVp*LK$j3x6HHY@sv;3#a96$|K|==zTe;7h3@$K1oKip_l;?%GrgFSU6_KYSV;RF} zPjFm3JFfCnIdsHgn%*G@`d@n&(kVq8tL~ghwl)T1;jK;~(6=L%4tI6+ca7ORQ&c_F zVi+xi6N%hp8cc81_|Ea^NSKT!bCP*^qb3WJyC&(+ueuUWW+%5ym}KhoR#A^d7q)E_ zmxXXL(1%aOe`Cb9?N8s{9Se>8fS~sX0Y1EZeh#j`85NmFyql(}A?)N)%c#n__t?|J z_3U6CL+wFbK>dx%yC&ZwE3f^lnA<`UD-m-wNSOPvt(zkaZZvaL5lc?-+{`TA^$SK~ Bv?l-n delta 420 zcmZ8cJxBs!7=FI%Dmw`RJvD16Dj~Rj@E}5h+{z&wglLK`Gac^qDno^$Er_HaK8moR zp;ZEL%)N#}iiU=$)?1n!+OF3dEZT zuO$u5{H*=llYR$;Xj(6AKL1{90pcRydCH`;jmf*n3EgcFXEJ2CnCPZ+i#VDw@ AI_ menu also carries a few graphical AI apps: the ChatGPT desktop app, Grok Bot for chatting with xAI's models, Hermes Desktop, OpenClaw, and the Perplexity desktop app. +The _Install > AI_ menu also carries a few graphical AI apps: the ChatGPT desktop app, the Claude desktop app (Anthropic's Linux beta, with Chat, Cowork, and Claude Code tabs), Grok Bot for chatting with xAI's models, Hermes Desktop, OpenClaw, and the Perplexity desktop app. Hermes Desktop is the one to know about, because there is only ever one Hermes on a machine. The app only runs against a runtime built from its own commit, so it installs one of its own under `~/.hermes` on first launch, which takes a few minutes and shows its own progress. From then on that is the Hermes the terminal `hermes` command and the default agent use too, whichever order you installed them in. Installing it also hands Hermes the Omarchy theme as a skin named `omarchy`, which every Hermes surface follows as you switch themes; pick another under Hermes' Appearance settings or with `/skin` if you'd rather it didn't, and Omarchy leaves that choice alone. Removing the app under _Remove > AI_ takes that runtime with it, and keeps your chats, memories, and the skills Hermes wrote for itself unless you tell it otherwise: it asks, defaulting to no, whether that data and your connection settings should go too. diff --git a/test/shell.d/menu-test.sh b/test/shell.d/menu-test.sh index b227bb10..a424379b 100644 --- a/test/shell.d/menu-test.sh +++ b/test/shell.d/menu-test.sh @@ -641,5 +641,5 @@ assert( JS font_charset=$(fc-query --format='%{charset}' "$ROOT/default/fonts/omarchy/omarchy.ttf") -[[ $font_charset == *"e900-e90d"* ]] || fail "Omarchy icon font includes every custom menu glyph" +[[ $font_charset == *"e900-e90e"* ]] || fail "Omarchy icon font includes every custom menu glyph" pass "Omarchy icon font includes the official agent marks" diff --git a/test/shell.d/remove-ai-test.sh b/test/shell.d/remove-ai-test.sh index 9d518318..7c8ae043 100644 --- a/test/shell.d/remove-ai-test.sh +++ b/test/shell.d/remove-ai-test.sh @@ -55,6 +55,24 @@ pass "ChatGPT removal keeps the Codex CLI's runtime cache" [[ -d $HOME/.codex ]] || fail "ChatGPT removal keeps the Codex CLI's config" pass "ChatGPT removal keeps the Codex CLI's config" +# The Claude Code CLI ships in its own package and keeps its state in +# ~/.claude, ~/.claude.json, and ~/.cache/claude-cli-nodejs, so removing the +# desktop app must not take it. +fresh_home +mkdir -p "$HOME/.config/Claude" "$HOME/.cache/Claude" "$HOME/.cache/claude-cli-nodejs" "$HOME/.claude" +touch "$HOME/.claude.json" +"$ROOT/bin/omarchy-remove-ai-claude" >/dev/null + +for gone in .config/Claude .cache/Claude; do + [[ ! -e $HOME/$gone ]] || fail "Claude removal deletes the desktop app's config and caches" "$gone" +done +pass "Claude removal deletes the desktop app's config and caches" + +for kept in .claude .claude.json .cache/claude-cli-nodejs; do + [[ -e $HOME/$kept ]] || fail "Claude removal keeps the Claude Code CLI's state" "$kept" +done +pass "Claude removal keeps the Claude Code CLI's state" + # LM Studio's models follow a relocatable home, named only by the pointer file. fresh_home mkdir -p "$tmp_dir/relocated-models/models" From e3392ef76fb5ebd2570be3b322546990047dc6dd Mon Sep 17 00:00:00 2001 From: Spencer Bull Date: Thu, 10 Sep 2026 19:26:34 -0500 Subject: [PATCH 2/2] Quit the running Claude app before removing it Electron rewrites ~/.config/Claude for as long as the app runs, so removing the package and deleting the directory while it is open leaves the app running and the directory back within the same second, holding fresh Preferences and crash-reporter state. Driven end to end on an edge worker: remove via the menu with the app open left 11 processes and a recreated ~/.config/Claude; with the app quit first the directory stayed gone. The test stubs pkill so the suite cannot take a developer's own Claude with it, and asserts the remover reached for it. Co-Authored-By: Fable 5.1 Co-Authored-By: Codex XHigh --- bin/omarchy-remove-ai-claude | 4 ++++ test/shell.d/remove-ai-test.sh | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/bin/omarchy-remove-ai-claude b/bin/omarchy-remove-ai-claude index 9c66c5d0..3df3c105 100755 --- a/bin/omarchy-remove-ai-claude +++ b/bin/omarchy-remove-ai-claude @@ -6,6 +6,10 @@ # -u so an unset HOME is an error rather than a set of rm -rf paths rooted at /. set -euo pipefail +# The app rewrites ~/.config/Claude for as long as it runs, so a removal that +# leaves it running deletes the directory and watches it come straight back. +pkill -x claude-desktop || true + omarchy-pkg-drop claude-desktop # Not ~/.claude, ~/.claude.json, or ~/.cache/claude-cli-nodejs: those belong diff --git a/test/shell.d/remove-ai-test.sh b/test/shell.d/remove-ai-test.sh index 7c8ae043..d81e6ca6 100644 --- a/test/shell.d/remove-ai-test.sh +++ b/test/shell.d/remove-ai-test.sh @@ -15,6 +15,14 @@ printf 'drop:%s\n' "$*" >>"$TEST_LOG" SCRIPT chmod +x "$tmp_dir/bin/omarchy-pkg-drop" +# omarchy-remove-ai-claude quits the running app before deleting its state; +# a real pkill here would take the developer's own Claude with it. +cat >"$tmp_dir/bin/pkill" <<'SCRIPT' +#!/bin/bash +printf 'pkill:%s\n' "$*" >>"$TEST_LOG" +SCRIPT +chmod +x "$tmp_dir/bin/pkill" + # omarchy-remove-ai-perplexity asks through gum whether the user's data goes # too. The stub answers "no" unless a test says otherwise and logs the call: a # real gum would hang the run, and one that answered "yes" on its own would be @@ -73,6 +81,9 @@ for kept in .claude .claude.json .cache/claude-cli-nodejs; do done pass "Claude removal keeps the Claude Code CLI's state" +grep -qx 'pkill:-x claude-desktop' "$TEST_LOG" || fail "Claude removal quits the running app before deleting its state" +pass "Claude removal quits the running app before deleting its state" + # LM Studio's models follow a relocatable home, named only by the pointer file. fresh_home mkdir -p "$tmp_dir/relocated-models/models"