clauderipple 0.4.1 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,61 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.1 — 2026-09-28
4
+
5
+ ### Fixed
6
+
7
+ - **Prompt caching on anthropic-compatible providers** (#36, #37, by @grapefruit0205).
8
+ Claude Code's billing header opens the system prompt and changes every turn, so a
9
+ vendor with a plain prefix cache cached nothing after it: DeepSeek via Alibaba Bailian
10
+ reported 0.3% over two days. The header is now dropped for these providers, as it
11
+ already was for the translated ones; measured 99% on the next turns.
12
+ - **Switching a session from a translated model to Claude.** The translated providers
13
+ return reasoning as unsigned, sometimes empty `thinking` blocks, and Anthropic refused
14
+ every turn after the switch with "each thinking block must contain thinking". Unsigned
15
+ thinking is now dropped before a request reaches Anthropic.
16
+ - **Windows install when the user name equals the computer name** (#38, reported by
17
+ @haemilchu). The scheduled task is registered as `DOMAIN\user`; the bare name did not
18
+ resolve and registration failed with 0x80070057 before `settings.json` was written.
19
+ - **Windows reinstall no longer re-registers a correct task.** The check read two
20
+ battery settings under names the task object does not have, so it never matched and
21
+ every install registered again — what fails on machines that protect the task.
22
+ Checked in a Windows 11 VM.
23
+ - **`clauderipple` in a new PowerShell window** (#38). The installer leaves no `.ps1`
24
+ shim, so PowerShell runs the `.cmd` under the default execution policy.
25
+
26
+ ## 0.5.0 — 2026-09-24
27
+
28
+ Linux, and four fixes from the first outside contributions.
29
+
30
+ ### Added
31
+
32
+ - **Linux** (#28, #33, #34, by @grapefruit0205). `install`, `status`, `restart` and
33
+ `uninstall` work where there is a systemd user session: the router runs as
34
+ `~/.config/systemd/user/clauderipple.service`, with no sudo. A health self-exit is
35
+ restarted after two seconds, and a stop waits out the 90-second drain. Picker mode
36
+ trusts the local CA in the NSS database Chromium reads (`~/.pki/nssdb`, your user
37
+ only) and needs `certutil` (`libnss3-tools` / `nss-tools`). Measured by the
38
+ contributor on Ubuntu 24.04 x64 with Claude Desktop 2.2553.13.
39
+
40
+ ### Fixed
41
+
42
+ - **`npm test` no longer rewrites your real `~/.claude/settings.json`** (#16, #26, #30).
43
+ The admin tests isolated the router's home but not the Claude settings path, so a
44
+ test run pointed `NODE_EXTRA_CA_CERTS` at a temp directory it then deleted, and every
45
+ Claude Code session on the machine failed until the file was fixed by hand.
46
+ - **A failed install leaves `settings.json` alone** (#27, #31). The proxy settings are
47
+ now written only after the end-to-end probe passes, and `picker on` checks the
48
+ router is answering before it points Claude Desktop at it.
49
+ - **Anthropic-compatible providers keep the conversation after a tool call** (#29, #32).
50
+ Claude Code's `thread: continue` carries only the new messages; the router stripped
51
+ the field and forwarded that delta, so the model got orphan tool results and no task.
52
+ It is now refused as for the translated providers, and the CLI resends the full turn.
53
+ - **`picker on` and `status` from a PowerShell 7 terminal on Windows** (#35). Windows
54
+ PowerShell inherited PowerShell 7's module path and lost the `Cert:` drive: `picker on`
55
+ stopped at "Cannot find drive 'Cert'" and `status` called a trusted CA untrusted.
56
+ Every `powershell.exe` we start now drops the inherited `PSModulePath`. Reproduced
57
+ and checked in a Windows 11 VM.
58
+
3
59
  ## 0.4.1 — 2026-09-24
4
60
 
5
61
  ### Fixed
package/README.ko.md CHANGED
@@ -19,6 +19,7 @@
19
19
  <a href="LICENSE"><img alt="GPL-3.0" src="https://img.shields.io/badge/license-GPL--3.0-blue"></a>
20
20
  <img alt="macOS" src="https://img.shields.io/badge/macOS-arm64%20%7C%20x64-black">
21
21
  <img alt="Windows" src="https://img.shields.io/badge/Windows-arm64%20%7C%20x64-0078D4">
22
+ <img alt="Linux" src="https://img.shields.io/badge/Linux-x64%20(systemd)-FCC624">
22
23
  <img alt="Node" src="https://img.shields.io/badge/node-24%2B-success">
23
24
  <a href="README.md"><img alt="English" src="https://img.shields.io/badge/docs-English-blue"></a>
24
25
  </p>
@@ -73,8 +74,10 @@ Claude에 돈을 내고 있다면 3P는 선택지가 아닙니다. 낸 돈의
73
74
 
74
75
  ### 클로드 데스크톱 앱에서 GPT를 쓸 수 있나요?
75
76
 
76
- 됩니다. ClaudeRipple을 설치하고 Claude 모델 이름 하나를 GPT 모델에 매핑하면, Code 탭이 GPT로 답합니다.
77
- 모델 피커에는 GPT의 실제 이름이 뜹니다. 앱 자체는 고치지도 않고, 다른 모드로 바꾸지도 않습니다.
77
+ 됩니다. **Code 탭**과 그 서브에이전트에서 됩니다. ClaudeRipple을 설치하고 ChatGPT Plus나 Pro 구독으로
78
+ 로그인하면, GPT(챗GPT의 GPT-6 Sol·Luna·Astra, GPT-5.6 Terra 등)가 모델 피커에 실제 이름으로 뜨고, 고른 추론 강도
79
+ 그대로 답합니다. 앱 자체는 고치지도 않고, 다른 모드로 바꾸지도 않습니다. 일반 **채팅** 탭은 Claude 그대로입니다.
80
+ 채팅까지 바꾸려면 앱 전체를 게이트웨이 모드로 돌려야 해서 어떤 도구도 못 합니다([1P냐 3P냐](#1p냐-3p냐--이-프로젝트가-존재하는-이유) 참고).
78
81
 
79
82
  ### Claude Code(터미널)에서 GPT를 쓰려면요?
80
83
 
@@ -109,43 +112,96 @@ ChatGPT 구독으로 GPT를 쓰고, OpenRouter나 직접 API 키로 DeepSeek·Ki
109
112
  ### 윈도우에서도 되나요?
110
113
 
111
114
  됩니다. macOS와 Windows, arm64와 x64 모두. 설치·대시보드·재시작·제거를 Windows 11 arm64에서 실측했고,
112
- x64 런타임은 에뮬레이션으로 확인했습니다.
115
+ x64 런타임은 에뮬레이션으로 확인했습니다. systemd 사용자 세션이 있는 Linux에서도 됩니다. 설치, 라우터를 거친
116
+ Code 탭 요청, 스트리밍 응답 도중의 재시작, 제거를 Ubuntu 24.04 x64와 Claude Desktop 2.2553.13에서
117
+ 실측했습니다. 피커 모드도 됩니다. `cli.extraModels`의 모델이 Code 탭 피커에 Claude 모델과 나란히 뜹니다.
113
118
 
114
119
  ### 제 코드가 다른 데로 가나요?
115
120
 
116
121
  가지 않습니다. 프록시는 내 컴퓨터에서 돕니다. 요청은 설정한 프로바이더로만 가고, 자격증명은
117
122
  홈 디렉터리에만 저장됩니다. [개인정보](#개인정보) 절을 보세요.
118
123
 
124
+ ### Claude 계정이 정지(밴)되지 않나요? 약관 위반 아닌가요?
125
+
126
+ ClaudeRipple이 Claude에 하는 일은 작고 확인할 수 있습니다. Claude로 가는 요청은 Claude Code가 보낸 그대로
127
+ 한 바이트도 바꾸지 않고 나가고, GPT 등 다른 프로바이더로 보낸 요청은 Anthropic에 아예 가지 않습니다. 앱을 고치는
128
+ 방식이 아니라, Claude Code가 회사 네트워크용으로 문서화해 둔 프록시·인증서 설정(`HTTPS_PROXY`,
129
+ `NODE_EXTRA_CA_CERTS` — 공식 문서 [Enterprise network configuration](https://code.claude.com/docs/en/corporate-proxy))을 씁니다. 계정 정지 사례로 알려진 것은 반대 방향, 즉 Claude 구독 로그인을 **다른 프로그램**에서
130
+ 쓰는 경우입니다. ClaudeRipple에도 그런 선택 기능이 하나 있습니다. Codex 안에서 Claude를 구독 로그인으로 쓰는
131
+ 것인데, 이는 Anthropic 약관의 적용을 받습니다. Anthropic API 키로 쓰면 이 문제가 없습니다. Claude 구독 여러 개를
132
+ 돌려 쓰는 것도 같은 약관 아래 각자 판단할 일입니다. 계정을 어떻게 다룰지는 Anthropic만 정할 수 있으니, 여기 적은
133
+ 내용은 보장이 아닙니다.
134
+
135
+ ### ChatGPT 계정을 여러 개 쓸 수 있나요?
136
+
137
+ 됩니다. `clauderipple login`을 할 때마다(또는 대시보드의 **+ ChatGPT 계정 추가**) 계정이 하나씩 늘어납니다.
138
+ 한 계정이 한도에 걸리면 같은 요청을 다음 계정이 이어받고, 한도가 찬 계정은 풀릴 때까지 쉽니다. 대화는 답한 계정에
139
+ 고정되어 프롬프트 캐시를 지킵니다. Claude Desktop Code 탭, Claude Code, Codex 앱·CLI의 GPT에 모두 적용됩니다.
140
+
141
+ ### Codex에서 Claude를 쓸 수 있나요?
142
+
143
+ 됩니다. `clauderipple codex on`을 하면 ClaudeRipple이 프로바이더로 추가되고, Codex 앱과 CLI의 모델 목록에
144
+ Claude 모델이 이름 그대로 뜹니다. Claude Code 로그인이나 Anthropic API 키로 답합니다.
145
+ [Codex 앱과 Codex CLI](#codex-앱과-codex-cli) 절을 보세요.
146
+
147
+ ### Claude Code 안에서는 GPT 성능이 떨어지지 않나요?
148
+
149
+ Claude Code의 시스템 프롬프트와 도구 설명은 Claude에 맞춰 쓰여 있어서, 다른 모델은 남에게 맞춘 지시를 읽는 셈이고
150
+ 자기 전용 앱에서와 조금 다르게 굴 수 있습니다. ClaudeRipple은 모델마다 자기 이름과 추론 강도를 알려 주고, 벤더가
151
+ 거부할 도구 스키마를 고쳐 넘기며, 프로바이더별로 지시문을 덧붙일 수 있게 합니다. 흔한 구성은 Claude를 메인으로 두고
152
+ GPT나 DeepSeek을 서브에이전트로 쓰는 것입니다.
153
+
154
+ ### CC Switch, opencodex, claude-code-router와 뭐가 다른가요?
155
+
156
+ [비교표](#네-개-대신-하나)를 보세요. 요약하면 ClaudeRipple은 앱이 Claude에 로그인된 채로 Claude
157
+ **데스크톱 앱**의 Code 탭에 들어가고, 다른 모델을 피커에 실제 이름으로 보여 줍니다. CC Switch도 데스크톱 앱에
158
+ 들어가지만, 앱의 게이트웨이(3P) 모드를 켜는 방식입니다.
159
+
160
+ ### 무료인가요?
161
+
162
+ 무료입니다. GPL-3.0 오픈소스입니다. 이미 쓰고 있는 구독이나 API 키 비용만 듭니다.
163
+
119
164
  ## 네 개 대신 하나
120
165
 
121
- 비슷한 도구들은 터미널용입니다. Claude Code CLI나 Codex CLI가 다른 모델을 쓰게는 해 주지만, Claude **데스크톱 앱**에는
122
- 닿지 못하고, 다른 모델로 바꾸는 순간 Claude 구독 쪽 기능(claude.ai 채팅, Remote Control, 클라우드 세션)을 잃습니다.
166
+ 비슷한 도구들은 Claude Code CLI나 Codex CLI가 다른 모델을 쓰게는 해 주지만, Claude **데스크톱 앱**에는 닿지 못하거나
167
+ 게이트웨이(3P) 모드로만 닿고, 다른 모델로 바꾸는 순간 Claude 구독 쪽 기능(claude.ai 채팅, Remote Control, 클라우드 세션)을 잃습니다.
123
168
  ClaudeRipple은 데스크톱 앱·터미널·Codex를 메뉴 막대 앱 하나로 다루고, 두 구독을 나란히 쓰며, Claude Code 하네스를
124
169
  그대로 둡니다. 스킬·훅·MCP 서버·`CLAUDE.md`·서브에이전트·claude.ai 커넥터가 전부 살아 있는 채로 두뇌만 바뀝니다.
125
170
 
126
- | | ClaudeRipple | claude-code-router | Claude Desktop 게이트웨이(3P) 모드 |
127
- |---|---|---|---|
128
- | 게이트웨이(3P) 모드 **없이** Claude **Desktop** Code 탭 | ✅ | ❌ | ❌ (정의상 불가) |
129
- | claude.ai 채팅·Remote Control·클라우드 세션·커넥터 유지 | ✅ | ❌ | ❌ |
130
- | Claude 구독과 GPT 구독 나란히 | ✅ | ❌ | ❌ |
131
- | Desktop 피커에 실제 모델 이름 | ✅ | ❌ | 일부 |
132
- | ChatGPT 계정 여러 개, 한도 차면 자동 전환 (Desktop·Codex) | ✅ | ❌ | ❌ |
133
- | 터미널 `claude` CLI | ✅ | ✅ | ✅ |
134
- | Codex **앱**·Codex CLI → Claude | ✅ | ❌ | ❌ |
135
- | 번역 프로바이더의 프롬프트 캐시 | **94~99 %** 실측 | 제각각 | 해당 없음 |
136
- | 서브에이전트를 실제 모델 이름으로 표시 | ✅ | ❌ | ❌ |
137
- | 터미널 없이 쓰는 설정 GUI | ✅ | ❌ | ❌ |
138
- | 런타임 내장, 서명·공증된 앱 | ✅ | ❌ | – |
171
+ | | ClaudeRipple | CC Switch (2026-09-24 확인) | opencodex / openclaude (2026-09-16 확인) | claude-code-router | Claude Desktop 게이트웨이(3P) 모드 |
172
+ |---|---|---|---|---|---|
173
+ | 게이트웨이(3P) 모드 **없이** Claude **Desktop** Code 탭 | ✅ | ❌ ² | ❌ ¹ | ❌ | ❌ (정의상 불가) |
174
+ | claude.ai 채팅·Remote Control·클라우드 세션·커넥터 유지 | ✅ | ❌ | ❌ | ❌ | ❌ |
175
+ | Claude 구독과 GPT 구독 나란히 | ✅ | ❌ 한 번에 프로바이더 하나 | ❌ 전부 아니면 전무 | ❌ | ❌ |
176
+ | Desktop 피커에 실제 모델 이름 | ✅ | ❌ `claude-*` 역할 이름 ² | ❌ | ❌ | 일부 |
177
+ | ChatGPT 계정 여러 개, 한도 차면 자동 전환 (Desktop·Codex) | ✅ | ❌ 수동 전환 ³ | ✅ | ❌ | ❌ |
178
+ | 터미널 `claude` CLI | ✅ | ✅ | ✅ | ✅ | ✅ |
179
+ | Codex **앱**·Codex CLI → Claude | ✅ | ✅ | ✅ | ❌ | ❌ |
180
+ | 번역 프로바이더의 프롬프트 캐시 | **94~99 %** 실측 | 미측정 | 미측정 | 제각각 | 해당 없음 |
181
+ | 서브에이전트를 실제 모델 이름으로 표시 | ✅ | ❌ | ❌ | ❌ | ❌ |
182
+ | 터미널 없이 쓰는 설정 GUI | ✅ | ✅ | ❌ | ❌ | ❌ |
183
+ | 런타임 내장, 서명·공증된 앱 | ✅ | ✅ | ❌ | ❌ | – |
184
+
185
+ ¹ opencodex는 README에 Claude Desktop 데모를 걸어 두었지만, 저장소에도 문서 사이트에도 설치 절차가 없었습니다
186
+ (2026-09-16 확인). 당시 데스크톱 앱으로 들어가는 공개된 경로는 공식 게이트웨이 설정, 즉 마지막 칸뿐이었습니다.
187
+
188
+ ² CC Switch는 데스크톱 앱의 서드파티 프로필(`Claude-3p/claude_desktop_config.json`, `"inferenceProvider": "gateway"`)을
189
+ 써서 들어갑니다. 즉 마지막 칸과 같은 경로입니다. 로컬 게이트웨이를 거치면 피커에는 `claude-sonnet-*`·`claude-opus-*`·
190
+ `claude-haiku-*` 역할 이름만 보입니다([CC Switch 매뉴얼](https://github.com/farion1231/cc-switch/blob/main/docs/user-manual/en/2-providers/2.6-claude-desktop.md)).
191
+ CC Switch는 이 표보다 많은 도구(Gemini CLI, OpenCode 등)를 다루고, MCP 서버와 스킬을 도구 사이에 동기화합니다.
192
+
193
+ ³ ChatGPT 계정은 프로바이더 카드마다 하나씩 묶이고, 공식 ChatGPT 카드는 페일오버 대상에서 빠집니다(v3.20.0 릴리스 노트).
139
194
 
140
195
  데스크톱 앱의 "서드파티 추론" 설정은 앱 전체를 다른 모드로 바꿔 버립니다. claude.ai 채팅, Remote Control,
141
- 클라우드 세션을 잃습니다. `ANTHROPIC_BASE_URL`을 바꿔치기하는 도구들은 데스크톱 앱에 아예 닿지 못합니다.
196
+ 클라우드 세션을 잃습니다. `ANTHROPIC_BASE_URL`을 바꿔치기하는 도구들은 데스크톱 앱에 닿지 못하고, 닿는 도구는 바로 그
197
+ 설정을 씁니다.
142
198
  ClaudeRipple은 Claude Code 프로세스만 신뢰하는 작은 HTTPS 프록시입니다. 매핑한 모델 요청만 프로바이더로 가고,
143
199
  나머지는 Anthropic으로 바이트 그대로 지나갑니다.
144
200
 
145
201
  ## 할 수 있는 것
146
202
 
147
- - **Claude Desktop과 Claude Code에서 어떤 모델이든.** ChatGPT Plus/Pro 구독으로 GPT-5.6 Terra / Sol / Luna와
148
- GPT-6 Astra를, 아니면 DeepSeek·Kimi·GLM·MiniMax·Qwen·Grok·Mistral·Groq·Together·Fireworks·OpenRouter(400+ 모델)·
203
+ - **Claude Desktop과 Claude Code에서 어떤 모델이든.** ChatGPT Plus/Pro 구독으로 GPT-6 Sol / Luna / Astra와
204
+ GPT-5.6 Terra / Sol / Luna를(OpenAI가 새 모델을 내면 그날 바로 뜹니다), 아니면 DeepSeek·Kimi·GLM·MiniMax·Qwen·Grok·Mistral·Groq·Together·Fireworks·OpenRouter(400+ 모델)·
149
205
  로컬 Ollama / LM Studio를. 피커에 실제 이름으로 띄우거나, Claude 이름에 매핑해서.
150
206
  - **Codex 앱과 Codex CLI에서 Claude를.** Codex가 프로바이더로 인식하는 로컬 OpenAI 호환 엔드포인트. Claude 모델이
151
207
  Codex 자체 모델 목록에 뜹니다. 현재 Claude Code 로그인이나 Anthropic API 키를 씁니다.
@@ -184,6 +240,17 @@ curl -fsSL https://raw.githubusercontent.com/PBJ-2/clauderipple/main/scripts/ins
184
240
  irm https://raw.githubusercontent.com/PBJ-2/clauderipple/main/scripts/install.ps1 | iex
185
241
  ```
186
242
 
243
+ **Linux** (systemd가 있는 데스크톱 세션)
244
+
245
+ ```sh
246
+ curl -fsSL https://raw.githubusercontent.com/PBJ-2/clauderipple/main/scripts/install.sh | sh
247
+ ```
248
+
249
+ 라우터는 사용자 단위 systemd 서비스로 돕니다. 상태는 `systemctl --user status clauderipple`, 출력은
250
+ `journalctl --user -u clauderipple`로 봅니다. 피커 모드는 Chromium이 읽는 NSS 데이터베이스
251
+ (`~/.pki/nssdb`, 내 사용자에게만, sudo 없이)에 로컬 CA를 등록하므로 `certutil`이 필요합니다.
252
+ `clauderipple picker on` 전에 `sudo apt install libnss3-tools`(Fedora는 `sudo dnf install nss-tools`)를 실행하세요.
253
+
187
254
  준비물은 없습니다. 이미 Node 24 이상이 있으면 그것을 쓰고, 없으면 공식 빌드를 `~/.clauderipple/runtime`에
188
255
  내려받습니다. 내려받은 파일은 nodejs.org가 공개한 체크섬과 대조합니다. 그다음 설치까지 마칩니다. 로컬 인증서,
189
256
  `~/.claude/settings.json` 두 줄, 컴퓨터를 켤 때 함께 뜨는 백그라운드 라우터. 관리자 권한도, 암호 입력도 필요
@@ -222,11 +289,12 @@ clauderipple restart
222
289
 
223
290
  선택 사항, Desktop 피커에 실제 이름을 띄우려면: **클라이언트 → Claude Desktop → 모델 피커 → 켜기**. 그다음 Claude
224
291
  Desktop을 완전히 종료했다가 다시 엽니다. 로컬 인증서를 사용자 범위로만 신뢰시키는데, 이때 macOS는 로그인 암호를
225
- 묻고 Windows는 지문이 적힌 확인 창을 띄웁니다. ClaudeRipple은 암호를 보지 않으며, 양쪽 다 관리자 권한이 필요
226
- 없습니다.
292
+ 묻고 Windows는 지문이 적힌 확인 창을 띄웁니다. Linux는 묻지 않고 NSS 데이터베이스에 등록합니다. ClaudeRipple은
293
+ 암호를 보지 않으며, 어느 플랫폼도 관리자 권한이 필요 없습니다.
227
294
 
228
295
  > **Claude Desktop은 창을 닫아도 종료되지 않습니다.** 그 상태로 다시 열면 이전 인스턴스를 재사용해서 새 설정을
229
- > 읽지 않습니다. 제대로 종료하십시오(macOS는 ⌘Q, Windows는 트레이 아이콘 또는 작업 관리자). 안 그러면 피커가
296
+ > 읽지 않습니다. 제대로 종료하십시오(macOS는 ⌘Q, Windows는 트레이 아이콘 또는 작업 관리자, Linux는 Ctrl+Q 또는
297
+ > 트레이 아이콘. `pgrep -f claude-desktop`이 아무것도 출력하지 않을 때까지). 안 그러면 피커가
230
298
  > 아무 말 없이 그대로입니다.
231
299
 
232
300
  <details>
@@ -321,7 +389,7 @@ Anthropic API 키로 갑니다. 구독 로그인 재사용은 Anthropic 약관
321
389
 
322
390
  | 프로바이더 | 종류 | 인증 | 모델 목록 | 비고 |
323
391
  |---|---|---|---|---|
324
- | ChatGPT 구독 | Codex 백엔드 | 로그인 여러 개, 한도 차면 자동 전환(Codex 로그인도 재사용) | Terra, Sol, Luna, Astra | 추론 강도 low…max(Luna는 ultra), 프롬프트 캐시 94~99 % |
392
+ | ChatGPT 구독 | Codex 백엔드 | 로그인 여러 개, 한도 차면 자동 전환(Codex 로그인도 재사용) | 구독에서 자동으로 읽음(GPT-6 Sol·Luna·Astra, GPT-5.6 …) | 추론 강도 low…max(Luna는 ultra), 프롬프트 캐시 94~99 % |
325
393
  | OpenRouter | Anthropic 호환 | API 키 | 400+, 자동 검색 | 모델별 추론 강도 지원을 API에서 읽음 |
326
394
  | DeepSeek, Kimi, Z.ai GLM, MiniMax, Qwen(국제/중국) | Anthropic 호환 | API 키 | 프리셋 | 벤더 공식 문서로 확인 |
327
395
  | xAI Grok, Mistral, Groq, Together, Fireworks | OpenAI 호환 | API 키 | 자동 검색 | 번역(Chat Completions / Responses) |
@@ -365,6 +433,9 @@ Codex 앱 / CLI ──/v1/responses──▶ ClaudeRipple 입구 ──▶ Claud
365
433
  - **Windows 지원은 이제 막 들어갔습니다(2026-09-14).** 설치·설정·라우터·로그인·피커·실제 GPT 호출까지 x64
366
434
  실기에서 확인했고, 크래시 복구는 arm64에서 확인했습니다. 창은 아직 Windows 기본 제목 표시줄을 씁니다.
367
435
  Windows 빌드는 서명되지 않았습니다(위 설치 항목 참고).
436
+ - **Linux 지원도 이제 막 들어갔습니다(2026-09-24).** 기여자가 Ubuntu 24.04 x64에서 설치·Code 탭 요청·스트리밍
437
+ 도중 재시작·피커 모드·제거를 실측해 보내 주었습니다. systemd 사용자 세션이 필요하고, 다른 배포판과 arm64는
438
+ 확인하지 않았습니다.
368
439
  - ChatGPT, OpenRouter, Codex 안의 Claude는 실제 계정으로 검증했습니다. 나머지 프리셋은 벤더 공식 문서를 따릅니다.
369
440
  - 피커에 추가한 모델은 다음 세션부터 쓸 수 있습니다.
370
441
  - Claude Code와 Codex는 통신 규약을 자주 바꿉니다. 클라이언트 업데이트가 번역을 깨뜨리면 ClaudeRipple이 따라잡을 때까지
package/README.md CHANGED
@@ -20,6 +20,7 @@
20
20
  <a href="LICENSE"><img alt="GPL-3.0" src="https://img.shields.io/badge/license-GPL--3.0-blue"></a>
21
21
  <img alt="macOS" src="https://img.shields.io/badge/macOS-arm64%20%7C%20x64-black">
22
22
  <img alt="Windows" src="https://img.shields.io/badge/Windows-arm64%20%7C%20x64-0078D4">
23
+ <img alt="Linux" src="https://img.shields.io/badge/Linux-x64%20(systemd)-FCC624">
23
24
  <img alt="Node" src="https://img.shields.io/badge/node-24%2B-success">
24
25
  <a href="README.ko.md"><img alt="한국어" src="https://img.shields.io/badge/docs-한국어-red"></a>
25
26
  </p>
@@ -80,9 +81,12 @@ the model.
80
81
 
81
82
  ### Can I use GPT in the Claude Desktop app?
82
83
 
83
- Yes. Install ClaudeRipple, map a Claude model name to a GPT model, and the Code tab
84
- answers with GPT under its real name in the model picker. The app itself is not
85
- modified and not switched into any other mode.
84
+ Yes — in the **Code tab** and its subagents. Install ClaudeRipple, sign in with a
85
+ ChatGPT Plus or Pro subscription, and GPT (GPT-6 Sol, Luna, Astra, GPT-5.6 Terra and
86
+ the rest) shows up under its real name in the model picker, with the reasoning effort
87
+ you pick. The app itself is not modified and not switched into any other mode. The
88
+ general **chat** tab stays Claude: no tool can route it without turning the whole app
89
+ into gateway mode (see [1P, not 3P](#1p-not-3p-the-difference-this-whole-project-exists-for)).
86
90
 
87
91
  ### How do I use GPT in Claude Code?
88
92
 
@@ -122,47 +126,115 @@ through OpenRouter or a direct API key. Claude models keep working as they are.
122
126
  ### Does it work on Windows?
123
127
 
124
128
  Yes, on Windows and macOS, arm64 and x64. Install, dashboard, restart and uninstall are
125
- measured on Windows 11 arm64; the x64 runtime is measured under emulation.
129
+ measured on Windows 11 arm64; the x64 runtime is measured under emulation. Linux works too
130
+ where there is a systemd user session: install, a Code-tab request through the router, a
131
+ restart in the middle of a streaming answer and uninstall are measured on Ubuntu 24.04 x64
132
+ with Claude Desktop 2.2553.13, and so is picker mode: models from `cli.extraModels` show
133
+ in the Code-tab picker next to Claude's own.
126
134
 
127
135
  ### Is my code sent anywhere else?
128
136
 
129
137
  No. The proxy runs on your own machine. Requests go to the provider you configured and
130
138
  nowhere else, and credentials stay in your home directory. See [Privacy](#privacy).
131
139
 
140
+ ### Will my Claude account get banned? Is this against Anthropic's terms?
141
+
142
+ What ClaudeRipple does with Claude is small and checkable: a request that stays on Claude
143
+ leaves your machine byte for byte as Claude Code sent it, and a request routed to GPT or
144
+ another provider never reaches Anthropic at all. It works through the proxy and
145
+ certificate settings Claude Code documents for corporate networks (`HTTPS_PROXY`,
146
+ `NODE_EXTRA_CA_CERTS` — [Enterprise network configuration](https://code.claude.com/docs/en/corporate-proxy)),
147
+ not by patching the app. The reports of banned accounts are about
148
+ the opposite direction — a Claude subscription login used from **another** program.
149
+ ClaudeRipple has one optional feature of that kind: Claude inside Codex using your
150
+ subscription login. That use is subject to Anthropic's terms; an Anthropic API key avoids
151
+ the question. Rotating several Claude subscriptions is likewise your call under those
152
+ terms. Only Anthropic can say how an account is treated, so nothing here is a promise.
153
+
154
+ ### Can I use several ChatGPT accounts?
155
+
156
+ Yes. Each `clauderipple login` (or **+ Add ChatGPT account** in the dashboard) adds one.
157
+ When an account hits its usage limit, the same request moves to the next account and the
158
+ spent one rests until its window resets; a conversation stays on the account that
159
+ answered, to keep its prompt cache. This applies to the Claude Desktop Code tab, Claude
160
+ Code, and GPT in the Codex app and CLI.
161
+
162
+ ### Can I use Claude inside Codex?
163
+
164
+ Yes. `clauderipple codex on` adds ClaudeRipple as a provider, and Claude models appear in
165
+ the Codex app's and CLI's model list under their own names. They answer through your
166
+ Claude Code login or an Anthropic API key. See [Codex app and Codex CLI](#codex-app-and-codex-cli).
167
+
168
+ ### Does GPT do worse inside Claude Code?
169
+
170
+ Claude Code's system prompt and tool descriptions are written for Claude, so another model
171
+ reads instructions tuned for someone else, and it may behave a little differently than in
172
+ its own client. ClaudeRipple tells each model its own name and effort, reshapes tool
173
+ schemas a vendor would reject, and lets you append instructions per provider. A common
174
+ setup is Claude as the main model with GPT or DeepSeek as subagents.
175
+
176
+ ### How is this different from CC Switch, opencodex or claude-code-router?
177
+
178
+ See the [comparison table](#one-tool-instead-of-four). In short: ClaudeRipple reaches
179
+ the Claude **Desktop** Code tab while the app stays signed in to Claude, and shows other
180
+ models in its picker under their real names. CC Switch also reaches the desktop app, but
181
+ by turning on its gateway (3P) mode.
182
+
183
+ ### Is it free?
184
+
185
+ Yes. ClaudeRipple is open source under GPL-3.0. You pay only for the subscriptions or API
186
+ keys you already use.
187
+
132
188
  ## One tool instead of four
133
189
 
134
- Similar tools are built for the terminal. They let the Claude Code CLI or Codex CLI
135
- use other models, but they cannot reach the Claude **desktop app**, and the moment
136
- you switch models you lose the Claude-subscription side (claude.ai chat, Remote
137
- Control, cloud sessions). ClaudeRipple covers the desktop app, the terminal and
190
+ Similar tools let the Claude Code CLI or Codex CLI use other models, but they either
191
+ cannot reach the Claude **desktop app** or reach it only through its gateway (3P) mode,
192
+ and the moment you switch models you lose the Claude-subscription side (claude.ai chat,
193
+ Remote Control, cloud sessions). ClaudeRipple covers the desktop app, the terminal and
138
194
  Codex from one menu-bar app, runs both subscriptions side by side, and keeps the
139
195
  Claude Code harness intact: your skills, hooks, MCP servers, `CLAUDE.md`, subagents
140
196
  and claude.ai connectors keep working while another model does the thinking.
141
197
 
142
- | | ClaudeRipple | claude-code-router | Claude Desktop gateway (3P) mode |
143
- |---|---|---|---|
144
- | Claude **Desktop** Code tab **without** gateway (3P) mode | ✅ | ❌ | ❌ by definition |
145
- | Keeps claude.ai chat, Remote Control, cloud sessions, connectors | ✅ | ❌ | ❌ |
146
- | Claude and GPT subscriptions side by side | ✅ | ❌ | ❌ |
147
- | Real model names in the Desktop picker | ✅ | ❌ | partial |
148
- | Several ChatGPT accounts, switching when one runs out (Desktop and Codex) | ✅ | ❌ | ❌ |
149
- | Terminal `claude` CLI | ✅ | ✅ | ✅ |
150
- | Codex **app** and Codex CLI → Claude | ✅ | ❌ | ❌ |
151
- | Prompt cache on translated providers | **94–99 %** measured | varies | n/a |
152
- | Subagents named by real model in the task panel | ✅ | ❌ | ❌ |
153
- | Settings GUI, no terminal needed | ✅ | ❌ | ❌ |
154
- | Signed, notarized app with its own runtime | ✅ | ❌ | – |
198
+ | | ClaudeRipple | CC Switch (checked 2026-09-24) | opencodex / openclaude (checked 2026-09-16) | claude-code-router | Claude Desktop gateway (3P) mode |
199
+ |---|---|---|---|---|---|
200
+ | Claude **Desktop** Code tab **without** gateway (3P) mode | ✅ | ❌ ² | ❌ ¹ | ❌ | ❌ by definition |
201
+ | Keeps claude.ai chat, Remote Control, cloud sessions, connectors | ✅ | ❌ | ❌ | ❌ | ❌ |
202
+ | Claude and GPT subscriptions side by side | ✅ | ❌ one provider at a time | ❌ all-or-nothing | ❌ | ❌ |
203
+ | Real model names in the Desktop picker | ✅ | ❌ `claude-*` role names ² | ❌ | ❌ | partial |
204
+ | Several ChatGPT accounts, switching when one runs out (Desktop and Codex) | ✅ | ❌ switched by hand ³ | ✅ | ❌ | ❌ |
205
+ | Terminal `claude` CLI | ✅ | ✅ | ✅ | ✅ | ✅ |
206
+ | Codex **app** and Codex CLI → Claude | ✅ | ✅ | ✅ | ❌ | ❌ |
207
+ | Prompt cache on translated providers | **94–99 %** measured | not measured | not measured | varies | n/a |
208
+ | Subagents named by real model in the task panel | ✅ | ❌ | ❌ | ❌ | ❌ |
209
+ | Settings GUI, no terminal needed | ✅ | ✅ | ❌ | ❌ | ❌ |
210
+ | Signed, notarized app with its own runtime | ✅ | ✅ | ❌ | ❌ | – |
211
+
212
+ ¹ opencodex's README showed Claude Desktop in a demo but published no setup steps for it,
213
+ in the repository or on its documentation site (checked 2026-09-16). At the time the only
214
+ public way into the desktop app was the official gateway setting — the last column.
215
+
216
+ ² CC Switch reaches Claude Desktop by writing the app's third-party profile
217
+ (`Claude-3p/claude_desktop_config.json`, `"inferenceProvider": "gateway"`), which is the
218
+ last column. Through its local gateway the picker shows only `claude-sonnet-*`,
219
+ `claude-opus-*` and `claude-haiku-*` role names ([its manual](https://github.com/farion1231/cc-switch/blob/main/docs/user-manual/en/2-providers/2.6-claude-desktop.md)).
220
+ CC Switch manages more tools than this table covers (Gemini CLI, OpenCode and others) and
221
+ syncs MCP servers and skills across them.
222
+
223
+ ³ Each ChatGPT account is bound to its own provider card, and official ChatGPT cards are
224
+ kept out of the failover queue (v3.20.0 release notes).
155
225
 
156
226
  The desktop app's own "third-party inference" setting flips the whole app into another
157
227
  mode: you lose claude.ai chat, Remote Control and cloud sessions. Tools that replace
158
- `ANTHROPIC_BASE_URL` never reach the desktop app at all. ClaudeRipple instead is a
228
+ `ANTHROPIC_BASE_URL` never reach the desktop app, and the ones that do reach it write
229
+ that same setting. ClaudeRipple instead is a
159
230
  tiny HTTPS proxy that only the Claude Code process trusts: requests for the models
160
231
  you map go to your provider, everything else goes to Anthropic byte for byte.
161
232
 
162
233
  ## What you get
163
234
 
164
- - **Any model in Claude Desktop and Claude Code.** GPT-5.6 Terra / Sol / Luna and
165
- GPT-6 Astra through your ChatGPT Plus/Pro subscription, or DeepSeek, Kimi, GLM,
235
+ - **Any model in Claude Desktop and Claude Code.** GPT-6 Sol / Luna / Astra and
236
+ GPT-5.6 Terra / Sol / Luna through your ChatGPT Plus/Pro subscription (new models
237
+ appear the day OpenAI serves them), or DeepSeek, Kimi, GLM,
166
238
  MiniMax, Qwen, Grok, Mistral, Groq, Together, Fireworks, OpenRouter (400+ models)
167
239
  and local Ollama / LM Studio. Under their real names in the picker, or mapped onto
168
240
  a Claude name.
@@ -214,6 +286,17 @@ curl -fsSL https://raw.githubusercontent.com/PBJ-2/clauderipple/main/scripts/ins
214
286
  irm https://raw.githubusercontent.com/PBJ-2/clauderipple/main/scripts/install.ps1 | iex
215
287
  ```
216
288
 
289
+ **Linux** (a desktop session with systemd)
290
+
291
+ ```sh
292
+ curl -fsSL https://raw.githubusercontent.com/PBJ-2/clauderipple/main/scripts/install.sh | sh
293
+ ```
294
+
295
+ The router runs as a per-user systemd service: `systemctl --user status clauderipple`, and
296
+ `journalctl --user -u clauderipple` for what it printed. Picker mode trusts the local CA in the
297
+ NSS database Chromium reads (`~/.pki/nssdb`, your user only, no sudo), which takes `certutil`:
298
+ run `sudo apt install libnss3-tools` (Fedora: `sudo dnf install nss-tools`) before `clauderipple picker on`.
299
+
217
300
  That is the whole prerequisite list. The script uses a Node 24+ you already have, and
218
301
  downloads the official build into `~/.clauderipple/runtime` when you have none,
219
302
  verifying it against the checksum nodejs.org publishes. Then it sets ClaudeRipple up:
@@ -255,12 +338,13 @@ clauderipple restart
255
338
  Optional, for real names in the Desktop picker: **Clients → Claude Desktop → Model
256
339
  picker → on**, then quit and reopen Claude Desktop. To trust the local certificate
257
340
  for your user only, macOS asks for your login password and Windows shows a
258
- confirmation dialog with the fingerprint — ClaudeRipple never sees a password, and
259
- neither platform needs administrator rights.
341
+ confirmation dialog with the fingerprint; Linux adds it to your NSS database without asking.
342
+ ClaudeRipple never sees a password, and no platform needs administrator rights.
260
343
 
261
344
  > **Closing Claude Desktop's window is not enough.** It keeps running, and the next
262
345
  > launch reuses it without reading the new setting. Quit it properly (macOS: ⌘Q;
263
- > Windows: the tray icon, or Task Manager) or the picker will silently not change.
346
+ > Windows: the tray icon, or Task Manager; Linux: Ctrl+Q or the tray icon, until
347
+ > `pgrep -f claude-desktop` prints nothing) or the picker will silently not change.
264
348
 
265
349
  <details>
266
350
  <summary>From source (Node 24)</summary>
@@ -368,7 +452,7 @@ provider you configured is available the same way.
368
452
 
369
453
  | Provider | Kind | Auth | Model list | Notes |
370
454
  |---|---|---|---|---|
371
- | ChatGPT subscription | Codex backend | several sign-ins, switching when one runs out (Codex login reused too) | Terra, Sol, Luna, Astra | effort low…max (Luna: ultra), prompt cache 94–99 % |
455
+ | ChatGPT subscription | Codex backend | several sign-ins, switching when one runs out (Codex login reused too) | read from your subscription (GPT-6 Sol, Luna, Astra, GPT-5.6 …) | effort low…max (Luna: ultra), prompt cache 94–99 % |
372
456
  | OpenRouter | Anthropic-compatible | API key | 400+, discovered | per-model effort support read from the API |
373
457
  | DeepSeek, Kimi, Z.ai GLM, MiniMax, Qwen (intl / cn) | Anthropic-compatible | API key | preset | verified against vendor docs |
374
458
  | xAI Grok, Mistral, Groq, Together, Fireworks | OpenAI-compatible | API key | discovered | translated (Chat Completions / Responses) |
@@ -417,6 +501,9 @@ In daily use by the author, but young. Expect rough edges:
417
501
  in, the picker and a live GPT call are verified on x64 hardware; crash recovery
418
502
  on arm64. The window still has the stock Windows title bar. Windows builds are
419
503
  unsigned; see the note under Install.
504
+ - **Linux support is new (2026-09-24)**, contributed with measurements on Ubuntu
505
+ 24.04 x64 (install, a Code-tab request, restart mid-stream, picker mode, uninstall).
506
+ It needs a systemd user session; other distributions and arm64 are untested.
420
507
  - ChatGPT, OpenRouter and Claude-in-Codex are verified with live accounts; the
421
508
  other presets follow the vendors' official documentation.
422
509
  - A model added to the picker is usable from the next session.
@@ -1,6 +1,7 @@
1
1
  // Opens a URL in the user's default browser. Shared by the CLI (sign-in commands, `ui`) and the
2
2
  // router's admin API (sign-in started from the GUI).
3
3
  import { execFileSync } from "node:child_process";
4
+ import { windowsPowerShellEnv } from "./windows-powershell.js";
4
5
  /** Returns false if the platform command failed; the caller then shows the URL instead. */
5
6
  export function openBrowser(url) {
6
7
  try {
@@ -9,10 +10,10 @@ export function openBrowser(url) {
9
10
  // at its first parameter and the provider answers "missing_required_parameter" (observed
10
11
  // 2026-09-14). Start-Process takes the URL as one argument, quoted PowerShell-style.
11
12
  const quoted = `'${url.replace(/'/g, "''")}'`;
12
- execFileSync("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", `Start-Process ${quoted}`], { stdio: "ignore", windowsHide: true });
13
+ execFileSync("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", `Start-Process ${quoted}`], { env: windowsPowerShellEnv(), stdio: "ignore", windowsHide: true });
13
14
  }
14
15
  else
15
- execFileSync("open", [url], { stdio: "ignore" });
16
+ execFileSync(process.platform === "linux" ? "xdg-open" : "open", [url], { stdio: "ignore" });
16
17
  return true;
17
18
  }
18
19
  catch {
@@ -19,6 +19,10 @@ const isWindows = process.platform === "win32";
19
19
  const BINARY_NAMES = isWindows ? ["claude.exe", "claude.cmd", "claude.bat"] : ["claude"];
20
20
  /** Where Claude Desktop caches the CLI it downloads, per platform. */
21
21
  export function desktopClaudeCodeDirs() {
22
+ // Linux: Electron's userData is $XDG_CONFIG_HOME/Claude (seen with Claude Desktop 2.2553.13 on
23
+ // Ubuntu 24.04: ~/.config/Claude/claude-code/2.1.280/claude, a plain executable).
24
+ if (process.platform === "linux")
25
+ return [path.join(process.env.XDG_CONFIG_HOME || path.join(os.homedir(), ".config"), "Claude", "claude-code")];
22
26
  if (!isWindows)
23
27
  return [path.join(os.homedir(), "Library", "Application Support", "Claude", "claude-code")];
24
28
  const roots = [
@@ -29,6 +33,8 @@ export function desktopClaudeCodeDirs() {
29
33
  }
30
34
  /** Launcher inside one cached version directory. The macOS build nests an .app bundle. */
31
35
  function versionBinaries(versionDir) {
36
+ if (process.platform === "linux")
37
+ return [path.join(versionDir, "claude")];
32
38
  return isWindows
33
39
  ? BINARY_NAMES.map((name) => path.join(versionDir, name))
34
40
  : [path.join(versionDir, "claude.app", "Contents", "MacOS", "claude")];