Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 44 additions & 1 deletion docs-site/src/content/docs/guides/integrations.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: Integrations
description: Connect opencodex to OpenCode, Pi, Gentle Shell, OMP, Hermes, OpenClaw, Kimi Code, gjc, DeepSeek Harness, MiniMax Code, ZCode, Prime Agent, Aside, Raycast, omo, Cline CLI, Kilo, Command Code and Factory Droid from the dashboard — one switch per client, with a backup taken before every write.
description: Connect opencodex to OpenCode, Pi, Gentle Shell, OMP, Hermes, OpenClaw, Kimi Code, gjc, DeepSeek Harness, MiniMax Code, ZCode, Prime Agent, Aside, Raycast, omo, Qoder, Cline CLI, Kilo, Command Code, Factory Droid and T3 Code from the dashboard — one switch per client, with a backup taken before every write.
---

The **Connect** page writes opencodex's provider block into a client's own config
Expand Down Expand Up @@ -31,6 +31,7 @@ file, and removes it again. Each client below has its own switch:
| Kilo | first existing `kilo.jsonc`, `kilo.json`, `opencode.jsonc`, `opencode.json`, or `config.json` under `~/.config/kilo` | JSONC | new sessions | `OPENCODEX_KILO_API_KEY` |
| Command Code | `~/.commandcode/providers.json` (on Windows with the default home: use `HOME ?? USERPROFILE` only if nonblank and Windows-absolute, otherwise `homedir()`; a separately supplied home is preserved; append `.commandcode\providers.json`) | JSON | next launch of Command Code | none — keyless loopback (`apiKey: false`) |
| Factory Droid | `~/.factory/settings.json` (`%USERPROFILE%\.factory\settings.json` on Windows) | JSON | immediately via file watching | none — keyless loopback |
| T3 Code | `$T3CODE_HOME/userdata/settings.json` (default `~/.t3/userdata/settings.json`) | JSON | immediately — T3 Code watches the file | non-secret loopback marker |

## Gentle Shell

Expand Down Expand Up @@ -128,6 +129,48 @@ loopback listener is enabled, exports point Qoder at that listener. `ocx sync` a
changes refresh an already enabled Qoder integration like the other managed clients.
Model IDs containing `,` or `]` (for example `kimi/k3[1m]`) are exported like any other model.

## T3 Code

[T3 Code](https://github.com/pingdotgg/t3code) drives the Codex and Claude Code CLIs already
installed on the machine. Its Codex threads route through opencodex once the
[Codex integration](/guides/codex-integration/) is enabled, because T3 Code lists Codex models
through `codex app-server`, which reads `$CODEX_HOME/config.toml` like every Codex client. Routed
models then appear under Codex with no T3 Code switch, as long as T3 Code runs Codex with the same
Codex home opencodex manages (`CODEX_HOME`, default `~/.codex`). A T3 Code Codex instance pointed at
another home does not see the routed catalog.

The **T3 Code** switch adds the Claude side. It needs the Messages API, which every Claude turn
uses: while Messages is off on the API page, enable and refresh are refused, and disable still
works.

```bash
ocx export --client t3code --json
ocx integration client enable --client t3code
ocx integration client disable --client t3code
```

Enable writes one provider instance, `providerInstances.opencodex`, into T3 Code's server settings
and leaves every other instance and setting alone. It is a Claude instance named **opencodex** that
runs your own `claude` binary with `ANTHROPIC_BASE_URL` set to the proxy, the non-secret
`opencodex-proxy` marker as `ANTHROPIC_AUTH_TOKEN`, an explicitly empty `ANTHROPIC_API_KEY`, and
`CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST=1` so a `settings.json` env block in your Claude config cannot
re-point it. Each routed model is a custom model keyed by its opencodex selector
(`provider/model`), which T3 Code sends verbatim. It appears in T3 Code's model picker under
**opencodex**. T3 Code reloads the file on its own, so no restart is needed; catalog changes and
`ocx sync` refresh the instance.

T3 Code keeps its data in `T3CODE_HOME` when set, otherwise `~/.t3`. Set the same variable on the
opencodex process if you relocate it; a relative value is refused. On Windows, use a fully qualified
drive path (`C:\shared\t3`) or UNC path (`\\server\share\t3`); paths without a drive, such as
`\shared\t3` or `/shared/t3`, are refused. `~` expands against the effective user home.
The marker is not a credential, so the integration needs loopback access and refuses an authenticated non-loopback bind unless the
unauthenticated loopback listener is enabled.

Treat the instance as opencodex's. Marking one of its variables **Sensitive** in T3 Code, adding
a custom model to it, or toggling it off rewrites the block. The switch then shows a conflict
instead of overwriting your edit, and **Replace** restores the generated block. To use
different settings, add your own Claude instance in T3 Code beside it.

Comment thread
coderabbitai[bot] marked this conversation as resolved.
Resolved
Generated catalogs include only enabled models from each provider selection. This applies to both
downloads and managed integrations, including Pi and Aside. The management model list still shows
the full roster so you can enable additional models.
Expand Down
8 changes: 8 additions & 0 deletions gui/public/provider-icons/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -411,3 +411,11 @@ committing it.
The 40×40 artwork retains its green background, gradients and white mark;
render it as an image in either theme. Used to identify the `workbuddy-ai`
provider, with the same asset embedded by the native tray.
## T3 Code (2026-10-22)

- `t3code.svg` — `assets/prod/logo.svg` from `pingdotgg/t3code` (MIT, © T3 Tools Inc.), the
production app icon the project ships, read at commit `f054d1b8` and committed byte for byte
(1048 bytes, MD5 `a2254eaba3e380cbc0b0101301cb5c9f`). `viewBox="0 0 128 128"`, a black rounded
plate carrying a white "T3" glyph. **Not masked:** two neutral inks on an opaque plate, the
plated case `qoder.svg` and `omo.svg` already record, so masking would fill the tile and
discard the glyph. As an image it reads on both surfaces.
4 changes: 4 additions & 0 deletions gui/public/provider-icons/t3code.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions gui/src/app-routing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ export const INTEGRATION_TAB_HASHES = [
"integrations/qoder-cn",
"integrations/workbuddy",
"integrations/workbuddy-ai",
"integrations/t3code",
] as const;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* with EXPORT_CLIENT_IDS by hand; adding a client server-side renders no row
* until this tuple changes.
*/
export const CLIENTS = ["qoder", "qoder-cn", "workbuddy", "workbuddy-ai", "opencode", "pi", "omp", "hermes", "openclaw", "kimi", "gajae", "dsh", "mcode", "zcode", "commandcode", "prime", "aside", "raycast", "omo", "cline", "kilo", "droid", "gentle-shell"] as const;
export const CLIENTS = ["qoder", "qoder-cn", "workbuddy", "workbuddy-ai", "opencode", "pi", "omp", "hermes", "openclaw", "kimi", "gajae", "dsh", "mcode", "zcode", "commandcode", "prime", "aside", "raycast", "omo", "cline", "kilo", "droid", "gentle-shell", "t3code"] as const;
export type ExportClientId = (typeof CLIENTS)[number];

export const CLIENT_LABEL_KEYS = {
Expand All @@ -35,6 +35,7 @@ export const CLIENT_LABEL_KEYS = {
cline: "api.clientConfig.clientCline",
kilo: "api.clientConfig.clientKilo",
droid: "api.clientConfig.clientDroid",
t3code: "api.clientConfig.clientT3code",
} as const;

/**
Expand Down Expand Up @@ -92,6 +93,9 @@ export const CLIENT_MARKS: Partial<Record<ExportClientId, string>> = {
commandcode: "/provider-icons/commandcode-color.svg",
kilo: "/provider-icons/kilo.svg",
droid: "/provider-icons/factory-droid.svg",
// A black plate carrying a white "T3": the plated case `omo` and `qoder` set, so it
// stays an image — masking would paint the plate and discard the glyph.
t3code: "/provider-icons/t3code.svg",
};

/**
Expand Down
1 change: 1 addition & 0 deletions gui/src/components/integration-marks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ export const INTEGRATION_MARKS: Record<OverviewClientId, string | null> = {
"qoder-cn": CLIENT_MARKS["qoder-cn"] ?? null,
workbuddy: null,
"workbuddy-ai": null,
t3code: CLIENT_MARKS.t3code ?? null,
};

/**
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1653,8 +1653,11 @@ export const de: Record<TKey, string> = {
"integrations.tab.workbuddyAi": "WorkBuddy AI",
"integrations.semantics.workbuddyAi": "Verwaltet OpenCodex-Modelle in ~/.workbuddy-ai/models.json. Erfordert Loopback-Zugriff. Andere Einstellungen bleiben erhalten; Rückgängig stellt den Snapshot wieder her.",
"integrations.tab.qoder": "Qoder",
"integrations.tab.t3code": "T3 Code",
"api.clientConfig.clientQoder": "Qoder",
"api.clientConfig.clientT3code": "T3 Code",
"integrations.semantics.qoder": "Verwaltet OpenCodex-Anbieter und eigene Modelle in ~/.qoder/settings.json. Erfordert Loopback-Zugriff. Andere Einstellungen bleiben erhalten; Rückgängig stellt den Snapshot wieder her.",
"integrations.semantics.t3code": "Fügt eine opencodex-Claude-Anbieterinstanz zu ~/.t3/userdata/settings.json hinzu (T3CODE_HOME verschiebt sie). Geroutete Modelle erscheinen in der Modellauswahl von T3 Code; Codex-Threads nutzen den Proxy nur, wenn die Codex-Integration aktiviert ist und T3 Code dasselbe CODEX_HOME verwendet. Erfordert Loopback-Zugriff. Andere Einstellungen bleiben erhalten; Rückgängig stellt den Snapshot wieder her.",
"integrations.tab.cline": "Cline CLI",
"integrations.tab.kilo": "Kilo",
"integrations.tab.droid": "Factory Droid",
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2239,8 +2239,11 @@ export const en = {
"integrations.tab.workbuddyAi": "WorkBuddy AI",
"integrations.semantics.workbuddyAi": "Manages OpenCodex models in ~/.workbuddy-ai/models.json. Requires loopback access. Other settings are preserved; Undo restores the snapshot.",
"integrations.tab.qoder": "Qoder",
"integrations.tab.t3code": "T3 Code",
"api.clientConfig.clientQoder": "Qoder",
"api.clientConfig.clientT3code": "T3 Code",
"integrations.semantics.qoder": "Manages OpenCodex providers and custom models in ~/.qoder/settings.json. Requires loopback access. Other settings are preserved; Undo restores the snapshot.",
"integrations.semantics.t3code": "Adds an opencodex Claude provider instance to ~/.t3/userdata/settings.json (T3CODE_HOME relocates it). Routed models appear in T3 Code's model picker; Codex threads use the proxy only when the Codex integration is enabled and T3 Code shares the same CODEX_HOME. Requires loopback access. Other settings are preserved; Undo restores the snapshot.",
"integrations.tab.cline": "Cline CLI",
"integrations.tab.kilo": "Kilo",
"integrations.tab.droid": "Factory Droid",
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2211,8 +2211,11 @@ export const fr: Record<TKey, string> = {
"integrations.tab.workbuddyAi": "WorkBuddy AI",
"integrations.semantics.workbuddyAi": "Gère les modèles OpenCodex dans ~/.workbuddy-ai/models.json. Accès local requis. Les autres réglages sont conservés ; Annuler restaure la sauvegarde.",
"integrations.tab.qoder": "Qoder",
"integrations.tab.t3code": "T3 Code",
"api.clientConfig.clientQoder": "Qoder",
"api.clientConfig.clientT3code": "T3 Code",
"integrations.semantics.qoder": "Gère les fournisseurs OpenCodex et les modèles personnalisés dans ~/.qoder/settings.json. Nécessite qu’opencodex soit joignable sur une adresse de bouclage. Les autres paramètres sont conservés ; Annuler restaure la sauvegarde.",
"integrations.semantics.t3code": "Ajoute une instance de fournisseur Claude opencodex à ~/.t3/userdata/settings.json (T3CODE_HOME la déplace). Les modèles routés apparaissent dans le sélecteur de modèles de T3 Code ; les fils Codex ne passent par le proxy que si l’intégration Codex est activée et que T3 Code utilise le même CODEX_HOME. Nécessite qu’opencodex soit joignable sur une adresse de bouclage. Les autres paramètres sont conservés ; Annuler restaure la sauvegarde.",
"integrations.tab.cline": "Cline CLI",
"integrations.tab.kilo": "Kilo",
"integrations.tab.droid": "Factory Droid",
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2106,8 +2106,11 @@ export const ja: Record<TKey, string> = {
"integrations.tab.workbuddyAi": "WorkBuddy AI",
"integrations.semantics.workbuddyAi": "~/.workbuddy-ai/models.json の OpenCodex モデルを管理します。ループバック接続が必要です。他の設定を保持し、元に戻すとスナップショットを復元します。",
"integrations.tab.qoder": "Qoder",
"integrations.tab.t3code": "T3 Code",
"api.clientConfig.clientQoder": "Qoder",
"api.clientConfig.clientT3code": "T3 Code",
"integrations.semantics.qoder": "~/.qoder/settings.json の OpenCodex プロバイダーとカスタムモデルを管理します。ループバック接続が必要です。他の設定は保持され、元に戻すとスナップショットが復元されます。",
"integrations.semantics.t3code": "~/.t3/userdata/settings.json に opencodex の Claude プロバイダーインスタンスを追加します(T3CODE_HOME で移動できます)。ルーティングされたモデルが T3 Code のモデル選択に表示されます。Codex 統合が有効で、T3 Code が同じ CODEX_HOME を使用している場合にのみ、Codex スレッドはプロキシを使用します。ループバック接続が必要です。他の設定は保持され、元に戻すとスナップショットが復元されます。",
"integrations.tab.cline": "Cline CLI",
"integrations.tab.kilo": "Kilo",
"integrations.tab.droid": "Factory Droid",
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1697,8 +1697,11 @@ export const ko: Record<TKey, string> = {
"integrations.tab.workbuddyAi": "WorkBuddy AI",
"integrations.semantics.workbuddyAi": "~/.workbuddy-ai/models.json에서 OpenCodex 모델을 관리합니다. 루프백 연결이 필요합니다. 다른 설정은 유지되며 실행 취소로 스냅샷을 복원합니다.",
"integrations.tab.qoder": "Qoder",
"integrations.tab.t3code": "T3 Code",
"api.clientConfig.clientQoder": "Qoder",
"api.clientConfig.clientT3code": "T3 Code",
"integrations.semantics.qoder": "~/.qoder/settings.json의 OpenCodex 공급자와 사용자 지정 모델을 관리합니다. 루프백 접근이 필요합니다. 다른 설정은 유지되며 실행 취소 시 스냅샷을 복원합니다.",
"integrations.semantics.t3code": "~/.t3/userdata/settings.json에 opencodex Claude 공급자 인스턴스를 추가합니다(T3CODE_HOME으로 위치 변경). 라우팅된 모델이 T3 Code 모델 선택기에 표시됩니다. Codex 통합이 활성화되어 있고 T3 Code가 동일한 CODEX_HOME을 사용하는 경우에만 Codex 스레드가 프록시를 사용합니다. 루프백 접근이 필요합니다. 다른 설정은 유지되며 실행 취소 시 스냅샷을 복원합니다.",
"integrations.tab.cline": "Cline CLI",
"integrations.tab.kilo": "Kilo",
"integrations.tab.droid": "Factory Droid",
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/pt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2225,6 +2225,7 @@ export const pt: Record<TKey, string> = {
"integrations.tab.workbuddyAi": "WorkBuddy AI",
"integrations.semantics.workbuddyAi": "Gerencia modelos OpenCodex em ~/.workbuddy-ai/models.json. Requer acesso local. Outras configurações são preservadas; Desfazer restaura o snapshot.",
"integrations.tab.qoder": "Qoder",
"integrations.tab.t3code": "T3 Code",
"integrations.tab.droid": "Factory Droid",
"integrations.aside.profilesTitle": "Perfis do Aside",
"integrations.aside.profilesHint": "Escolha quais perfis recebem os modelos selecionados. O perfil ativo do Aside permanece inalterado.",
Expand Down Expand Up @@ -2542,6 +2543,7 @@ export const pt: Record<TKey, string> = {
"integrations.lazycodexRoles.auto.moveDown": "Desça de nível se: {text}",
"integrations.semantics.cline": "Gerencia o OpenCodex no providers.json e no models.json do Cline CLI. Pare o Cline antes de alterar ou sincronizar esses arquivos e reinicie depois. Desfazer restaura os dois originais. Seu provedor padrão permanece inalterado; selecione o OpenCodex no Cline.",
"integrations.semantics.qoder": "Gerencia os provedores e modelos personalizados do OpenCodex em ~/.qoder/settings.json. Requer acesso por loopback. As demais configurações são preservadas; Desfazer restaura o snapshot.",
"integrations.semantics.t3code": "Adiciona uma instância de provedor Claude do opencodex a ~/.t3/userdata/settings.json (T3CODE_HOME a realoca). Os modelos roteados aparecem no seletor de modelos do T3 Code; os threads do Codex só usam o proxy quando a integração do Codex está ativada e o T3 Code usa o mesmo CODEX_HOME. Requer acesso por loopback. As demais configurações são preservadas; Desfazer restaura o snapshot.",
"integrations.semantics.commandcode": "Gerencia apenas a entrada do provedor OpenCodex em ~/.commandcode/providers.json. Seus outros provedores e configurações permanecem inalterados.",
"integrations.semantics.kilo": "Gerencia apenas provider.opencodex na configuração global do Kilo — o primeiro arquivo existente entre kilo.jsonc, kilo.json, opencode.jsonc, opencode.json ou config.json em ~/.config/kilo (XDG_CONFIG_HOME realoca esse diretório; kilo.jsonc é criado quando nenhum existe). As demais chaves permanecem inalteradas. Aplicar reescreve o arquivo inteiro, então comentários e vírgulas finais não são preservados. Selecione opencodex/<model> no Kilo.",
"integrations.semantics.droid": "Adiciona modelos personalizados do OpenCodex ao settings.json do Factory Droid. Desativar remove apenas as linhas gerenciadas; desfazer restaura o arquivo salvo.",
Expand Down Expand Up @@ -3107,6 +3109,7 @@ export const pt: Record<TKey, string> = {
"api.clientConfig.clientCommandCode": "Command Code",
"api.clientConfig.clientKilo": "Kilo",
"api.clientConfig.clientQoder": "Qoder",
"api.clientConfig.clientT3code": "T3 Code",
"api.clientConfig.clientDroid": "Factory Droid",
"api.clientConfig.clineBundle": "Este é um pacote de dois arquivos, não um arquivo de configurações do Cline. Mescle settings em providers.json e catalog no models.json vizinho. Use o interruptor de integração para uma gravação com backup.",
"api.clientConfig.clineDownloaded": "{filename} baixado. Nada foi alterado ainda; settings e catalog pertencem a dois arquivos separados do Cline.",
Expand Down
Loading
Loading