From 65ad8501f502af80f3c5f562233718528ac9abe9 Mon Sep 17 00:00:00 2001 From: JUN Date: Wed, 23 Sep 2026 13:23:12 +0900 Subject: [PATCH 01/11] assets: add platform download buttons for the README --- assets/download-linux.svg | 10 ++++++++++ assets/download-macos.svg | 10 ++++++++++ assets/download-windows.svg | 10 ++++++++++ 3 files changed, 30 insertions(+) create mode 100644 assets/download-linux.svg create mode 100644 assets/download-macos.svg create mode 100644 assets/download-windows.svg diff --git a/assets/download-linux.svg b/assets/download-linux.svg new file mode 100644 index 00000000000..b2555c9a92f --- /dev/null +++ b/assets/download-linux.svg @@ -0,0 +1,10 @@ + + Download OpenCodex for Linux + + + + Download for + Linux + + .AppImage + diff --git a/assets/download-macos.svg b/assets/download-macos.svg new file mode 100644 index 00000000000..db9427bed9f --- /dev/null +++ b/assets/download-macos.svg @@ -0,0 +1,10 @@ + + Download OpenCodex for macOS + + + + Download for + macOS + + .dmg + diff --git a/assets/download-windows.svg b/assets/download-windows.svg new file mode 100644 index 00000000000..28e2b1c6455 --- /dev/null +++ b/assets/download-windows.svg @@ -0,0 +1,10 @@ + + Download OpenCodex for Windows + + + + Download for + Windows + + .msi + From 7c4f5ce1185df8a9785f2061373010cccfddc508 Mon Sep 17 00:00:00 2001 From: JUN Date: Wed, 23 Sep 2026 13:26:16 +0900 Subject: [PATCH 02/11] docs(readme): lead with desktop downloads in every README locale --- README.md | 74 ++++++++++++++++++++----------------- package.json | 3 ++ readme/README.fr.md | 77 ++++++++++++++++++++------------------ readme/README.ja.md | 74 ++++++++++++++++++++----------------- readme/README.ko.md | 73 ++++++++++++++++++++---------------- readme/README.ru.md | 78 ++++++++++++++++++++++----------------- readme/README.tr.md | 75 +++++++++++++++++++++---------------- readme/README.zh-CN.md | 74 ++++++++++++++++++++----------------- readme/README.zh-TW.md | 71 ++++++++++++++++++++--------------- readme/i18n-manifest.json | 14 +++---- 10 files changed, 344 insertions(+), 269 deletions(-) diff --git a/README.md b/README.md index 9efe6e97dce..670bd76e9c4 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,26 @@ +

+ opencodex — universal provider proxy for Codex, Claude Code, Claude Desktop and Grok Build +

+

make codex open!

Universal provider proxy for OpenAI Codex, Claude Code, Claude Desktop & Grok Build
Two commands, and every one of them runs any LLM you point it at.

Follow @claudeebum on X + Latest desktop release npm version license node version

+

+ Download OpenCodex for macOS + Download OpenCodex for Windows + Download OpenCodex for Linux +

+

Desktop app (beta): macOS universal .dmg · Windows x64 .msi · Linux x86_64 .AppImage / .deb. Prefer the terminal? Install the CLI:

+ ```bash npm install -g @bitkyc08/opencodex ocx start @@ -78,7 +90,29 @@ account while existing threads stay pinned to the account that started them. ## Quick start -### Personal install +### Desktop app (beta) + +The desktop app is the same proxy and dashboard in a native window, with a tray and bundled `ocx`. +It attaches to a proxy that is already running, or starts its bundled one, and the dashboard stays +on the proxy port (**http://localhost:10100** unless you configured another). Pick the file for your +platform from the [latest release](https://github.com/lidge-jun/opencodex/releases/latest): + +| Platform | File | Notes | +|---|---|---| +| macOS 13+ (Apple Silicon and Intel) | `OpenCodex--macos.dmg` | Universal build, signed with a Developer ID and notarized | +| Windows (x64) | `OpenCodex--windows-x64.msi` | Not code-signed yet: SmartScreen asks once, choose **More info → Run anyway** | +| Linux (x86_64) | `OpenCodex--linux-x86_64.AppImage` or `-linux-amd64.deb` | The tray needs an AppIndicator-capable desktop | + +Every file has a `.sha256` next to it on the release page. On macOS 14+ the app also ships a +WidgetKit extension that shows proxy status, today's usage and provider quotas; the snapshot model +it renders lives in [`app/`](./app) (`MenuBarCore`). To build the app yourself, run +`bun install && bun run build:gui` at the repository root, then +`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` in +`desktop/`. The [Desktop App guide](https://opencodex.me/guides/desktop-app/) and the +[macOS Menu Bar App guide](https://opencodex.me/guides/macos-menu-bar/) cover first launch, and +[`AGENTS_INSTALL.md`](./AGENTS_INSTALL.md#where-things-are-installed) lists everything written to disk. + +### Personal install (CLI) ```bash npm install -g @bitkyc08/opencodex # Node 18+; the Bun runtime is bundled automatically @@ -91,32 +125,6 @@ Open **http://localhost:10100** and configure everything in the web dashboard (40+ built-ins, or any OpenAI-compatible endpoint), pick models, manage accounts. `ocx gui` re-opens the dashboard at any time. -
-Desktop app and macOS widget — beta - -A native shell around the same dashboard, plus a WidgetKit extension that shows proxy status, -today's usage and provider quotas without opening a browser. The proxy is unchanged: the app -finds a running one or starts the bundled `ocx` sidecar, and the dashboard stays on the proxy's -port (**http://localhost:10100** unless you configured another). - -It is beta. Release builds of the macOS app are signed with a Developer ID and notarized (local -builds are ad-hoc signed); the Windows installer is not code-signed yet, so SmartScreen warns on -first run. The widget needs macOS 14 or newer; the snapshot model it renders lives in -[`app/`](./app) (`MenuBarCore`). - -Download it from the [latest release](https://github.com/lidge-jun/opencodex/releases), or build -it locally: run `bun install && bun run build:gui` at the repository root, then -`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` in -`desktop/`. - -Install locations, service files and everything else written to disk are listed in -[`AGENTS_INSTALL.md`](./AGENTS_INSTALL.md#where-things-are-installed). The -[Desktop App guide](https://opencodex.me/guides/desktop-app/) and the -[macOS Menu Bar App guide](https://opencodex.me/guides/macos-menu-bar/) cover per-platform -installation and first launch. - -
- ### ChatGPT account pool opencodex can also manage a **ChatGPT account pool** for Codex auth. Add multiple ChatGPT / Codex accounts, @@ -253,13 +261,13 @@ when it is unreachable). `ocx status` / `ocx doctor` / `ocx health` report the r ## Supported platforms -| OS | Status | Service manager | -|---|---|---| -| macOS (arm64 / x64) | Fully supported | launchd | -| Linux (x64 / arm64) | Fully supported | systemd (user unit) | -| Windows (x64) | Fully supported | Task Scheduler (hidden) / opt-in native service (`--native`, WinSW) | +| OS | Status | Service manager | Desktop app (beta) | +|---|---|---|---| +| macOS (arm64 / x64) | Fully supported | launchd | Universal `.dmg` | +| Linux (x64 / arm64) | Fully supported | systemd (user unit) | x86_64 `.AppImage` / `.deb` | +| Windows (x64) | Fully supported | Task Scheduler (hidden) / opt-in native service (`--native`, WinSW) | x64 `.msi` | -Requires [Node](https://nodejs.org) 18+. The Bun runtime is bundled on `npm install` — no separate +The CLI install requires [Node](https://nodejs.org) 18+; the desktop app needs neither Node nor Bun. The Bun runtime is bundled on `npm install` — no separate Bun install needed, no WSL needed on Windows. If npm blocked the bundled runtime's install scripts, see the [installation docs](https://opencodex.me/getting-started/installation/). diff --git a/package.json b/package.json index a599b4321c7..23bb5a90ad8 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,9 @@ "src", "gui/dist", "assets/banner.png", + "assets/download-macos.svg", + "assets/download-windows.svg", + "assets/download-linux.svg", "assets/architecture.png", "assets/claude-code-models.gif", "assets/codex-app-picker.png", diff --git a/readme/README.fr.md b/readme/README.fr.md index 3609597a54e..69a05cf3daf 100644 --- a/readme/README.fr.md +++ b/readme/README.fr.md @@ -1,14 +1,26 @@ +

+ opencodex — proxy universel de fournisseurs pour Codex, Claude Code, Claude Desktop et Grok Build +

+

make codex open!

Proxy universel de fournisseurs pour OpenAI Codex, Claude Code, Claude Desktop & Grok Build
Deux commandes suffisent pour que chacun d'eux exécute le LLM de votre choix.

Suivre @claudeebum sur X + Dernière version de l'application de bureau version npm licence version de Node

+

+ Télécharger OpenCodex pour macOS + Télécharger OpenCodex pour Windows + Télécharger OpenCodex pour Linux +

+

Application de bureau (bêta) : macOS universel .dmg · Windows x64 .msi · Linux x86_64 .AppImage / .deb. Vous préférez le terminal ? Installez la CLI :

+ ```bash npm install -g @bitkyc08/opencodex ocx start @@ -79,7 +91,30 @@ tandis que les fils existants restent associés au compte qui les a démarrés. ## Démarrage rapide -### Installation personnelle +### Application de bureau (bêta) + +L'application de bureau reprend le même proxy et le même tableau de bord dans une fenêtre native, avec une icône dans la barre d'état et le binaire `ocx` inclus. +Elle se rattache à un proxy déjà en cours d'exécution ou démarre celui qui est fourni, et le tableau de bord reste +sur le port du proxy (**http://localhost:10100** sauf si vous en avez configuré un autre). Choisissez le fichier +correspondant à votre plateforme sur la page de la [dernière version publiée](https://github.com/lidge-jun/opencodex/releases/latest) : + +| Plateforme | Fichier | Remarques | +|---|---|---| +| macOS 13+ (Apple Silicon et Intel) | `OpenCodex--macos.dmg` | Compilation universelle, signée avec un identifiant Developer ID et notariée | +| Windows (x64) | `OpenCodex--windows-x64.msi` | Pas encore signée numériquement : SmartScreen demande une confirmation, choisissez **Informations complémentaires → Exécuter quand même** | +| Linux (x86_64) | `OpenCodex--linux-x86_64.AppImage` ou `-linux-amd64.deb` | La barre d'état nécessite un environnement de bureau compatible AppIndicator | + +Chaque fichier est accompagné d'un `.sha256` sur la page de la version. Sous macOS 14+, l'application embarque +également une extension WidgetKit qui affiche l'état du proxy, l'utilisation du jour et les quotas des +fournisseurs ; le modèle de données des instantanés qu'elle affiche se trouve dans [`app/`](../app) +(`MenuBarCore`). Pour compiler l'application vous-même, exécutez +`bun install && bun run build:gui` à la racine du dépôt, puis +`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` dans +`desktop/`. Le [guide de l'application de bureau](https://opencodex.me/fr/guides/desktop-app/) et le +[guide de l'application macOS dans la barre des menus](https://opencodex.me/fr/guides/macos-menu-bar/) détaillent le premier lancement, et +[`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed) répertorie tout ce qui est écrit sur le disque. + +### Installation personnelle (CLI) ```bash npm install -g @bitkyc08/opencodex # Node 18+ ; le runtime Bun est inclus automatiquement @@ -93,34 +128,6 @@ fournisseurs (plus de 40 intégrés, ou n'importe quel point de terminaison comp choisissez les modèles, gérez les comptes. `ocx gui` rouvre le tableau de bord à tout moment. -
-Application de bureau et widget macOS — bêta - -Une application native qui reprend le même tableau de bord, accompagnée d’une extension WidgetKit qui -affiche l’état du proxy, l’utilisation du jour et les quotas des fournisseurs sans ouvrir de -navigateur. Le proxy ne change pas : l’application détecte une instance en cours d’exécution ou -démarre le sidecar `ocx` inclus, tandis que le tableau de bord reste accessible sur le port du proxy -(**http://localhost:10100** sauf si vous en avez configuré un autre). - -Cette version est en bêta. Les versions publiées de l’application macOS sont signées avec un identifiant -Developer ID et notariées (les compilations locales sont signées ad hoc) ; le programme d’installation -Windows n’est pas encore signé, et SmartScreen affiche donc un avertissement au premier lancement. -Le widget nécessite macOS 14 ou une version ultérieure ; le modèle de données des instantanés qu’il -affiche se trouve dans [`app/`](../app) (`MenuBarCore`). - -Téléchargez l’application depuis la [dernière version publiée](https://github.com/lidge-jun/opencodex/releases), -ou compilez-la localement : exécutez `bun install && bun run build:gui` à la racine du dépôt, puis -`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` dans -`desktop/`. - -Les emplacements d’installation, les fichiers de service et tous les autres éléments écrits sur le -disque sont répertoriés dans [`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed). -Le [guide de l’application de bureau](https://opencodex.me/fr/guides/desktop-app/) et le -[guide de l’application macOS dans la barre des menus](https://opencodex.me/fr/guides/macos-menu-bar/) -détaillent l’installation sur chaque plateforme et le premier lancement. - -
- ### Groupe de comptes ChatGPT opencodex peut également gérer un **groupe de comptes ChatGPT** pour l'authentification Codex. Ajoutez plusieurs @@ -260,13 +267,13 @@ s'il est inaccessible). `ocx status` / `ocx doctor` / `ocx health` indiquent l' ## Plateformes prises en charge -| Système d'exploitation | État | Gestionnaire de services | -|---|---|---| -| macOS (arm64 / x64) | Entièrement pris en charge | launchd | -| Linux (x64 / arm64) | Entièrement pris en charge | systemd (unité utilisateur) | -| Windows (x64) | Entièrement pris en charge | Planificateur de tâches (masqué) / service natif en option (`--native`, WinSW) | +| Système d'exploitation | État | Gestionnaire de services | Application de bureau (bêta) | +|---|---|---|---| +| macOS (arm64 / x64) | Entièrement pris en charge | launchd | `.dmg` universel | +| Linux (x64 / arm64) | Entièrement pris en charge | systemd (unité utilisateur) | x86_64 `.AppImage` / `.deb` | +| Windows (x64) | Entièrement pris en charge | Planificateur de tâches (masqué) / service natif en option (`--native`, WinSW) | x64 `.msi` | -Nécessite [Node](https://nodejs.org) 18+. L'environnement d'exécution Bun est inclus lors de `npm install` — aucune installation +L'installation de la CLI nécessite [Node](https://nodejs.org) 18+ ; l'application de bureau n'a besoin ni de Node ni de Bun. L'environnement d'exécution Bun est inclus lors de `npm install` — aucune installation séparée de Bun n'est nécessaire, ni WSL sous Windows. Si npm a bloqué les scripts d'installation de l'environnement inclus, consultez la [documentation d'installation](https://opencodex.me/fr/getting-started/installation/). diff --git a/readme/README.ja.md b/readme/README.ja.md index 4aed5948dd0..a50ea2ea3a6 100644 --- a/readme/README.ja.md +++ b/readme/README.ja.md @@ -1,14 +1,26 @@ +

+ opencodex — Codex、Claude Code、Claude Desktop、Grok Build のための汎用プロバイダープロキシ +

+

make codex open!

OpenAI Codex、Claude Code、Claude Desktop、Grok Build のための汎用プロバイダープロキシ
コマンド 2 つで、そのすべてが好きな LLM で動きます。

X で @claudeebum をフォロー + 最新のデスクトップリリース npm version license node version

+

+ macOS 向け OpenCodex をダウンロード + Windows 向け OpenCodex をダウンロード + Linux 向け OpenCodex をダウンロード +

+

デスクトップアプリ(ベータ版): macOS ユニバーサル .dmg · Windows x64 .msi · Linux x86_64 .AppImage / .deb。ターミナル派なら CLI をインストール:

+ ```bash npm install -g @bitkyc08/opencodex ocx start @@ -78,7 +90,29 @@ Desktop、Grok Build から使えます。Codex 認証用の **ChatGPT アカウ ## クイックスタート -### 個人向けインストール +### デスクトップアプリ(ベータ版) + +デスクトップアプリは、同じプロキシとダッシュボードをネイティブウィンドウに収め、トレイと同梱の `ocx` を備えたものです。 +すでに起動しているプロキシに接続するか、同梱のプロキシを起動します。ダッシュボードはプロキシの +ポートで開きます(別のポートを設定していなければ **http://localhost:10100**)。 +[最新リリース](https://github.com/lidge-jun/opencodex/releases/latest)から、お使いのプラットフォーム向けのファイルを選んでください。 + +| プラットフォーム | ファイル | 備考 | +|---|---|---| +| macOS 13 以降(Apple Silicon と Intel) | `OpenCodex--macos.dmg` | ユニバーサルビルド。Developer ID で署名・公証済み | +| Windows(x64) | `OpenCodex--windows-x64.msi` | まだコード署名なし。SmartScreen が一度だけ確認するので、**詳細情報 → 実行**を選択 | +| Linux(x86_64) | `OpenCodex--linux-x86_64.AppImage` または `-linux-amd64.deb` | トレイには AppIndicator 対応のデスクトップが必要 | + +リリースページでは各ファイルの横に `.sha256` があります。macOS 14 以降では、プロキシの状態、 +今日の使用量、プロバイダーのクォータを表示する WidgetKit 拡張も付属します。表示に使う +スナップショットモデルは [`app/`](../app)(`MenuBarCore`)にあります。アプリを自分でビルドするには、 +リポジトリのルートで `bun install && bun run build:gui` を実行し、 +`desktop/` で `bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` を実行します。 +[デスクトップアプリガイド](https://opencodex.me/ja/guides/desktop-app/)と +[macOS メニューバーアプリガイド](https://opencodex.me/ja/guides/macos-menu-bar/)で初回起動について説明しています。 +[`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed) にはディスクに書き込まれるすべてのものをまとめています。 + +### 個人向けインストール(CLI) ```bash npm install -g @bitkyc08/opencodex # Node 18 以上。Bun ランタイムは自動で同梱されます @@ -91,32 +125,6 @@ ocx start # プロキシとダッシュボードが loca 組み込み、または任意の OpenAI 互換エンドポイント)、モデルの選択、アカウントの管理はここで行います。 `ocx gui` でいつでもダッシュボードを開き直せます。 -
-デスクトップアプリと macOS ウィジェット — ベータ版 - -同じダッシュボードを包むネイティブアプリに、ブラウザーを開かなくてもプロキシの状態、今日の使用量、 -プロバイダーのクォータを確認できる WidgetKit 拡張を加えたものです。プロキシ自体は変わりません。アプリは -起動中のプロキシを見つけるか、同梱の `ocx` サイドカーを起動します。ダッシュボードはプロキシの -ポートで開きます(別のポートを設定していなければ **http://localhost:10100**)。 - -現在はベータ版です。macOS アプリのリリースビルドは Developer ID で署名され、公証されています -(ローカルビルドはアドホック署名)。Windows インストーラーはまだコード署名されていないため、 -初回起動時に SmartScreen の警告が表示されます。ウィジェットには macOS 14 以降が必要です。 -表示に使うスナップショットモデルは -[`app/`](../app)(`MenuBarCore`)にあります。 - -[最新リリース](https://github.com/lidge-jun/opencodex/releases)からダウンロードするか、 -ローカルでビルドできます。リポジトリのルートで `bun install && bun run build:gui` を実行し、 -`desktop/` で `bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` を実行します。 - -インストール先、サービスファイルなどディスクに書き込まれるものは -[`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed) にまとめています。 -[デスクトップアプリガイド](https://opencodex.me/ja/guides/desktop-app/)と -[macOS メニューバーアプリガイド](https://opencodex.me/ja/guides/macos-menu-bar/)では、 -プラットフォーム別のインストール手順と初回起動について説明しています。 - -
- ### ChatGPT アカウントプール opencodex では、Codex 認証用の **ChatGPT アカウントプール**も管理できます。ChatGPT / Codex のアカウントを @@ -255,13 +263,13 @@ ocx init # 対話式セットアップ: ~/.opencodex/config.json を書き ## 対応プラットフォーム -| OS | 状態 | サービスマネージャー | -|---|---|---| -| macOS (arm64 / x64) | 完全対応 | launchd | -| Linux (x64 / arm64) | 完全対応 | systemd (user unit) | -| Windows (x64) | 完全対応 | タスクスケジューラ(非表示)/ 任意のネイティブサービス(`--native`、WinSW) | +| OS | 状態 | サービスマネージャー | デスクトップアプリ(ベータ版) | +|---|---|---|---| +| macOS (arm64 / x64) | 完全対応 | launchd | ユニバーサル `.dmg` | +| Linux (x64 / arm64) | 完全対応 | systemd (user unit) | x86_64 `.AppImage` / `.deb` | +| Windows (x64) | 完全対応 | タスクスケジューラ(非表示)/ 任意のネイティブサービス(`--native`、WinSW) | x64 `.msi` | -[Node](https://nodejs.org) 18 以上が必要です。Bun ランタイムは `npm install` で同梱されるので、Bun を +CLI インストールには [Node](https://nodejs.org) 18 以上が必要です。デスクトップアプリには Node も Bun も不要です。Bun ランタイムは `npm install` で同梱されるので、Bun を 別途入れる必要も、Windows で WSL を使う必要もありません。npm が同梱ランタイムのインストールスクリプト をブロックした場合は[インストールドキュメント](https://opencodex.me/ja/getting-started/installation/)を 参照してください。 diff --git a/readme/README.ko.md b/readme/README.ko.md index 2183165ec85..7e0688365e5 100644 --- a/readme/README.ko.md +++ b/readme/README.ko.md @@ -1,14 +1,26 @@ +

+ opencodex — Codex, Claude Code, Claude Desktop, Grok Build를 위한 범용 프로바이더 프록시 +

+

make codex open!

OpenAI Codex, Claude Code, Claude Desktop, Grok Build를 위한 범용 프로바이더 프록시
명령어 두 줄이면, 그 모두가 지정한 LLM으로 돌아갑니다.

X에서 @claudeebum 팔로우 + 최신 데스크톱 릴리스 npm version license node version

+

+ macOS용 OpenCodex 다운로드 + Windows용 OpenCodex 다운로드 + Linux용 OpenCodex 다운로드 +

+

데스크톱 앱 (베타): macOS 유니버설 .dmg · Windows x64 .msi · Linux x86_64 .AppImage / .deb. 터미널이 더 편하다면 CLI를 설치하세요:

+ ```bash npm install -g @bitkyc08/opencodex ocx start @@ -78,7 +90,29 @@ DeepSeek, Kimi, Qwen, Ollama를 비롯한 어떤 LLM이든 Codex, Claude Code, C ## 빠른 시작 -### 개인 설치 +### 데스크톱 앱 (베타) + +데스크톱 앱은 같은 프록시와 대시보드를 네이티브 창에 담은 것으로, 트레이와 번들된 `ocx`를 갖춥니다. +이미 실행 중인 프록시에 붙거나 번들된 프록시를 시작하며, 대시보드는 프록시 포트에서 열립니다 +(다른 포트를 설정하지 않았다면 **http://localhost:10100**). 플랫폼에 맞는 파일을 +[최신 릴리스](https://github.com/lidge-jun/opencodex/releases/latest)에서 고르세요. + +| 플랫폼 | 파일 | 참고 | +|---|---|---| +| macOS 13+ (Apple Silicon 및 Intel) | `OpenCodex--macos.dmg` | 유니버설 빌드, Developer ID로 서명 및 공증됨 | +| Windows (x64) | `OpenCodex--windows-x64.msi` | 아직 코드 서명되지 않음: SmartScreen이 한 번 물으면 **추가 정보 → 실행**을 선택 | +| Linux (x86_64) | `OpenCodex--linux-x86_64.AppImage` 또는 `-linux-amd64.deb` | 트레이는 AppIndicator를 지원하는 데스크톱이 필요 | + +릴리스 페이지에서 모든 파일 옆에 `.sha256`이 함께 있습니다. macOS 14 이상에서는 프록시 상태, +오늘의 사용량, 프로바이더 쿼터를 보여 주는 WidgetKit 확장도 함께 설치됩니다. 위젯이 그리는 +스냅샷 모델은 [`app/`](../app)의 `MenuBarCore`에 있습니다. 앱을 직접 빌드하려면 저장소 루트에서 +`bun install && bun run build:gui`를 실행한 다음, +`desktop/`에서 `bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local`을 실행하세요. +[데스크톱 앱 가이드](https://opencodex.me/ko/guides/desktop-app/)와 +[macOS 메뉴 막대 앱 가이드](https://opencodex.me/ko/guides/macos-menu-bar/)에서 첫 실행 안내를 볼 수 있고, +[`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed)에는 디스크에 쓰는 모든 항목이 정리되어 있습니다. + +### 개인 설치 (CLI) ```bash npm install -g @bitkyc08/opencodex # Node 18+; Bun 런타임은 자동으로 번들됩니다 @@ -90,31 +124,6 @@ ocx start # 프록시 + 대시보드: localhost:10100 **http://localhost:10100**을 열고 웹 대시보드에서 전부 설정하세요. 프로바이더 추가(내장 40개 이상, 또는 OpenAI 호환 엔드포인트), 모델 선택, 계정 관리까지 모두 여기서 합니다. `ocx gui`로 대시보드를 언제든 다시 엽니다. -
-데스크톱 앱과 macOS 위젯 — 베타 - -같은 대시보드를 감싼 네이티브 앱과, 브라우저를 열지 않고 프록시 상태·오늘의 사용량·프로바이더 -쿼터를 보여 주는 WidgetKit 확장입니다. 프록시 자체는 그대로입니다. 앱은 실행 중인 프록시를 찾거나 -번들된 `ocx` 사이드카를 시작하며, 대시보드는 프록시의 포트에서 열립니다(다른 포트를 설정하지 않았다면 -**http://localhost:10100**). - -현재 베타 버전입니다. macOS 앱의 릴리스 빌드는 Developer ID로 서명되고 공증됩니다(로컬 빌드는 -ad-hoc 서명). Windows 설치 파일은 아직 코드 서명되지 않아 처음 실행할 때 SmartScreen 경고가 -표시됩니다. 위젯은 macOS 14 이상에서 쓸 수 있으며, -위젯이 그리는 스냅샷 모델은 [`app/`](../app)의 `MenuBarCore`에 있습니다. - -[최신 릴리스](https://github.com/lidge-jun/opencodex/releases)에서 다운로드하거나 -직접 빌드하세요. 저장소 루트에서 `bun install && bun run build:gui`를 실행한 다음, -`desktop/`에서 `bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local`을 실행합니다. - -설치 위치, 서비스 파일을 비롯해 디스크에 쓰는 항목은 -[`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed)에 정리되어 있습니다. -[데스크톱 앱 가이드](https://opencodex.me/ko/guides/desktop-app/)와 -[macOS 메뉴 막대 앱 가이드](https://opencodex.me/ko/guides/macos-menu-bar/)에서 -플랫폼별 설치 방법과 첫 실행 안내를 확인할 수 있습니다. - -
- ### ChatGPT 계정 풀 opencodex는 Codex 인증용 **ChatGPT 계정 풀**도 관리합니다. ChatGPT / Codex 계정을 여러 개 넣고, @@ -246,13 +255,13 @@ ocx init # 대화형 설정: ~/.opencodex/config.json을 쓰고 Codex를 ## 지원 플랫폼 -| OS | 지원 상태 | 서비스 관리자 | -|---|---|---| -| macOS (arm64 / x64) | 완전 지원 | launchd | -| Linux (x64 / arm64) | 완전 지원 | systemd (user unit) | -| Windows (x64) | 완전 지원 | Task Scheduler (숨김) / 선택적 네이티브 서비스 (`--native`, WinSW) | +| OS | 지원 상태 | 서비스 관리자 | 데스크톱 앱 (베타) | +|---|---|---|---| +| macOS (arm64 / x64) | 완전 지원 | launchd | 유니버설 `.dmg` | +| Linux (x64 / arm64) | 완전 지원 | systemd (user unit) | x86_64 `.AppImage` / `.deb` | +| Windows (x64) | 완전 지원 | Task Scheduler (숨김) / 선택적 네이티브 서비스 (`--native`, WinSW) | x64 `.msi` | -[Node](https://nodejs.org) 18 이상이 필요합니다. Bun 런타임은 `npm install` 때 번들되므로 따로 설치할 +CLI 설치에는 [Node](https://nodejs.org) 18 이상이 필요하고, 데스크톱 앱은 Node와 Bun 모두 필요 없습니다. Bun 런타임은 `npm install` 때 번들되므로 따로 설치할 필요가 없고, Windows에서도 WSL이 필요 없습니다. npm이 번들 런타임의 설치 스크립트를 막았다면 [설치 문서](https://opencodex.me/ko/getting-started/installation/)를 보세요. diff --git a/readme/README.ru.md b/readme/README.ru.md index 0e9b41aa16e..d676a16cb11 100644 --- a/readme/README.ru.md +++ b/readme/README.ru.md @@ -1,14 +1,26 @@ +

+ opencodex — универсальный прокси провайдеров для Codex, Claude Code, Claude Desktop и Grok Build +

+

make codex open!

Универсальный прокси провайдеров для OpenAI Codex, Claude Code, Claude Desktop и Grok Build
Две команды — и каждый из них работает на любой LLM, которую вы укажете.

Подписывайтесь на @claudeebum в X + Последний релиз настольного приложения версия npm лицензия версия Node

+

+ Скачать OpenCodex для macOS + Скачать OpenCodex для Windows + Скачать OpenCodex для Linux +

+

Настольное приложение (бета): универсальный .dmg для macOS · .msi для Windows x64 · .AppImage / .deb для Linux x86_64. Предпочитаете терминал? Установите CLI:

+ ```bash npm install -g @bitkyc08/opencodex ocx start @@ -80,7 +92,32 @@ Ollama или любую другую LLM с Codex, Claude Code, Claude Desktop ## Быстрый старт -### Личная установка +### Настольное приложение (бета) + +Настольное приложение — это тот же прокси и та же панель управления в нативном окне, +с иконкой в трее и встроенным `ocx`. Оно подключается к уже запущенному прокси либо +запускает встроенный, а панель остаётся на порту прокси (**http://localhost:10100**, +если вы не настроили другой). Выберите файл для своей платформы в +[последнем релизе](https://github.com/lidge-jun/opencodex/releases/latest): + +| Платформа | Файл | Примечания | +|---|---|---| +| macOS 13+ (Apple Silicon и Intel) | `OpenCodex--macos.dmg` | Универсальная сборка, подписана Developer ID и нотариализована | +| Windows (x64) | `OpenCodex--windows-x64.msi` | Пока без цифровой подписи: SmartScreen спросит один раз — выберите **Подробнее → Выполнить в любом случае** | +| Linux (x86_64) | `OpenCodex--linux-x86_64.AppImage` или `-linux-amd64.deb` | Для трея нужен рабочий стол с поддержкой AppIndicator | + +Рядом с каждым файлом на странице релиза есть `.sha256`. На macOS 14+ приложение также +поставляется с расширением WidgetKit, которое показывает состояние прокси, расход за +сегодня и квоты провайдеров; модель снимков, которую оно отображает, находится в +[`app/`](../app) (`MenuBarCore`). Чтобы собрать приложение самостоятельно, выполните +`bun install && bun run build:gui` в корне репозитория, затем +`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` в +`desktop/`. В [руководстве по настольному приложению](https://opencodex.me/ru/guides/desktop-app/) и +[руководстве по приложению macOS в строке меню](https://opencodex.me/ru/guides/macos-menu-bar/) +описан первый запуск, а +[`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed) перечисляет всё, что записывается на диск. + +### Личная установка (CLI) ```bash npm install -g @bitkyc08/opencodex # Node 18+; рантайм Bun подключается автоматически @@ -93,33 +130,6 @@ ocx start # прокси + панель управлен (40+ встроенных или любой OpenAI-совместимый endpoint), выберите модели, управляйте аккаунтами. `ocx gui` в любой момент снова откроет панель. -
-Настольное приложение и виджет macOS — бета-версия - -Это нативная оболочка вокруг той же панели управления с расширением WidgetKit, которое -показывает состояние прокси, расход за сегодня и квоты провайдеров без открытия браузера. -Сам прокси не меняется: приложение находит уже запущенный экземпляр либо запускает встроенный -сайдкар `ocx`, а панель остаётся доступной на порту прокси (**http://localhost:10100**, -если вы не настроили другой порт). - -Это бета-версия. Релизные сборки приложения для macOS подписаны сертификатом Developer ID и -нотариализованы (локальные сборки подписаны ad-hoc); установщик Windows пока не подписан -цифровой подписью, поэтому SmartScreen предупреждает при первом запуске. Для виджета нужна -macOS 14 или новее; его модель снимков находится в [`app/`](../app) (`MenuBarCore`). - -Скачайте приложение из [последнего релиза](https://github.com/lidge-jun/opencodex/releases) или -соберите локально: выполните `bun install && bun run build:gui` в корне репозитория, затем -`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` в -`desktop/`. - -Пути установки, файлы служб и всё остальное, что записывается на диск, перечислены в -[`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed). В -[руководстве по настольному приложению](https://opencodex.me/ru/guides/desktop-app/) и -[руководстве по приложению macOS в строке меню](https://opencodex.me/ru/guides/macos-menu-bar/) -описаны установка на каждой платформе и первый запуск. - -
- ### Пул аккаунтов ChatGPT opencodex также умеет управлять **пулом аккаунтов ChatGPT** для аутентификации Codex. Добавьте @@ -262,13 +272,13 @@ ocx init # интерактивная настройка: пишет ~/.ope ## Поддерживаемые платформы -| ОС | Статус | Менеджер служб | -|---|---|---| -| macOS (arm64 / x64) | Полная поддержка | launchd | -| Linux (x64 / arm64) | Полная поддержка | systemd (пользовательский unit) | -| Windows (x64) | Полная поддержка | Task Scheduler (скрыто) / опциональная нативная служба (`--native`, WinSW) | +| ОС | Статус | Менеджер служб | Настольное приложение (бета) | +|---|---|---|---| +| macOS (arm64 / x64) | Полная поддержка | launchd | Универсальный `.dmg` | +| Linux (x64 / arm64) | Полная поддержка | systemd (пользовательский unit) | `.AppImage` / `.deb` для x86_64 | +| Windows (x64) | Полная поддержка | Task Scheduler (скрыто) / опциональная нативная служба (`--native`, WinSW) | `.msi` для x64 | -Требуется [Node](https://nodejs.org) 18+. Рантайм Bun добавляется автоматически при `npm install` — +Для установки CLI требуется [Node](https://nodejs.org) 18+; настольному приложению не нужны ни Node, ни Bun. Рантайм Bun добавляется автоматически при `npm install` — отдельно устанавливать Bun не нужно, WSL на Windows тоже не нужен. Если npm заблокировал скрипты установки встроенного рантайма, см. [документацию по установке](https://opencodex.me/ru/getting-started/installation/). diff --git a/readme/README.tr.md b/readme/README.tr.md index 3ba22ba3ade..28a8cc74cdf 100644 --- a/readme/README.tr.md +++ b/readme/README.tr.md @@ -1,14 +1,26 @@ +

+ opencodex — Codex, Claude Code, Claude Desktop ve Grok Build için evrensel sağlayıcı proxy'si +

+

make codex open!

OpenAI Codex, Claude Code, Claude Desktop ve Grok Build için evrensel sağlayıcı proxy'si
İki komut, ve hepsi işaret ettiğiniz LLM ile çalışır.

X üzerinde @claudeebum hesabını takip et + En güncel masaüstü sürümü npm sürümü lisans node sürümü

+

+ macOS için OpenCodex'i indir + Windows için OpenCodex'i indir + Linux için OpenCodex'i indir +

+

Masaüstü uygulaması (beta): macOS evrensel .dmg · Windows x64 .msi · Linux x86_64 .AppImage / .deb. Terminali mi tercih ediyorsunuz? CLI'yı kurun:

+ ```bash npm install -g @bitkyc08/opencodex ocx start @@ -78,7 +90,31 @@ kullanılan sağlıklı hesaba kendiliğinden gitsin; mevcut dizilerse onları b ## Hızlı başlangıç -### Kişisel kurulum +### Masaüstü uygulaması (beta) + +Masaüstü uygulaması; aynı proxy ve kontrol panelini yerel bir pencerede, menü çubuğu simgesi ve +paketlenmiş `ocx` ile sunar. Zaten çalışan bir proxy'ye bağlanır ya da kendi paketlenmiş proxy'sini +başlatır; kontrol paneli proxy bağlantı noktasında kalır (başka bir tane yapılandırmadıysanız +**http://localhost:10100**). Platformunuza uygun dosyayı +[en güncel sürümden](https://github.com/lidge-jun/opencodex/releases/latest) seçin: + +| Platform | Dosya | Notlar | +|---|---|---| +| macOS 13+ (Apple Silicon ve Intel) | `OpenCodex--macos.dmg` | Evrensel derleme, Developer ID ile imzalı ve noter onaylı | +| Windows (x64) | `OpenCodex--windows-x64.msi` | Henüz kod imzalı değil: SmartScreen bir kez sorar, **Diğer bilgiler → Yine de çalıştır** seçin | +| Linux (x86_64) | `OpenCodex--linux-x86_64.AppImage` veya `-linux-amd64.deb` | Menü çubuğu simgesi AppIndicator destekli bir masaüstü gerektirir | + +Her dosyanın yanında sürüm sayfasında bir `.sha256` bulunur. macOS 14 ve üzerinde uygulama ayrıca +proxy durumunu, bugünkü kullanımı ve sağlayıcı kotalarını gösteren bir WidgetKit uzantısıyla gelir; +görüntülediği anlık görüntü modeli [`app/`](../app) dizinindedir (`MenuBarCore`). Uygulamayı kendiniz +derlemek için depo kökünde `bun install && bun run build:gui`, ardından `desktop/` içinde +`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` çalıştırın. +[Masaüstü uygulaması kılavuzu](https://opencodex.me/tr/guides/desktop-app/) ve +[macOS menü çubuğu uygulaması kılavuzu](https://opencodex.me/tr/guides/macos-menu-bar/) ilk açılışı +anlatır; [`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed) diske yazılan her +şeyi listeler. + +### Kişisel kurulum (CLI) ```bash npm install -g @bitkyc08/opencodex # Node 18+; Bun çalışma zamanı otomatik olarak paketlenir @@ -91,31 +127,6 @@ Arka planda çalıştırmak için `ocx service` kullanın. ekleyin (40'tan fazla hazır sağlayıcı ya da herhangi bir OpenAI uyumlu uç nokta), model seçin, hesap yönetin. `ocx gui` paneli istediğiniz zaman yeniden açar. -
-Masaüstü uygulaması ve macOS widget'ı — beta - -Aynı kontrol panelini sarmalayan yerel uygulamaya ek olarak, tarayıcı açmadan proxy durumunu, -bugünkü kullanımı ve sağlayıcı kotalarını gösteren bir WidgetKit uzantısı sunulur. Proxy'nin çalışma -şekli değişmez: uygulama çalışan bir proxy bulur ya da paketlenmiş `ocx` sidecar'ını başlatır; -kontrol paneli proxy'nin bağlantı noktasında kalır (başka bir bağlantı noktası yapılandırmadıysanız -**http://localhost:10100**). - -Bu bir beta sürümüdür. macOS uygulamasının sürüm derlemeleri Developer ID ile imzalanır ve Apple -tarafından noter onayından geçer (yerel derlemeler ad-hoc imzalanır); Windows yükleyicisi henüz kod -imzalı değildir, bu nedenle SmartScreen ilk çalıştırmada uyarı gösterir. Widget için macOS 14 veya -üzeri gerekir; görüntülediği anlık görüntü modeli [`app/`](../app) dizinindedir (`MenuBarCore`). - -Uygulamayı [en güncel sürümden](https://github.com/lidge-jun/opencodex/releases) indirin veya -yerel olarak derleyin: depo kökünde `bun install && bun run build:gui`, ardından `desktop/` içinde -`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` çalıştırın. - -Kurulum konumları, servis dosyaları ve diske yazılan diğer her şey -[`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed) dosyasında listelenir. -[Masaüstü uygulaması kılavuzu](https://opencodex.me/tr/guides/desktop-app/) ve -[macOS menü çubuğu uygulaması kılavuzu](https://opencodex.me/tr/guides/macos-menu-bar/), -platforma göre kurulumu ve ilk açılışı açıklar. - -
### ChatGPT hesap havuzu @@ -256,13 +267,13 @@ ulaşamadıklarında sıfırdan farklı bir kodla çıkar). `ocx status` / `ocx ## Desteklenen platformlar -| İşletim sistemi | Durum | Servis yöneticisi | -|---|---|---| -| macOS (arm64 / x64) | Tam destekleniyor | launchd | -| Linux (x64 / arm64) | Tam destekleniyor | systemd (kullanıcı birimi) | -| Windows (x64) | Tam destekleniyor | Görev Zamanlayıcı (gizli) / isteğe bağlı yerel servis (`--native`, WinSW) | +| İşletim sistemi | Durum | Servis yöneticisi | Masaüstü uygulaması (beta) | +|---|---|---|---| +| macOS (arm64 / x64) | Tam destekleniyor | launchd | Evrensel `.dmg` | +| Linux (x64 / arm64) | Tam destekleniyor | systemd (kullanıcı birimi) | x86_64 `.AppImage` / `.deb` | +| Windows (x64) | Tam destekleniyor | Görev Zamanlayıcı (gizli) / isteğe bağlı yerel servis (`--native`, WinSW) | x64 `.msi` | -[Node](https://nodejs.org) 18 veya üzeri gerekir. Bun çalışma zamanı `npm install` sırasında paketlenir — +CLI kurulumu [Node](https://nodejs.org) 18 veya üzerini gerektirir; masaüstü uygulamasının ne Node'a ne de Bun'a ihtiyacı vardır. Bun çalışma zamanı `npm install` sırasında paketlenir — ayrıca Bun kurmanıza gerek yok, Windows'ta WSL de gerekmez. npm, paketlenmiş çalışma zamanının kurulum betiklerini engellediyse [kurulum belgelerine](https://opencodex.me/tr/getting-started/installation/) bakın. diff --git a/readme/README.zh-CN.md b/readme/README.zh-CN.md index e5790fe889b..107989792c5 100644 --- a/readme/README.zh-CN.md +++ b/readme/README.zh-CN.md @@ -1,14 +1,26 @@ +

+ opencodex —— 面向 Codex、Claude Code、Claude Desktop 和 Grok Build 的通用提供商代理 +

+

make codex open!

面向 OpenAI Codex、Claude Code、Claude Desktop 和 Grok Build 的通用提供商代理
两条命令,它们就都能跑你指定的任意 LLM。

在 X 上关注 @claudeebum + 最新桌面版发布 npm 版本 许可证 Node 版本

+

+ 下载 macOS 版 OpenCodex + 下载 Windows 版 OpenCodex + 下载 Linux 版 OpenCodex +

+

桌面应用(测试版):macOS 通用 .dmg · Windows x64 .msi · Linux x86_64 .AppImage / .deb。更喜欢终端?安装 CLI:

+ ```bash npm install -g @bitkyc08/opencodex ocx start @@ -77,7 +89,29 @@ Codex 认证管理一个 **ChatGPT 账户池**:添加账户,在仪表板中 ## 快速开始 -### 个人安装 +### 桌面应用(测试版) + +桌面应用把同一个代理和仪表板装进原生窗口,附带系统托盘和内置的 `ocx`。 +它会连接已在运行的代理,或启动自带的代理;仪表板仍使用代理端口 +(未另行配置时为 **http://localhost:10100**)。从 +[最新发布版本](https://github.com/lidge-jun/opencodex/releases/latest)中选择适合你平台的文件: + +| 平台 | 文件 | 说明 | +|---|---|---| +| macOS 13+(Apple Silicon 和 Intel) | `OpenCodex--macos.dmg` | 通用构建,使用 Developer ID 签名并完成公证 | +| Windows (x64) | `OpenCodex--windows-x64.msi` | 尚未进行代码签名:SmartScreen 会询问一次,选择 **更多信息 → 仍要运行** | +| Linux (x86_64) | `OpenCodex--linux-x86_64.AppImage` 或 `-linux-amd64.deb` | 托盘需要支持 AppIndicator 的桌面环境 | + +每个文件在发布页面上都带有对应的 `.sha256`。在 macOS 14+ 上,应用还附带一个 +WidgetKit 扩展,可显示代理状态、今日用量和提供商配额;它所呈现的快照模型位于 +[`app/`](../app)(`MenuBarCore`)。如需自行构建应用,先在仓库根目录运行 +`bun install && bun run build:gui`,然后在 +`desktop/` 中运行 `bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local`。 +[桌面应用指南](https://opencodex.me/zh-cn/guides/desktop-app/)和 +[macOS 菜单栏应用指南](https://opencodex.me/zh-cn/guides/macos-menu-bar/)介绍了首次启动, +[`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed)列出了写入磁盘的所有内容。 + +### 个人安装(CLI) ```bash npm install -g @bitkyc08/opencodex # Node 18+;Bun 运行时会自动捆绑 @@ -90,32 +124,6 @@ ocx start # 代理 + 仪表板:localhost:10100 (40 多个内置,或任意 OpenAI 兼容端点)、选择模型、管理账户。随时运行 `ocx gui` 可重新打开仪表板。 -
-桌面应用与 macOS 小组件 —— 测试版 - -它是同一套仪表板的原生外壳,另带 WidgetKit 扩展,无需打开浏览器即可查看代理状态、 -今日用量和提供商配额。代理本身没有变化:应用会连接已在运行的代理;若未发现, -则启动内置的 `ocx` sidecar。仪表板仍使用代理的端口(未另行配置时为 -**http://localhost:10100**)。 - -桌面应用目前仍处于测试阶段。macOS 应用的发布构建已使用 Developer ID 签名并完成公证 -(本地构建采用 ad-hoc 签名);Windows 安装程序尚未进行代码签名,因此首次运行时 -SmartScreen 会发出警告。 -小组件需要 macOS 14 或更高版本;它所呈现的快照模型位于 [`app/`](../app) -(`MenuBarCore`)。 - -请从[最新发布版本](https://github.com/lidge-jun/opencodex/releases)下载,或在本地构建: -先在仓库根目录运行 `bun install && bun run build:gui`,再进入 `desktop/` 运行 -`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local`。 - -安装位置、服务文件以及写入磁盘的其他内容均列在 -[`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed) 中。 -[桌面应用指南](https://opencodex.me/zh-cn/guides/desktop-app/)和 -[macOS 菜单栏应用指南](https://opencodex.me/zh-cn/guides/macos-menu-bar/) -介绍了各平台的安装方式和首次启动步骤。 - -
- ### ChatGPT 账户池 opencodex 还能为 Codex 认证管理一个 **ChatGPT 账户池**。添加多个 ChatGPT / Codex 账户, @@ -247,13 +255,13 @@ ocx init # 交互式设置:写入 ~/.opencodex/config.json 并接入 Code ## 支持平台 -| 操作系统 | 状态 | 服务管理器 | -|---|---|---| -| macOS (arm64 / x64) | 完整支持 | launchd | -| Linux (x64 / arm64) | 完整支持 | systemd(用户单元) | -| Windows (x64) | 完整支持 | 任务计划程序(隐藏) / 可选原生服务 (`--native`,WinSW) | +| 操作系统 | 状态 | 服务管理器 | 桌面应用(测试版) | +|---|---|---|---| +| macOS (arm64 / x64) | 完整支持 | launchd | 通用 `.dmg` | +| Linux (x64 / arm64) | 完整支持 | systemd(用户单元) | x86_64 `.AppImage` / `.deb` | +| Windows (x64) | 完整支持 | 任务计划程序(隐藏) / 可选原生服务 (`--native`,WinSW) | x64 `.msi` | -需要 [Node](https://nodejs.org) 18+。Bun 运行时在 `npm install` 时捆绑 —— 无需单独安装 +CLI 安装需要 [Node](https://nodejs.org) 18+;桌面应用既不需要 Node 也不需要 Bun。Bun 运行时在 `npm install` 时捆绑 —— 无需单独安装 Bun,Windows 也不需要 WSL。如果 npm 拦截了捆绑运行时的安装脚本,见 [安装文档](https://opencodex.me/zh-cn/getting-started/installation/)。 diff --git a/readme/README.zh-TW.md b/readme/README.zh-TW.md index c050a3ab2cc..0642685e939 100644 --- a/readme/README.zh-TW.md +++ b/readme/README.zh-TW.md @@ -1,14 +1,26 @@ +

+ opencodex——適用於 Codex、Claude Code、Claude Desktop 與 Grok Build 的通用供應商代理 +

+

make codex open!

適用於 OpenAI Codex、Claude Code、Claude Desktop 與 Grok Build 的通用供應商代理
兩條命令,這四個就都能跑你指定的任何 LLM。

在 X 上關注 @claudeebum + 最新桌面版發行 npm 版本 授權 Node 版本

+

+ 下載 macOS 版 OpenCodex + 下載 Windows 版 OpenCodex + 下載 Linux 版 OpenCodex +

+

桌面應用程式(Beta):macOS 通用 .dmg · Windows x64 .msi · Linux x86_64 .AppImage / .deb。偏好終端機?安裝 CLI:

+ ```bash npm install -g @bitkyc08/opencodex ocx start @@ -76,7 +88,29 @@ Gemini、Grok、GLM、DeepSeek、Kimi、Qwen、Ollama 或任何其他 LLM。它 ## 快速開始 -### 個人安裝 +### 桌面應用程式(Beta) + +桌面應用程式是同一套代理與儀表板的原生視窗版本,附系統匣與內建的 `ocx`。 +它會接上已在執行的代理,或啟動內建的那一個;儀表板仍使用代理的連接埠 +(除非你設定了其他連接埠,否則為 **http://localhost:10100**)。請從 +[最新發行版](https://github.com/lidge-jun/opencodex/releases/latest)挑選適合你平台的檔案: + +| 平台 | 檔案 | 說明 | +|---|---|---| +| macOS 13+(Apple Silicon 與 Intel) | `OpenCodex--macos.dmg` | 通用建置,以 Developer ID 簽章並經過公證 | +| Windows(x64) | `OpenCodex--windows-x64.msi` | 尚未經程式碼簽章:SmartScreen 會詢問一次,選擇 **More info → Run anyway** | +| Linux(x86_64) | `OpenCodex--linux-x86_64.AppImage` 或 `-linux-amd64.deb` | 系統匣需要支援 AppIndicator 的桌面環境 | + +每個檔案在發行頁面上都附有 `.sha256`。在 macOS 14+ 上,應用程式還附帶 +WidgetKit 擴充套件,可顯示代理狀態、今日用量與供應商配額;它所呈現的快照模型位於 +[`app/`](../app)(`MenuBarCore`)。若要自行建置應用程式,先在儲存庫根目錄執行 +`bun install && bun run build:gui`,再於 +`desktop/` 執行 `bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local`。 +[桌面應用程式指南](https://opencodex.me/zh-tw/guides/desktop-app/) 與 +[macOS 選單列應用程式指南](https://opencodex.me/zh-tw/guides/macos-menu-bar/) 涵蓋首次啟動, +[`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed) 列出所有寫入磁碟的內容。 + +### 個人安裝(CLI) ```bash npm install -g @bitkyc08/opencodex # Node 18+;Bun 執行環境會自動打包 @@ -89,29 +123,6 @@ ocx start # 代理 + 儀表板位於 localhost:10100 (40+ 內建,或任何 OpenAI 相容端點)、挑選模型、管理帳號。隨時可用 `ocx gui` 重新開啟儀表板。 -
-桌面應用程式與 macOS 小工具——Beta 版 - -它是同一套儀表板的原生外殼,另附 WidgetKit 擴充套件,無需開啟瀏覽器就能查看代理狀態、 -今日用量與供應商配額。代理本身沒有改變:應用程式會尋找正在執行的代理,找不到便啟動隨附的 -`ocx` sidecar;儀表板仍使用代理的連接埠(除非你設定了其他連接埠,否則為 **http://localhost:10100**)。 - -目前仍是 Beta 版。macOS 應用程式的發行版建置使用 Developer ID 簽章並經過公證(本機建置則使用 ad-hoc 簽章); -Windows 安裝程式尚未經程式碼簽章,因此首次執行時 SmartScreen 會顯示警告。小工具需要 macOS 14 或更新版本;它所呈現的快照模型位於 -[`app/`](../app)(`MenuBarCore`)。 - -請從[最新發行版](https://github.com/lidge-jun/opencodex/releases)下載,或在本機建置:先在儲存庫根目錄執行 -`bun install && bun run build:gui`,再於 `desktop/` 執行 -`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local`。 - -安裝位置、服務檔案,以及其他寫入磁碟的內容,都列在 -[`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed)。 -[桌面應用程式指南](https://opencodex.me/zh-tw/guides/desktop-app/) 與 -[macOS 選單列應用程式指南](https://opencodex.me/zh-tw/guides/macos-menu-bar/) -說明各平台的安裝方式與首次啟動步驟。 - -
- ### ChatGPT 帳號池 opencodex 也能為 Codex 認證管理 **ChatGPT 帳號池**。新增多個 ChatGPT / Codex 帳號, @@ -241,13 +252,13 @@ ocx init # 互動式設定:寫入 ~/.opencodex/config.json 並接上 Code ## 支援平台 -| 作業系統 | 狀態 | 服務管理員 | -|---|---|---| -| macOS (arm64 / x64) | 完整支援 | launchd | -| Linux (x64 / arm64) | 完整支援 | systemd(使用者單元) | -| Windows (x64) | 完整支援 | Task Scheduler(隱藏)/可選原生服務(`--native`、WinSW) | +| 作業系統 | 狀態 | 服務管理員 | 桌面應用程式(Beta) | +|---|---|---|---| +| macOS (arm64 / x64) | 完整支援 | launchd | 通用 `.dmg` | +| Linux (x64 / arm64) | 完整支援 | systemd(使用者單元) | x86_64 `.AppImage` / `.deb` | +| Windows (x64) | 完整支援 | Task Scheduler(隱藏)/可選原生服務(`--native`、WinSW) | x64 `.msi` | -需要 [Node](https://nodejs.org) 18+。Bun 執行環境在 `npm install` 時一併打包——不必另外安裝 +CLI 安裝需要 [Node](https://nodejs.org) 18+;桌面應用程式則不需要 Node 或 Bun。Bun 執行環境在 `npm install` 時一併打包——不必另外安裝 Bun,Windows 也不需要 WSL。若 npm 攔截了打包執行環境的安裝腳本, 見[安裝文件](https://opencodex.me/zh-tw/getting-started/installation/)。 diff --git a/readme/i18n-manifest.json b/readme/i18n-manifest.json index 1452f9adf67..558cb2261ab 100644 --- a/readme/i18n-manifest.json +++ b/readme/i18n-manifest.json @@ -6,43 +6,43 @@ "file": "readme/README.fr.md", "label": "Français", "docsPath": "fr", - "sourceSha256": "3f624c676ab8171840977bbef7223f7652fb19c1237632813b4ea4247cc82611" + "sourceSha256": "d755ec5a3d2ea4978e17ddd10910f7d464ee32132a332226fbf8083d64b9b240" }, "ko": { "file": "readme/README.ko.md", "label": "한국어", "docsPath": "ko", - "sourceSha256": "3f624c676ab8171840977bbef7223f7652fb19c1237632813b4ea4247cc82611" + "sourceSha256": "d755ec5a3d2ea4978e17ddd10910f7d464ee32132a332226fbf8083d64b9b240" }, "zh-CN": { "file": "readme/README.zh-CN.md", "label": "简体中文", "docsPath": "zh-cn", - "sourceSha256": "3f624c676ab8171840977bbef7223f7652fb19c1237632813b4ea4247cc82611" + "sourceSha256": "d755ec5a3d2ea4978e17ddd10910f7d464ee32132a332226fbf8083d64b9b240" }, "zh-TW": { "file": "readme/README.zh-TW.md", "label": "繁體中文", "docsPath": "zh-tw", - "sourceSha256": "3f624c676ab8171840977bbef7223f7652fb19c1237632813b4ea4247cc82611" + "sourceSha256": "d755ec5a3d2ea4978e17ddd10910f7d464ee32132a332226fbf8083d64b9b240" }, "ru": { "file": "readme/README.ru.md", "label": "Русский", "docsPath": "ru", - "sourceSha256": "3f624c676ab8171840977bbef7223f7652fb19c1237632813b4ea4247cc82611" + "sourceSha256": "d755ec5a3d2ea4978e17ddd10910f7d464ee32132a332226fbf8083d64b9b240" }, "ja": { "file": "readme/README.ja.md", "label": "日本語", "docsPath": "ja", - "sourceSha256": "3f624c676ab8171840977bbef7223f7652fb19c1237632813b4ea4247cc82611" + "sourceSha256": "d755ec5a3d2ea4978e17ddd10910f7d464ee32132a332226fbf8083d64b9b240" }, "tr": { "file": "readme/README.tr.md", "label": "Türkçe", "docsPath": "tr", - "sourceSha256": "3f624c676ab8171840977bbef7223f7652fb19c1237632813b4ea4247cc82611" + "sourceSha256": "d755ec5a3d2ea4978e17ddd10910f7d464ee32132a332226fbf8083d64b9b240" } } } From 65bc64fdb6eb680942cc608436f72f776ce7873e Mon Sep 17 00:00:00 2001 From: JUN Date: Wed, 23 Sep 2026 13:31:03 +0900 Subject: [PATCH 03/11] docs-site: add a desktop download section and launch banner to the landing page --- docs-site/src/components/Landing.astro | 144 +++++++++++++++++- docs-site/src/styles/custom.css | 197 +++++++++++++++++++++++++ 2 files changed, 338 insertions(+), 3 deletions(-) diff --git a/docs-site/src/components/Landing.astro b/docs-site/src/components/Landing.astro index bbb71b13aef..826d6515e74 100644 --- a/docs-site/src/components/Landing.astro +++ b/docs-site/src/components/Landing.astro @@ -6,8 +6,10 @@ import { Image } from 'astro:assets'; import { siAnthropic, + siApple, siDeepseek, siGoogle, + siLinux, siMoonshotai, siOllama, siOpenrouter, @@ -91,6 +93,24 @@ const fr = { 'Documentation map': 'Plan de la documentation', 'Explore the docs': 'Explorer la documentation', 'opencodex is an independent community project, not affiliated with or endorsed by OpenAI, Anthropic, or any other provider. Some providers may restrict accounts that route traffic through third-party proxies — review each provider’s Terms of Service before connecting.': 'opencodex est un projet communautaire indépendant, sans affiliation avec OpenAI, Anthropic ou tout autre fournisseur, et sans approbation de leur part. Certains fournisseurs peuvent restreindre les comptes qui acheminent leur trafic par des proxys tiers ; consultez les conditions d’utilisation de chaque fournisseur avant de vous connecter.', + 'New': 'Nouveau', + 'Desktop app beta for macOS, Windows and Linux': 'Bêta de l’app de bureau pour macOS, Windows et Linux', + 'Download': 'Télécharger', + 'Download for macOS': 'Télécharger pour macOS', + 'Download for Windows': 'Télécharger pour Windows', + 'Download for Linux': 'Télécharger pour Linux', + 'Download OpenCodex': 'Télécharger OpenCodex', + 'The desktop app bundles the proxy, the dashboard and a tray. Beta.': 'L’app de bureau regroupe le proxy, le tableau de bord et une icône de barre d’état. Bêta.', + 'Universal · Apple Silicon and Intel · macOS 13+ · .dmg': 'Universel · Apple Silicon et Intel · macOS 13+ · .dmg', + 'Installer not code-signed yet': 'Programme d’installation pas encore signé', + '.deb package': 'Paquet .deb', + 'Recommended for your system': 'Recommandé pour votre système', + 'Prefer the terminal?': 'Vous préférez le terminal ?', + 'Installation guide': 'Guide d’installation', + 'All releases and checksums': 'Toutes les versions et sommes de contrôle', + 'Desktop app guide': 'Guide de l’app de bureau', + 'Desktop App': 'App de bureau', + 'Latest release': 'Dernière version', } as const; const t = (en: K, ko: string, zh: string, ru: string, ja: string, zhTW: string, tr: string): string => @@ -109,6 +129,10 @@ const icons: Record = { code: 'M16 18l6-6-6-6M8 6l-6 6 6 6', terminal: 'M4 17l6-6-6-6M12 19h8', folder: 'M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z', + // Windows four-pane mark (not in simple-icons); fill, not stroke + windows: 'M3 3h8.5v8.5H3Zm9.5 0H21v8.5h-8.5ZM3 12.5h8.5V21H3Zm9.5 0H21V21h-8.5Z', + // Lucide download glyph (arrow into a tray); stroke, not fill + download: 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3', }; // Official monochrome marks from simple-icons where the brand exists in the @@ -145,6 +169,7 @@ const docsMap = [ icon: 'rocket', links: [ { label: t('Installation', '설치', '安装', 'Установка', 'インストール', '安裝', 'Kurulum'), href: `${prefix}getting-started/installation/` }, + { label: t('Desktop App', '데스크톱 앱', '桌面应用', 'Десктопное приложение', 'デスクトップアプリ', '桌面應用程式', 'Masaüstü Uygulaması'), href: `${prefix}guides/desktop-app/` }, { label: t('Quickstart', '빠른 시작', '快速开始', 'Быстрый старт', 'クイックスタート', '快速入門', 'Hızlı Başlangıç'), href: `${prefix}getting-started/quickstart/` }, { label: t('How It Works', '동작 원리', '工作原理', 'Как это работает', '仕組み', '運作原理', 'Nasıl Çalışır'), href: `${prefix}getting-started/how-it-works/` }, { label: t('Agent Quickstart', '에이전트 퀵스타트', 'Agent 快速上手', 'Быстрый старт для агентов', 'エージェント向けクイックスタート', 'Agent 快速上手', 'Ajanlar İçin Hızlı Başlangıç'), href: `${prefix}getting-started/for-agents/` }, @@ -208,6 +233,11 @@ const docsMap = [
+ + {t('New', '새로 출시', '新', 'Новое', 'New', '新', 'Yeni')} + {t('Desktop app beta for macOS, Windows and Linux', 'macOS·Windows·Linux 데스크톱 앱 베타', 'macOS、Windows 与 Linux 桌面应用 Beta', 'Бета десктопного приложения для macOS, Windows и Linux', 'macOS・Windows・Linux 向けデスクトップアプリ ベータ', 'macOS、Windows 與 Linux 桌面應用程式 Beta', 'macOS, Windows ve Linux için masaüstü uygulaması beta')} + + {/* Product-word drum: the H1 performs the claim — the proxy serves both Codex and Claude Code. 4-face rotateX cylinder, fixed slot width via inline-grid stacking; reduced-motion collapses to a static pairing. */} @@ -226,11 +256,14 @@ const docsMap = [ {t('opencodex is a local proxy that serves Codex and Claude Code from one port — translating each wire format to any provider, with streaming, tool calls, reasoning, and images in both directions. Zero client patches.', 'opencodex는 포트 하나로 Codex와 Claude Code를 함께 서빙하는 로컬 프록시입니다 — 각 wire 포맷을 어떤 프로바이더로든 양방향 변환하고, 스트리밍·tool call·reasoning·이미지까지 그대로 통과시킵니다. 클라이언트 패치는 없습니다.', 'opencodex 是一个本地代理,用同一个端口同时服务 Codex 与 Claude Code —— 将各自的线路格式双向翻译为任意 provider,支持流式、工具调用、推理与图像。无需修补客户端。', 'opencodex — локальный прокси, который обслуживает Codex и Claude Code через один порт: транслирует каждый wire-формат под любого провайдера, пропуская стриминг, вызовы инструментов, рассуждения и изображения в обе стороны. Никаких патчей на стороне клиента.', 'opencodex は 1 つのポートで Codex と Claude Code をまとめて提供するローカルプロキシです — 各 wire フォーマットを任意のプロバイダーへ双方向に変換し、ストリーミング・ツール呼び出し・推論・画像までそのまま通します。クライアントのパッチは不要です。', 'opencodex 是一個本機代理,用同一個連接埠同時服務 Codex 與 Claude Code —— 將各自的線路格式雙向翻譯為任意供應商,支援流式、工具呼叫、推理與圖像。無需修補用戶端。', 'opencodex, Codex ve Claude Code’u tek bir port üzerinden sunan yerel bir proxy’dir — her bir hat formatını dilediğiniz sağlayıcıya dönüştürür; akış (streaming), araç çağrıları (tool calls), akıl yürütme (reasoning) ve görseller her iki yönde de sorunsuz iletilir. İstemci tarafında sıfır yama.')}

    {providers.map((p) => ( @@ -252,6 +285,55 @@ const docsMap = [
+ +
+

{t('Download OpenCodex', 'OpenCodex 다운로드', '下载 OpenCodex', 'Скачать OpenCodex', 'OpenCodex をダウンロード', '下載 OpenCodex', 'OpenCodex’u İndirin')}

+

{t('The desktop app bundles the proxy, the dashboard and a tray. Beta.', '데스크톱 앱 하나에 프록시, 대시보드, 트레이까지. 베타입니다.', '桌面应用集成了代理、控制台与托盘。Beta 版。', 'Десктопное приложение объединяет прокси, дашборд и трей. Бета.', 'デスクトップアプリにはプロキシ、ダッシュボード、トレイが同梱されています。ベータ版です。', '桌面應用整合了代理、儀表板與系統匣。Beta 版。', 'Masaüstü uygulaması proxy’yi, kontrol panelini ve tepsi simgesini bir araya getirir. Beta.')}

+

+
+
+ +

macOS

+

{t('Universal · Apple Silicon and Intel · macOS 13+ · .dmg', '유니버설 · Apple Silicon 및 Intel · macOS 13+ · .dmg', 'Universal · Apple Silicon 与 Intel · macOS 13+ · .dmg', 'Universal · Apple Silicon и Intel · macOS 13+ · .dmg', 'ユニバーサル · Apple Silicon と Intel · macOS 13+ · .dmg', 'Universal · Apple Silicon 與 Intel · macOS 13+ · .dmg', 'Evrensel · Apple Silicon ve Intel · macOS 13+ · .dmg')}

+ +

{t('Recommended for your system', '내 시스템에 추천', '推荐用于您的系统', 'Рекомендуется для вашей системы', 'お使いのシステムにおすすめ', '推薦用於您的系統', 'Sisteminiz için önerilir')}

+
+
+ +

Windows

+

x64 · .msi

+

{t('Installer not code-signed yet', '아직 코드 서명되지 않은 설치 프로그램', '安装程序尚未进行代码签名', 'Установщик пока не имеет цифровой подписи', 'インストーラーはまだコード署名されていません', '安裝程式尚未進行程式碼簽署', 'Yükleyici henüz kod imzalı değil')}

+ +

{t('Recommended for your system', '내 시스템에 추천', '推荐用于您的系统', 'Рекомендуется для вашей системы', 'お使いのシステムにおすすめ', '推薦用於您的系統', 'Sisteminiz için önerilir')}

+
+
+ +

Linux

+

x86_64 · .AppImage

+ +

{t('Recommended for your system', '내 시스템에 추천', '推荐用于您的系统', 'Рекомендуется для вашей системы', 'お使いのシステムにおすすめ', '推薦用於您的系統', 'Sisteminiz için önerilir')}

+
+
+

+ {t('Prefer the terminal?', '터미널이 더 편하다면', '更喜欢终端?', 'Предпочитаете терминал?', 'ターミナル派ですか?', '偏好終端機?', 'Terminali mi tercih edersiniz?')} + npm install -g @bitkyc08/opencodex + {t('Installation guide', '설치 가이드', '安装指南', 'Руководство по установке', 'インストールガイド', '安裝指南', 'Kurulum kılavuzu')} + {t('All releases and checksums', '전체 릴리스와 체크섬', '所有版本与校验和', 'Все релизы и контрольные суммы', 'すべてのリリースとチェックサム', '所有版本與校驗碼', 'Tüm sürümler ve sağlama toplamları')} + {t('Desktop app guide', '데스크톱 앱 가이드', '桌面应用指南', 'Руководство по приложению', 'デスクトップアプリガイド', '桌面應用程式指南', 'Masaüstü uygulaması kılavuzu')} +

+
+
@@ -440,3 +522,59 @@ const docsMap = [ }, { rootMargin: '100% 0px' }).observe(section); } + + diff --git a/docs-site/src/styles/custom.css b/docs-site/src/styles/custom.css index ddd7b5e4a44..e9a1f6a72f8 100644 --- a/docs-site/src/styles/custom.css +++ b/docs-site/src/styles/custom.css @@ -314,6 +314,42 @@ main:has(.lp) .content-panel:first-child { padding-block: 0; } align-items: center; text-align: center; } +/* announcement pill over the headline: same chrome as the provider chips, + emphasis via the filled tag segment — no capsule borders on children */ +.lp-announce { + display: inline-flex; + align-items: center; + gap: 0.5rem; + margin-bottom: 1.25rem; + padding: 0.35rem 0.9rem; + border-radius: var(--ocx-radius-pill); + border: 0; + background-color: rgba(255, 255, 255, 0.95); + color: #1a1a1a; + font-size: var(--sl-text-sm); + font-weight: 500; + text-decoration: none; + white-space: nowrap; + max-width: 100%; + box-shadow: 0 1px 6px rgba(0, 0, 0, 0.06); +} +.lp-announce svg { flex: none; opacity: 0.7; } +:root[data-theme='dark'] .lp-announce, +:root:not([data-theme='light']) .lp-announce { background-color: rgba(255, 255, 255, 0.94); } +.lp-announce-tag { + padding: 0.1rem 0.55rem; + border-radius: var(--ocx-radius-pill); + background-color: #e08b6d; + color: #ffffff; + font-size: var(--sl-text-2xs); + font-weight: 650; + letter-spacing: 0.02em; +} +.lp-announce:focus-visible, +.lp-download a:focus-visible { + outline: 2px solid light-dark(#2f6fe4, #8ab0f5); + outline-offset: 2px; +} .lp-hero-copy h1 { margin: 0; font-size: clamp(2.25rem, 5.5vw, 4rem); @@ -784,6 +820,163 @@ main:has(.lp) .content-panel:first-child { padding-block: 0; } max-width: 64ch; } +/* ---- download sheet ------------------------------------------------------- + Opaque sheet in the scene stack (same surface as .lp-quick) so it covers + the pinned hero while scrolling by. Cards reuse the bento cell chrome; + the recommended card keeps the same radius and gets an accent tint. */ +.lp-download { + padding: clamp(2rem, 6vh, 4rem) clamp(1.25rem, 4vw, 3.5rem); + border: 1px solid var(--sl-color-hairline-light); + border-radius: 24px; + background-color: var(--ocx-surface); + scroll-margin-top: calc(var(--sl-nav-height) + 1rem); +} +.lp-download-title { + margin: 0; + font-size: var(--sl-text-3xl); + font-weight: 650; + line-height: 1.15; + color: var(--sl-color-white); + text-wrap: balance; +} +.lp-download-sub { + margin: 0.625rem 0 0; + color: var(--sl-color-gray-3); + line-height: 1.6; +} +.lp-download-version { + margin: 0.375rem 0 0; + min-height: 1.25rem; + font-family: var(--sl-font-mono); + font-size: var(--sl-text-xs); + color: var(--sl-color-gray-4); +} +.lp-dl-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 0.875rem; + margin-top: 1.25rem; +} +@media (max-width: 48rem) { .lp-dl-grid { grid-template-columns: 1fr; } } +.lp-dl-card { + position: relative; + display: flex; + flex-direction: column; + gap: 0.5rem; + padding: 1.25rem 1.375rem; + border: 1px solid var(--sl-color-gray-5); + border-radius: var(--ocx-radius); + background-color: var(--ocx-raised); + min-width: 0; +} +.lp-dl-card[data-recommended] { + border-color: light-dark(#2f6fe4, #8ab0f5); + background-color: color-mix(in srgb, light-dark(#2f6fe4, #8ab0f5) 8%, var(--ocx-raised)); +} +.lp-dl-mark { width: 28px; height: 28px; color: var(--sl-color-white); } +.lp-dl-card h3 { + margin: 0; + font-size: var(--sl-text-base); + font-weight: 650; + color: var(--sl-color-white); +} +.lp-dl-meta, +.lp-dl-note { + margin: 0; + font-size: var(--sl-text-sm); + line-height: 1.55; + color: var(--sl-color-gray-3); +} +.lp-dl-note { color: var(--sl-color-gray-4); font-size: var(--sl-text-xs); } +/* Actions (primary button + secondary links) pin to the card bottom so the + three buttons share one baseline regardless of per-card copy length. */ +.lp-dl-actions { + display: flex; + flex-direction: column; + gap: 0.5rem; + margin-top: auto; + padding-top: 0.625rem; +} +.lp-dl-btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + min-height: 44px; + padding: 0.55rem 1.25rem; + border: 1px solid transparent; + border-radius: var(--ocx-radius-pill); + background-color: var(--sl-color-accent-high); + color: var(--sl-color-text-invert); + font-weight: 500; + font-size: var(--sl-text-sm); + font-family: var(--sl-font); + text-decoration: none; + white-space: nowrap; +} +.lp-dl-btn-icon { width: 16px; height: 16px; flex: none; } +.lp-dl-btn-fmt { font-weight: 400; opacity: 0.72; } +/* Once one card is flagged recommended, the other cards demote to a + secondary hairline button. With no flag (JS off, unknown platform) + every button keeps the primary fill. */ +.lp-download:has(.lp-dl-card[data-recommended]) .lp-dl-card:not([data-recommended]) .lp-dl-btn { + background-color: transparent; + border-color: var(--sl-color-gray-5); + color: var(--sl-color-white); +} +.lp-dl-links { + display: inline-flex; + align-items: baseline; + gap: 0.25rem; + font-size: var(--sl-text-xs); +} +.lp-dl-sep { color: var(--sl-color-gray-4); } +.lp-dl-alt, +.lp-dl-sha { + font-size: var(--sl-text-xs); + color: light-dark(#2f6fe4, #8ab0f5); + text-decoration: none; +} +.lp-dl-sha { font-family: var(--sl-font-mono); } +.lp-dl-alt:hover, +.lp-dl-sha:hover { text-decoration: underline; text-underline-offset: 3px; } +.lp-dl-reco { + display: none; + position: absolute; + top: 1rem; + right: 1.25rem; + margin: 0; + padding: 0.2rem 0.6rem; + border-radius: var(--ocx-radius-pill); + background-color: color-mix(in srgb, light-dark(#2f6fe4, #8ab0f5) 14%, transparent); + font-size: var(--sl-text-xs); + font-weight: 500; + color: light-dark(#2f6fe4, #8ab0f5); +} +.lp-dl-card[data-recommended] .lp-dl-reco { display: block; } +.lp-dl-foot { + margin: 1.5rem 0 0; + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.375rem 1rem; + font-size: var(--sl-text-sm); + color: var(--sl-color-gray-3); +} +.lp-dl-foot code { + font-family: var(--sl-font-mono); + font-size: var(--sl-text-xs); + padding: 0.15rem 0.5rem; + border-radius: var(--ocx-radius-sm); + background-color: var(--sl-color-bg-inline-code); + color: var(--sl-color-white); +} +.lp-dl-foot a { + color: light-dark(#2f6fe4, #8ab0f5); + text-decoration: none; +} +.lp-dl-foot a:hover { text-decoration: underline; text-underline-offset: 3px; } + /* ---- footer --------------------------------------------------------------- */ footer.sl-flex .meta { color: var(--sl-color-gray-4); } @@ -832,9 +1025,13 @@ footer.sl-flex .meta { color: var(--sl-color-gray-4); } } .lp-btn-primary, .lp-btn-ghost { transition: transform 0.15s, opacity 0.15s, border-color 0.15s; } .lp-btn-primary:hover, .lp-btn-ghost:hover { transform: translateY(-1px); } + .lp-dl-btn, .lp-announce { transition: transform 0.15s, opacity 0.15s, border-color 0.15s; } + .lp-dl-btn:hover, .lp-announce:hover { transform: translateY(-1px); } /* quiet below-scene reveals (sections after the scene stack) */ @supports (animation-timeline: view()) { + .lp-download-title, + .lp-dl-grid, .lp-bento-title, .lp-next h2, .lp-next-grid, From fa96d5cb80c6d82939942fac0ea6d958612af531 Mon Sep 17 00:00:00 2001 From: JUN Date: Wed, 23 Sep 2026 13:46:06 +0900 Subject: [PATCH 04/11] fix: address review on desktop download surfaces Split the local desktop build into macOS and Windows/Linux sequences, give the .deb its own checksum link, skip the Linux recommendation on ARM, let the launch pill wrap on narrow screens, raise the New tag contrast, and keep the recommendation badge in card flow. --- README.md | 7 ++++--- docs-site/src/components/Landing.astro | 25 ++++++++++++++++++++++--- docs-site/src/styles/custom.css | 23 ++++++++++++++++------- readme/README.fr.md | 7 ++++--- readme/README.ja.md | 2 +- readme/README.ko.md | 2 +- readme/README.ru.md | 7 ++++--- readme/README.tr.md | 5 +++-- readme/README.zh-CN.md | 2 +- readme/README.zh-TW.md | 2 +- readme/i18n-manifest.json | 14 +++++++------- 11 files changed, 64 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 670bd76e9c4..3e994459a57 100644 --- a/README.md +++ b/README.md @@ -106,9 +106,10 @@ platform from the [latest release](https://github.com/lidge-jun/opencodex/releas Every file has a `.sha256` next to it on the release page. On macOS 14+ the app also ships a WidgetKit extension that shows proxy status, today's usage and provider quotas; the snapshot model it renders lives in [`app/`](./app) (`MenuBarCore`). To build the app yourself, run -`bun install && bun run build:gui` at the repository root, then -`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` in -`desktop/`. The [Desktop App guide](https://opencodex.me/guides/desktop-app/) and the +`bun install && bun run build:gui` at the repository root, then in `desktop/` run +`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` on macOS, +or `bun install && bun run prepare-sidecar && bun run build:local` on Windows and Linux (the widget +step needs macOS). The [Desktop App guide](https://opencodex.me/guides/desktop-app/) and the [macOS Menu Bar App guide](https://opencodex.me/guides/macos-menu-bar/) cover first launch, and [`AGENTS_INSTALL.md`](./AGENTS_INSTALL.md#where-things-are-installed) lists everything written to disk. diff --git a/docs-site/src/components/Landing.astro b/docs-site/src/components/Landing.astro index 826d6515e74..6c7e46fffee 100644 --- a/docs-site/src/components/Landing.astro +++ b/docs-site/src/components/Landing.astro @@ -235,7 +235,7 @@ const docsMap = [
{t('New', '새로 출시', '新', 'Новое', 'New', '新', 'Yeni')} - {t('Desktop app beta for macOS, Windows and Linux', 'macOS·Windows·Linux 데스크톱 앱 베타', 'macOS、Windows 与 Linux 桌面应用 Beta', 'Бета десктопного приложения для macOS, Windows и Linux', 'macOS・Windows・Linux 向けデスクトップアプリ ベータ', 'macOS、Windows 與 Linux 桌面應用程式 Beta', 'macOS, Windows ve Linux için masaüstü uygulaması beta')} + {t('Desktop app beta for macOS, Windows and Linux', 'macOS, Windows, Linux용 데스크톱 앱 베타', 'macOS、Windows 与 Linux 桌面应用 Beta', 'Бета десктопного приложения для macOS, Windows и Linux', 'macOS・Windows・Linux 向けデスクトップアプリ ベータ', 'macOS、Windows 與 Linux 桌面應用程式 Beta', 'macOS, Windows ve Linux için masaüstü uygulaması beta')} {/* Product-word drum: the H1 performs the claim — the proxy serves both @@ -320,7 +320,7 @@ const docsMap = [

x86_64 · .AppImage

{t('Recommended for your system', '내 시스템에 추천', '推荐用于您的系统', 'Рекомендуется для вашей системы', 'お使いのシステムにおすすめ', '推薦用於您的系統', 'Sisteminiz için önerilir')}

@@ -543,7 +543,7 @@ const docsMap = [ : /linux|x11/i.test(uaPlatform) ? 'linux' : ''; - if (platform) { + const recommend = (platform: string) => { const heroLabel = document.getElementById('lp-hero-download-label'); const heroBtn = document.getElementById('lp-hero-download'); const label = heroBtn?.dataset[`label${platform[0].toUpperCase()}${platform.slice(1)}`]; @@ -551,6 +551,24 @@ const docsMap = [ document .querySelector(`.lp-dl-card[data-platform="${platform}"]`) ?.setAttribute('data-recommended', ''); + }; + // Linux builds are x86_64 only, so an ARM Linux desktop gets no recommendation. + // Chromium freezes the Linux user agent to "x86_64", so its architecture hint + // wins when present; other browsers report the real machine in the user agent. + const uaData = (navigator as Navigator & { + userAgentData?: { getHighEntropyValues?: (hints: string[]) => Promise<{ architecture?: string }> }; + }).userAgentData; + if (platform === 'linux') { + if (uaData?.getHighEntropyValues) { + uaData + .getHighEntropyValues(['architecture']) + .then((hints) => { if (hints.architecture === 'x86') recommend('linux'); }) + .catch(() => {}); + } else if (/x86_64|amd64|x64/i.test(navigator.userAgent)) { + recommend('linux'); + } + } else if (platform) { + recommend(platform); } fetch('https://api.github.com/repos/lidge-jun/opencodex/releases/latest') .then((res) => (res.ok ? res.json() : Promise.reject(res.status))) @@ -563,6 +581,7 @@ const docsMap = [ appimage: /-linux-x86_64\.AppImage$/, 'appimage.sha256': /-linux-x86_64\.AppImage\.sha256$/, deb: /-linux-amd64\.deb$/, + 'deb.sha256': /-linux-amd64\.deb\.sha256$/, }; for (const asset of release.assets ?? []) { const key = Object.keys(patterns).find((k) => asset.name && patterns[k].test(asset.name)); diff --git a/docs-site/src/styles/custom.css b/docs-site/src/styles/custom.css index e9a1f6a72f8..1b8da569be4 100644 --- a/docs-site/src/styles/custom.css +++ b/docs-site/src/styles/custom.css @@ -329,18 +329,22 @@ main:has(.lp) .content-panel:first-child { padding-block: 0; } font-size: var(--sl-text-sm); font-weight: 500; text-decoration: none; - white-space: nowrap; + text-wrap: balance; max-width: 100%; box-shadow: 0 1px 6px rgba(0, 0, 0, 0.06); } +@media (max-width: 30rem) { + .lp-announce { border-radius: 1.1rem; text-align: left; line-height: 1.35; } +} .lp-announce svg { flex: none; opacity: 0.7; } :root[data-theme='dark'] .lp-announce, :root:not([data-theme='light']) .lp-announce { background-color: rgba(255, 255, 255, 0.94); } .lp-announce-tag { + flex: none; padding: 0.1rem 0.55rem; border-radius: var(--ocx-radius-pill); background-color: #e08b6d; - color: #ffffff; + color: #1a1a1a; font-size: var(--sl-text-2xs); font-weight: 650; letter-spacing: 0.02em; @@ -925,11 +929,17 @@ main:has(.lp) .content-panel:first-child { padding-block: 0; } color: var(--sl-color-white); } .lp-dl-links { - display: inline-flex; + display: flex; + flex-wrap: wrap; align-items: baseline; - gap: 0.25rem; + gap: 0.2rem 0.75rem; + /* two lines reserved in every card so the download buttons share one row */ + line-height: 1.5; + min-height: calc(3em + 0.2rem); font-size: var(--sl-text-xs); } +.lp-dl-links > a { white-space: nowrap; } +.lp-announce-text { min-width: 0; word-break: keep-all; overflow-wrap: anywhere; } .lp-dl-sep { color: var(--sl-color-gray-4); } .lp-dl-alt, .lp-dl-sha { @@ -942,9 +952,8 @@ main:has(.lp) .content-panel:first-child { padding-block: 0; } .lp-dl-sha:hover { text-decoration: underline; text-underline-offset: 3px; } .lp-dl-reco { display: none; - position: absolute; - top: 1rem; - right: 1.25rem; + order: -1; + align-self: flex-start; margin: 0; padding: 0.2rem 0.6rem; border-radius: var(--ocx-radius-pill); diff --git a/readme/README.fr.md b/readme/README.fr.md index 69a05cf3daf..6e760f0655b 100644 --- a/readme/README.fr.md +++ b/readme/README.fr.md @@ -108,9 +108,10 @@ Chaque fichier est accompagné d'un `.sha256` sur la page de la version. Sous ma également une extension WidgetKit qui affiche l'état du proxy, l'utilisation du jour et les quotas des fournisseurs ; le modèle de données des instantanés qu'elle affiche se trouve dans [`app/`](../app) (`MenuBarCore`). Pour compiler l'application vous-même, exécutez -`bun install && bun run build:gui` à la racine du dépôt, puis -`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` dans -`desktop/`. Le [guide de l'application de bureau](https://opencodex.me/fr/guides/desktop-app/) et le +`bun install && bun run build:gui` à la racine du dépôt, puis, dans `desktop/`, +`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` sous macOS, +ou `bun install && bun run prepare-sidecar && bun run build:local` sous Windows et Linux (l'étape du widget +exige macOS). Le [guide de l'application de bureau](https://opencodex.me/fr/guides/desktop-app/) et le [guide de l'application macOS dans la barre des menus](https://opencodex.me/fr/guides/macos-menu-bar/) détaillent le premier lancement, et [`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed) répertorie tout ce qui est écrit sur le disque. diff --git a/readme/README.ja.md b/readme/README.ja.md index a50ea2ea3a6..5383ac67f24 100644 --- a/readme/README.ja.md +++ b/readme/README.ja.md @@ -107,7 +107,7 @@ Desktop、Grok Build から使えます。Codex 認証用の **ChatGPT アカウ 今日の使用量、プロバイダーのクォータを表示する WidgetKit 拡張も付属します。表示に使う スナップショットモデルは [`app/`](../app)(`MenuBarCore`)にあります。アプリを自分でビルドするには、 リポジトリのルートで `bun install && bun run build:gui` を実行し、 -`desktop/` で `bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` を実行します。 +`desktop/` で macOS なら `bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local`、Windows と Linux なら `bun install && bun run prepare-sidecar && bun run build:local` を実行します(ウィジェットの手順は macOS 専用です)。 [デスクトップアプリガイド](https://opencodex.me/ja/guides/desktop-app/)と [macOS メニューバーアプリガイド](https://opencodex.me/ja/guides/macos-menu-bar/)で初回起動について説明しています。 [`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed) にはディスクに書き込まれるすべてのものをまとめています。 diff --git a/readme/README.ko.md b/readme/README.ko.md index 7e0688365e5..3b52191e77c 100644 --- a/readme/README.ko.md +++ b/readme/README.ko.md @@ -107,7 +107,7 @@ DeepSeek, Kimi, Qwen, Ollama를 비롯한 어떤 LLM이든 Codex, Claude Code, C 오늘의 사용량, 프로바이더 쿼터를 보여 주는 WidgetKit 확장도 함께 설치됩니다. 위젯이 그리는 스냅샷 모델은 [`app/`](../app)의 `MenuBarCore`에 있습니다. 앱을 직접 빌드하려면 저장소 루트에서 `bun install && bun run build:gui`를 실행한 다음, -`desktop/`에서 `bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local`을 실행하세요. +`desktop/`에서 macOS라면 `bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local`을, Windows와 Linux라면 `bun install && bun run prepare-sidecar && bun run build:local`을 실행하세요. 위젯 빌드 단계는 macOS에서만 돌아갑니다. [데스크톱 앱 가이드](https://opencodex.me/ko/guides/desktop-app/)와 [macOS 메뉴 막대 앱 가이드](https://opencodex.me/ko/guides/macos-menu-bar/)에서 첫 실행 안내를 볼 수 있고, [`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed)에는 디스크에 쓰는 모든 항목이 정리되어 있습니다. diff --git a/readme/README.ru.md b/readme/README.ru.md index d676a16cb11..294e05b192a 100644 --- a/readme/README.ru.md +++ b/readme/README.ru.md @@ -110,9 +110,10 @@ Ollama или любую другую LLM с Codex, Claude Code, Claude Desktop поставляется с расширением WidgetKit, которое показывает состояние прокси, расход за сегодня и квоты провайдеров; модель снимков, которую оно отображает, находится в [`app/`](../app) (`MenuBarCore`). Чтобы собрать приложение самостоятельно, выполните -`bun install && bun run build:gui` в корне репозитория, затем -`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` в -`desktop/`. В [руководстве по настольному приложению](https://opencodex.me/ru/guides/desktop-app/) и +`bun install && bun run build:gui` в корне репозитория, затем в `desktop/` выполните +`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` на macOS +или `bun install && bun run prepare-sidecar && bun run build:local` на Windows и Linux (шаг с виджетом +работает только на macOS). В [руководстве по настольному приложению](https://opencodex.me/ru/guides/desktop-app/) и [руководстве по приложению macOS в строке меню](https://opencodex.me/ru/guides/macos-menu-bar/) описан первый запуск, а [`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed) перечисляет всё, что записывается на диск. diff --git a/readme/README.tr.md b/readme/README.tr.md index 28a8cc74cdf..e73663c46e5 100644 --- a/readme/README.tr.md +++ b/readme/README.tr.md @@ -107,8 +107,9 @@ başlatır; kontrol paneli proxy bağlantı noktasında kalır (başka bir tane Her dosyanın yanında sürüm sayfasında bir `.sha256` bulunur. macOS 14 ve üzerinde uygulama ayrıca proxy durumunu, bugünkü kullanımı ve sağlayıcı kotalarını gösteren bir WidgetKit uzantısıyla gelir; görüntülediği anlık görüntü modeli [`app/`](../app) dizinindedir (`MenuBarCore`). Uygulamayı kendiniz -derlemek için depo kökünde `bun install && bun run build:gui`, ardından `desktop/` içinde -`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local` çalıştırın. +derlemek için depo kökünde `bun install && bun run build:gui`, ardından `desktop/` içinde macOS'ta +`bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local`, +Windows ve Linux'ta ise `bun install && bun run prepare-sidecar && bun run build:local` çalıştırın (widget adımı yalnızca macOS'ta çalışır). [Masaüstü uygulaması kılavuzu](https://opencodex.me/tr/guides/desktop-app/) ve [macOS menü çubuğu uygulaması kılavuzu](https://opencodex.me/tr/guides/macos-menu-bar/) ilk açılışı anlatır; [`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed) diske yazılan her diff --git a/readme/README.zh-CN.md b/readme/README.zh-CN.md index 107989792c5..66a5ac1a4d3 100644 --- a/readme/README.zh-CN.md +++ b/readme/README.zh-CN.md @@ -106,7 +106,7 @@ Codex 认证管理一个 **ChatGPT 账户池**:添加账户,在仪表板中 WidgetKit 扩展,可显示代理状态、今日用量和提供商配额;它所呈现的快照模型位于 [`app/`](../app)(`MenuBarCore`)。如需自行构建应用,先在仓库根目录运行 `bun install && bun run build:gui`,然后在 -`desktop/` 中运行 `bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local`。 +`desktop/` 中运行:macOS 上用 `bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local`,Windows 和 Linux 上用 `bun install && bun run prepare-sidecar && bun run build:local`(小组件步骤只能在 macOS 上执行)。 [桌面应用指南](https://opencodex.me/zh-cn/guides/desktop-app/)和 [macOS 菜单栏应用指南](https://opencodex.me/zh-cn/guides/macos-menu-bar/)介绍了首次启动, [`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed)列出了写入磁盘的所有内容。 diff --git a/readme/README.zh-TW.md b/readme/README.zh-TW.md index 0642685e939..11901c3ffd3 100644 --- a/readme/README.zh-TW.md +++ b/readme/README.zh-TW.md @@ -105,7 +105,7 @@ Gemini、Grok、GLM、DeepSeek、Kimi、Qwen、Ollama 或任何其他 LLM。它 WidgetKit 擴充套件,可顯示代理狀態、今日用量與供應商配額;它所呈現的快照模型位於 [`app/`](../app)(`MenuBarCore`)。若要自行建置應用程式,先在儲存庫根目錄執行 `bun install && bun run build:gui`,再於 -`desktop/` 執行 `bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local`。 +`desktop/` 執行:macOS 上用 `bun install && bun run prepare-sidecar && bun run prepare-widget && bun run build:local`,Windows 與 Linux 上用 `bun install && bun run prepare-sidecar && bun run build:local`(小工具步驟只能在 macOS 上執行)。 [桌面應用程式指南](https://opencodex.me/zh-tw/guides/desktop-app/) 與 [macOS 選單列應用程式指南](https://opencodex.me/zh-tw/guides/macos-menu-bar/) 涵蓋首次啟動, [`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md#where-things-are-installed) 列出所有寫入磁碟的內容。 diff --git a/readme/i18n-manifest.json b/readme/i18n-manifest.json index 558cb2261ab..2eeb1c5380f 100644 --- a/readme/i18n-manifest.json +++ b/readme/i18n-manifest.json @@ -6,43 +6,43 @@ "file": "readme/README.fr.md", "label": "Français", "docsPath": "fr", - "sourceSha256": "d755ec5a3d2ea4978e17ddd10910f7d464ee32132a332226fbf8083d64b9b240" + "sourceSha256": "7a0520543cabc7c07d1f2ee9b55098c853bb1aeaab45d6c41627d3652efbd530" }, "ko": { "file": "readme/README.ko.md", "label": "한국어", "docsPath": "ko", - "sourceSha256": "d755ec5a3d2ea4978e17ddd10910f7d464ee32132a332226fbf8083d64b9b240" + "sourceSha256": "7a0520543cabc7c07d1f2ee9b55098c853bb1aeaab45d6c41627d3652efbd530" }, "zh-CN": { "file": "readme/README.zh-CN.md", "label": "简体中文", "docsPath": "zh-cn", - "sourceSha256": "d755ec5a3d2ea4978e17ddd10910f7d464ee32132a332226fbf8083d64b9b240" + "sourceSha256": "7a0520543cabc7c07d1f2ee9b55098c853bb1aeaab45d6c41627d3652efbd530" }, "zh-TW": { "file": "readme/README.zh-TW.md", "label": "繁體中文", "docsPath": "zh-tw", - "sourceSha256": "d755ec5a3d2ea4978e17ddd10910f7d464ee32132a332226fbf8083d64b9b240" + "sourceSha256": "7a0520543cabc7c07d1f2ee9b55098c853bb1aeaab45d6c41627d3652efbd530" }, "ru": { "file": "readme/README.ru.md", "label": "Русский", "docsPath": "ru", - "sourceSha256": "d755ec5a3d2ea4978e17ddd10910f7d464ee32132a332226fbf8083d64b9b240" + "sourceSha256": "7a0520543cabc7c07d1f2ee9b55098c853bb1aeaab45d6c41627d3652efbd530" }, "ja": { "file": "readme/README.ja.md", "label": "日本語", "docsPath": "ja", - "sourceSha256": "d755ec5a3d2ea4978e17ddd10910f7d464ee32132a332226fbf8083d64b9b240" + "sourceSha256": "7a0520543cabc7c07d1f2ee9b55098c853bb1aeaab45d6c41627d3652efbd530" }, "tr": { "file": "readme/README.tr.md", "label": "Türkçe", "docsPath": "tr", - "sourceSha256": "d755ec5a3d2ea4978e17ddd10910f7d464ee32132a332226fbf8083d64b9b240" + "sourceSha256": "7a0520543cabc7c07d1f2ee9b55098c853bb1aeaab45d6c41627d3652efbd530" } } } From 071ad7dc8d388eb3c21fcbcbd1ba459ba3d6744b Mon Sep 17 00:00:00 2001 From: JUN Date: Wed, 23 Sep 2026 13:46:33 +0900 Subject: [PATCH 05/11] fix(docs-site): do not recommend the dmg to iPadOS in desktop mode --- docs-site/src/components/Landing.astro | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs-site/src/components/Landing.astro b/docs-site/src/components/Landing.astro index 6c7e46fffee..485c8ade999 100644 --- a/docs-site/src/components/Landing.astro +++ b/docs-site/src/components/Landing.astro @@ -533,7 +533,9 @@ const docsMap = [ .userAgentData?.platform || navigator.userAgent || ''; // Phones, tablets and ChromeOS cannot run the desktop builds; iOS user agents // also say "like Mac OS X", so they are ruled out before the desktop tests. - const handheld = /iphone|ipad|ipod|android|cros|mobile/i.test(`${uaPlatform} ${navigator.userAgent}`); + // iPadOS in desktop mode reports a Mac user agent; a touch screen gives it away. + const handheld = /iphone|ipad|ipod|android|cros|mobile/i.test(`${uaPlatform} ${navigator.userAgent}`) + || (/mac/i.test(uaPlatform) && navigator.maxTouchPoints > 1); const platform = handheld ? '' : /mac/i.test(uaPlatform) From 63dd420c73b063a82442c1d39297a08e8a57718b Mon Sep 17 00:00:00 2001 From: JUN Date: Wed, 23 Sep 2026 13:48:13 +0900 Subject: [PATCH 06/11] fix(docs-site): break Korean landing copy between words only --- docs-site/src/styles/custom.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs-site/src/styles/custom.css b/docs-site/src/styles/custom.css index 1b8da569be4..0a2a878c829 100644 --- a/docs-site/src/styles/custom.css +++ b/docs-site/src/styles/custom.css @@ -939,7 +939,10 @@ main:has(.lp) .content-panel:first-child { padding-block: 0; } font-size: var(--sl-text-xs); } .lp-dl-links > a { white-space: nowrap; } -.lp-announce-text { min-width: 0; word-break: keep-all; overflow-wrap: anywhere; } +.lp-announce-text { min-width: 0; } +/* Korean breaks between words; Japanese and Chinese keep per-character breaks. */ +html:lang(ko) .lp-announce-text, +html:lang(ko) .lp-download { word-break: keep-all; overflow-wrap: break-word; } .lp-dl-sep { color: var(--sl-color-gray-4); } .lp-dl-alt, .lp-dl-sha { From c6819b6fc0a755fb81e97e79ba415fe88194fff4 Mon Sep 17 00:00:00 2001 From: JUN Date: Wed, 23 Sep 2026 13:59:30 +0900 Subject: [PATCH 07/11] docs-site: focus the landing download on the detected platform The launch pill is one line (Desktop beta), the download section shows only the detected platform card with the others in an Other platforms disclosure, and the SHA-256 links are gone. Undetected platforms and no-JS keep all three cards. --- .../260923_desktop_download_focus/000_plan.md | 57 ++++++++++++++ docs-site/src/components/Landing.astro | 32 ++++---- docs-site/src/styles/custom.css | 78 +++++++++++-------- 3 files changed, 121 insertions(+), 46 deletions(-) create mode 100644 devlog/_plan/260923_desktop_download_focus/000_plan.md diff --git a/devlog/_plan/260923_desktop_download_focus/000_plan.md b/devlog/_plan/260923_desktop_download_focus/000_plan.md new file mode 100644 index 00000000000..9977a52de13 --- /dev/null +++ b/devlog/_plan/260923_desktop_download_focus/000_plan.md @@ -0,0 +1,57 @@ +# Desktop download focus — landing refinement for PR #5638 + +The landing page's download section showed all three platform cards at once, with SHA-256 links and a long launch pill that wrapped on phones. This unit keeps the page focused on the visitor's own platform: the pill becomes a one-line "Desktop beta" link, the section shows only the detected platform's card with the other two behind an "Other platforms" disclosure, and the checksum links are removed (the footer's "All releases and checksums" stays). Visitors with no detectable desktop platform, or without JavaScript, still see all three cards. + +## Loop spec + +- Loop archetype: satisfy-spec, single work-phase (wp1), C2 frontend slice. +- Trigger: user steering on PR #5638 — "one line Desktop beta; show only the matching box per platform with a More dropdown; remove SHA-256 text" under cxc-loop HOTL. +- Goal: the three requirements above, shipped on dev through PR #5638. +- Non-goals: README and readme/ locales (GitHub cannot detect a platform), src/, gui/, desktop/, release tooling, any other PR. +- Verifier: `cd docs-site && bun run build` (exit 0; runs the opencodex-internal-links integration over the rendered Landing on all 8 locales, so it reads this change); focused `bun test tests/ci-workflows/{docs-readme-translation-parity,repo-hygiene,docs-link-targets,install-scripts,file-size-ratchet}.test.ts` (reads README/locales/package files; the size ratchet scans custom.css under the default 2000-line cap, currently 1109 lines, while Landing.astro is not scanned; none of these observe the landing behaviour); `bun run privacy:scan`. Landing behaviour has no automated test, so it is observed in headless Chrome (agbrowse on CDP 9333) against `astro preview`: detected macOS UA (1440 light/dark), forced unknown platform (all three cards, disclosure hidden), 320px/390px pill on one line, disclosure open state, no "SHA-256" text in `#download`, and `[data-lp-asset]` hrefs resolving to releases/download/v2.63.0/. +- Stop condition: criteria c-1..c-5 met with evidence and PR #5638 squash-merged into dev. +- Memory artifact: this unit (000_plan.md, 010_evidence.md), the bound goalplan, and the PR body. +- Expected terminal outcomes: DONE when merged with evidence; BLOCKED on a required CI failure caused by this change that cannot be fixed or a merge refusal; NEEDS_HUMAN on a product decision outside the three requirements. +- Escalation: swe-2 workers are resource-exhausted until about 14:10 KST; DISPATCH-RETIRE-01 — build falls back to main if the swe-2 packet fails again, recorded here. Resource bounds: repo write scope = the two files plus this unit; credentials = existing gh login; no token or time budget was set by the user. + +## Conditional paths and activation + +| Path | Activation in C | Observable effect | +|---|---|---| +| recommend(platform) → collapse | default headless Chrome UA (Mac) | one card in `.lp-dl-grid`, `details.lp-dl-more` visible, 2 cards inside it | +| undetected fallback | headless Chrome launched with `--user-agent` set to an Android phone, `--dump-dom --virtual-time-budget` after scripts run; plus the no-JS HTML via curl | 3 cards in `.lp-dl-grid`, `details.lp-dl-more` still `hidden` | +| Windows detection | headless Chrome `--user-agent` Windows 11 desktop UA + `--dump-dom` | Windows card alone in `.lp-dl-grid`, 2 cards in `.lp-dl-more-grid`, hero label "Download for Windows" | +| iPadOS desktop mode | not observable: `--user-agent` cannot change `navigator.maxTouchPoints`; the branch is unchanged by this unit (added in 071ad7dc) | stated as unobserved | +| fr dictionary keys | `rg` on `docs-site/dist/fr/index.html` after build | contains "App de bureau bêta" and "Autres plateformes"; no "Bêta de l’app de bureau" | +| Linux arch gate | unchanged code; covered by the existing review-verified branch | n/a (no Linux host) — stated as unobserved | +| fetch failure | unchanged; hrefs default to releases/latest in curl HTML | curl shows releases/latest hrefs | + +## File change map + +`docs-site/src/components/Landing.astro` +- fr dict: remove 'New' and 'Desktop app beta for macOS, Windows and Linux'; add 'Desktop beta': 'App de bureau bêta', 'Other platforms': 'Autres plateformes'. +- Hero pill: drop `.lp-announce-tag`; text `t('Desktop beta', '데스크톱 베타', '桌面版 Beta', 'Бета для десктопа', 'デスクトップ版ベータ', '桌面版 Beta', 'Masaüstü beta')` + arrow. +- Cards: delete every `.lp-dl-sha` anchor and the `.lp-dl-links` wrappers on macOS and Windows. The Linux card keeps its `.deb` link AFTER the AppImage button inside `.lp-dl-actions` (visible text stays the existing t('.deb package') label), so keyboard focus reaches the primary button first. +- After `.lp-dl-grid`: ``. +- Script: recommend() also moves the non-recommended cards into `.lp-dl-more-grid` (null-safe) and removes `hidden` from the details; delete the four `*.sha256` patterns. + +`docs-site/src/styles/custom.css` +- `.lp-announce`: `white-space: nowrap`, drop `text-wrap: balance`, the <30rem override and `.lp-announce-tag`; drop the ko keep-all on `.lp-announce-text` (keep it for `.lp-download`). +- `.lp-dl-alt` gets `align-self: flex-start` (the actions column stretches children). Summary joins the focus-visible outline rule. +- Remove `.lp-dl-sha`, `.lp-dl-sep`, `.lp-dl-links` rules; when editing the shared selector lists keep the `.lp-dl-alt` colour and hover rules. `.lp-dl-actions` reserves one link line for every card (min-height = button + gap + one link line) so buttons share a row in the three-column fallback and the two-column disclosure. +- `.lp-download:has(.lp-dl-more:not([hidden])) .lp-dl-grid { grid-template-columns: minmax(0, 28rem); }`. +- `.lp-dl-more:not([hidden])` block, summary chevron (`list-style:none`, hide webkit marker, `::after` rotate on [open] inside the no-preference motion block), `.lp-dl-more-grid` two columns max 56rem, one column ≤48rem; summary added to the focus-visible outline rule. + +SoT sync: structure/ has no docs-site landing owner (checked in C with rg); the PR body is the record. + +## Architect consultation + +- Handle 01a0cc9b-10e4-76f0-9d6b-dd16dd3a8e5f; proposal D1–D8 plus a rejected CSS-only alternative (focus-order reason). +- Dispositions: D1 accept (summary label ko amended to "다른 플랫폼 더보기" to match the user's "더보기"); D2 accept; D3 accept; D4 accept; D5 accept; D6 accept; D7 accept as proposed (after reflection gap 1): the .deb link stays after the AppImage button and every card's actions reserve one link line; D8 accept. +- Reflection on revision 1: ALIGNED, D1-D8 mapped; four gaps, all folded into revision 2: (1) .deb link moved back after the button for focus order, visible label stated; (2) keep .lp-dl-alt colour/hover while deleting .lp-dl-sha from shared lists; (3) the unknown-platform path is exercised through a real UA override (Chrome --user-agent + --dump-dom) instead of script-stripped HTML; (4) verifier wording corrected — isScannedPath(custom.css)=true with THRESHOLD 2000, Landing.astro not scanned. +- SoT: structure/INDEX.md routes docs-site/ to structure/ops/docs-and-release.md; C checks whether it describes the landing download surface and patches it only if it does. + + +## Audit (A) + +- Reviewer 01a0cc9f: NEAR-PASS. Blockers folded in revision 3: (1) iPad desktop-mode row downgraded to unobserved with reason, Windows UA row added; (2) fr keys verified by grepping dist/fr/index.html, and callers of t('New') / the old pill key checked before deletion; (3) D7 disposition made consistent (link after the button, one-line reserve). Notes folded: .lp-dl-alt align-self, summary focus outline, open-state screenshot shows demoted buttons. diff --git a/docs-site/src/components/Landing.astro b/docs-site/src/components/Landing.astro index 485c8ade999..e917f7cd0d0 100644 --- a/docs-site/src/components/Landing.astro +++ b/docs-site/src/components/Landing.astro @@ -93,8 +93,8 @@ const fr = { 'Documentation map': 'Plan de la documentation', 'Explore the docs': 'Explorer la documentation', 'opencodex is an independent community project, not affiliated with or endorsed by OpenAI, Anthropic, or any other provider. Some providers may restrict accounts that route traffic through third-party proxies — review each provider’s Terms of Service before connecting.': 'opencodex est un projet communautaire indépendant, sans affiliation avec OpenAI, Anthropic ou tout autre fournisseur, et sans approbation de leur part. Certains fournisseurs peuvent restreindre les comptes qui acheminent leur trafic par des proxys tiers ; consultez les conditions d’utilisation de chaque fournisseur avant de vous connecter.', - 'New': 'Nouveau', - 'Desktop app beta for macOS, Windows and Linux': 'Bêta de l’app de bureau pour macOS, Windows et Linux', + 'Desktop beta': 'App de bureau bêta', + 'Other platforms': 'Autres plateformes', 'Download': 'Télécharger', 'Download for macOS': 'Télécharger pour macOS', 'Download for Windows': 'Télécharger pour Windows', @@ -234,8 +234,7 @@ const docsMap = [
- {t('New', '새로 출시', '新', 'Новое', 'New', '新', 'Yeni')} - {t('Desktop app beta for macOS, Windows and Linux', 'macOS, Windows, Linux용 데스크톱 앱 베타', 'macOS、Windows 与 Linux 桌面应用 Beta', 'Бета десктопного приложения для macOS, Windows и Linux', 'macOS・Windows・Linux 向けデスクトップアプリ ベータ', 'macOS、Windows 與 Linux 桌面應用程式 Beta', 'macOS, Windows ve Linux için masaüstü uygulaması beta')} + {t('Desktop beta', '데스크톱 베타', '桌面版 Beta', 'Бета для десктопа', 'デスクトップ版ベータ', '桌面版 Beta', 'Masaüstü beta')} {/* Product-word drum: the H1 performs the claim — the proxy serves both @@ -299,7 +298,6 @@ const docsMap = [

{t('Universal · Apple Silicon and Intel · macOS 13+ · .dmg', '유니버설 · Apple Silicon 및 Intel · macOS 13+ · .dmg', 'Universal · Apple Silicon 与 Intel · macOS 13+ · .dmg', 'Universal · Apple Silicon и Intel · macOS 13+ · .dmg', 'ユニバーサル · Apple Silicon と Intel · macOS 13+ · .dmg', 'Universal · Apple Silicon 與 Intel · macOS 13+ · .dmg', 'Evrensel · Apple Silicon ve Intel · macOS 13+ · .dmg')}

{t('Recommended for your system', '내 시스템에 추천', '推荐用于您的系统', 'Рекомендуется для вашей системы', 'お使いのシステムにおすすめ', '推薦用於您的系統', 'Sisteminiz için önerilir')}

@@ -310,7 +308,6 @@ const docsMap = [

{t('Installer not code-signed yet', '아직 코드 서명되지 않은 설치 프로그램', '安装程序尚未进行代码签名', 'Установщик пока не имеет цифровой подписи', 'インストーラーはまだコード署名されていません', '安裝程式尚未進行程式碼簽署', 'Yükleyici henüz kod imzalı değil')}

{t('Recommended for your system', '내 시스템에 추천', '推荐用于您的系统', 'Рекомендуется для вашей системы', 'お使いのシステムにおすすめ', '推薦用於您的系統', 'Sisteminiz için önerilir')}

@@ -320,11 +317,15 @@ const docsMap = [

x86_64 · .AppImage

{t('Recommended for your system', '내 시스템에 추천', '推荐用于您的系统', 'Рекомендуется для вашей системы', 'お使いのシステムにおすすめ', '推薦用於您的系統', 'Sisteminiz için önerilir')}

+

{t('Prefer the terminal?', '터미널이 더 편하다면', '更喜欢终端?', 'Предпочитаете терминал?', 'ターミナル派ですか?', '偏好終端機?', 'Terminali mi tercih edersiniz?')} npm install -g @bitkyc08/opencodex @@ -550,9 +551,18 @@ const docsMap = [ const heroBtn = document.getElementById('lp-hero-download'); const label = heroBtn?.dataset[`label${platform[0].toUpperCase()}${platform.slice(1)}`]; if (heroLabel && label) heroLabel.textContent = label; + const card = document.querySelector(`.lp-dl-card[data-platform="${platform}"]`); + if (!card) return; + card.setAttribute('data-recommended', ''); + // Show only this platform's card; the others move into the disclosure. + // Without detection (or JavaScript) all three stay in the grid. + const more = document.querySelector('.lp-dl-more'); + const moreGrid = more?.querySelector('.lp-dl-more-grid'); + if (!more || !moreGrid) return; document - .querySelector(`.lp-dl-card[data-platform="${platform}"]`) - ?.setAttribute('data-recommended', ''); + .querySelectorAll('.lp-dl-grid .lp-dl-card:not([data-recommended])') + .forEach((other) => moreGrid.append(other)); + more.hidden = false; }; // Linux builds are x86_64 only, so an ARM Linux desktop gets no recommendation. // Chromium freezes the Linux user agent to "x86_64", so its architecture hint @@ -577,13 +587,9 @@ const docsMap = [ .then((release: { tag_name?: string; assets?: { name?: string; browser_download_url?: string }[] }) => { const patterns: Record = { dmg: /-macos\.dmg$/, - 'dmg.sha256': /-macos\.dmg\.sha256$/, msi: /-windows-x64\.msi$/, - 'msi.sha256': /-windows-x64\.msi\.sha256$/, appimage: /-linux-x86_64\.AppImage$/, - 'appimage.sha256': /-linux-x86_64\.AppImage\.sha256$/, deb: /-linux-amd64\.deb$/, - 'deb.sha256': /-linux-amd64\.deb\.sha256$/, }; for (const asset of release.assets ?? []) { const key = Object.keys(patterns).find((k) => asset.name && patterns[k].test(asset.name)); diff --git a/docs-site/src/styles/custom.css b/docs-site/src/styles/custom.css index 0a2a878c829..bd9d08ff7b6 100644 --- a/docs-site/src/styles/custom.css +++ b/docs-site/src/styles/custom.css @@ -329,28 +329,16 @@ main:has(.lp) .content-panel:first-child { padding-block: 0; } font-size: var(--sl-text-sm); font-weight: 500; text-decoration: none; - text-wrap: balance; + white-space: nowrap; max-width: 100%; box-shadow: 0 1px 6px rgba(0, 0, 0, 0.06); } -@media (max-width: 30rem) { - .lp-announce { border-radius: 1.1rem; text-align: left; line-height: 1.35; } -} .lp-announce svg { flex: none; opacity: 0.7; } :root[data-theme='dark'] .lp-announce, :root:not([data-theme='light']) .lp-announce { background-color: rgba(255, 255, 255, 0.94); } -.lp-announce-tag { - flex: none; - padding: 0.1rem 0.55rem; - border-radius: var(--ocx-radius-pill); - background-color: #e08b6d; - color: #1a1a1a; - font-size: var(--sl-text-2xs); - font-weight: 650; - letter-spacing: 0.02em; -} .lp-announce:focus-visible, -.lp-download a:focus-visible { +.lp-download a:focus-visible, +.lp-dl-more > summary:focus-visible { outline: 2px solid light-dark(#2f6fe4, #8ab0f5); outline-offset: 2px; } @@ -862,6 +850,40 @@ main:has(.lp) .content-panel:first-child { padding-block: 0; } margin-top: 1.25rem; } @media (max-width: 48rem) { .lp-dl-grid { grid-template-columns: 1fr; } } +/* Detected platform: its card stands alone; the others sit in the disclosure. */ +.lp-download:has(.lp-dl-more:not([hidden])) .lp-dl-grid { grid-template-columns: minmax(0, 28rem); } +.lp-dl-more:not([hidden]) { display: block; margin-top: 1rem; } +.lp-dl-more > summary { + display: inline-flex; + align-items: center; + gap: 0.4rem; + min-height: 44px; + cursor: pointer; + list-style: none; + font-size: var(--sl-text-sm); + font-weight: 500; + color: var(--sl-color-gray-2); + border-radius: var(--ocx-radius-pill); +} +.lp-dl-more > summary::-webkit-details-marker { display: none; } +.lp-dl-more > summary::after { + content: ''; + width: 0.45rem; + height: 0.45rem; + border-right: 1.6px solid currentColor; + border-bottom: 1.6px solid currentColor; + transform: translateY(-2px) rotate(45deg); +} +.lp-dl-more[open] > summary::after { transform: translateY(2px) rotate(-135deg); } +.lp-dl-more > summary:hover { color: var(--sl-color-white); } +.lp-dl-more-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0.875rem; + max-width: 56rem; + margin-top: 0.5rem; +} +@media (max-width: 48rem) { .lp-dl-more-grid { grid-template-columns: 1fr; } } .lp-dl-card { position: relative; display: flex; @@ -900,6 +922,10 @@ main:has(.lp) .content-panel:first-child { padding-block: 0; } gap: 0.5rem; margin-top: auto; padding-top: 0.625rem; + /* one link line reserved in every card (Linux carries the .deb link) so + the buttons share a row in the three- and two-column layouts */ + min-height: calc(44px + 0.5rem + 0.625rem + 1.5 * var(--sl-text-xs)); + justify-content: flex-start; } .lp-dl-btn { display: inline-flex; @@ -928,31 +954,17 @@ main:has(.lp) .content-panel:first-child { padding-block: 0; } border-color: var(--sl-color-gray-5); color: var(--sl-color-white); } -.lp-dl-links { - display: flex; - flex-wrap: wrap; - align-items: baseline; - gap: 0.2rem 0.75rem; - /* two lines reserved in every card so the download buttons share one row */ - line-height: 1.5; - min-height: calc(3em + 0.2rem); - font-size: var(--sl-text-xs); -} -.lp-dl-links > a { white-space: nowrap; } .lp-announce-text { min-width: 0; } /* Korean breaks between words; Japanese and Chinese keep per-character breaks. */ -html:lang(ko) .lp-announce-text, html:lang(ko) .lp-download { word-break: keep-all; overflow-wrap: break-word; } -.lp-dl-sep { color: var(--sl-color-gray-4); } -.lp-dl-alt, -.lp-dl-sha { +.lp-dl-alt { + align-self: flex-start; font-size: var(--sl-text-xs); + line-height: 1.5; color: light-dark(#2f6fe4, #8ab0f5); text-decoration: none; } -.lp-dl-sha { font-family: var(--sl-font-mono); } -.lp-dl-alt:hover, -.lp-dl-sha:hover { text-decoration: underline; text-underline-offset: 3px; } +.lp-dl-alt:hover { text-decoration: underline; text-underline-offset: 3px; } .lp-dl-reco { display: none; order: -1; From 75f8ca77d718a726de6fcbc8d66d5195d318e0cd Mon Sep 17 00:00:00 2001 From: JUN Date: Wed, 23 Sep 2026 14:02:12 +0900 Subject: [PATCH 08/11] docs-site: drop the link-line reserve when one card stands alone --- docs-site/src/styles/custom.css | 1 + 1 file changed, 1 insertion(+) diff --git a/docs-site/src/styles/custom.css b/docs-site/src/styles/custom.css index bd9d08ff7b6..7cba0f62653 100644 --- a/docs-site/src/styles/custom.css +++ b/docs-site/src/styles/custom.css @@ -852,6 +852,7 @@ main:has(.lp) .content-panel:first-child { padding-block: 0; } @media (max-width: 48rem) { .lp-dl-grid { grid-template-columns: 1fr; } } /* Detected platform: its card stands alone; the others sit in the disclosure. */ .lp-download:has(.lp-dl-more:not([hidden])) .lp-dl-grid { grid-template-columns: minmax(0, 28rem); } +.lp-download:has(.lp-dl-more:not([hidden])) .lp-dl-grid .lp-dl-actions { min-height: 0; } .lp-dl-more:not([hidden]) { display: block; margin-top: 1rem; } .lp-dl-more > summary { display: inline-flex; From 89ad13b79dd8469ce8ca832ffde927f3433138f3 Mon Sep 17 00:00:00 2001 From: JUN Date: Wed, 23 Sep 2026 14:02:40 +0900 Subject: [PATCH 09/11] devlog: record desktop download focus evidence --- .../010_evidence.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 devlog/_plan/260923_desktop_download_focus/010_evidence.md diff --git a/devlog/_plan/260923_desktop_download_focus/010_evidence.md b/devlog/_plan/260923_desktop_download_focus/010_evidence.md new file mode 100644 index 00000000000..a479e6edd84 --- /dev/null +++ b/devlog/_plan/260923_desktop_download_focus/010_evidence.md @@ -0,0 +1,38 @@ +# Evidence — wp1 check + +Commits: c6819b6fc0 (landing focus), 75f8ca77d7 (single-card reserve). Build and checks ran at 75f8ca77d7 against `astro preview` on :4329 serving docs-site/dist. + +## Activation matrix (CDP Emulation.setUserAgentOverride with UA metadata, touch emulation for iPad) + +| Case | grid cards | disclosure cards | details hidden | hero label | +|---|---|---|---|---| +| windows (UA-CH platform Windows) | windows | macos, linux | false | Download for Windows | +| linux x86 (architecture x86) | linux | macos, windows | false | Download for Linux | +| linux arm (architecture arm) | macos, windows, linux | — | true | Download | +| iPad desktop mode (Mac UA, maxTouchPoints 5) | macos, windows, linux | — | true | Download | +| macos | macos | windows, linux | false | Download for macOS | +| Android (Chrome --user-agent, --dump-dom) | macos, windows, linux | — | true | Download | +| no JavaScript (curl) | macos, windows, linux | — | true (hidden) | Download | + +Every case: 0 occurrences of "SHA-256"; pill text "Desktop beta"; with JS the dmg href resolves to releases/download/v2.63.0/OpenCodex-2.63.0-macos.dmg, without JS it stays releases/latest. + +Test-method note: `--user-agent` alone does not change `navigator.userAgentData.platform`, so a Windows UA run first detected macOS; the CDP run with UA metadata is the real Windows evidence. + +## Render observation (headless Chrome, agbrowse CDP 9333) + +- 1440 light: one-line "Desktop beta" pill; macOS card alone (28rem) with the recommended badge; "Other platforms" summary; no empty reserve under the button after 75f8ca77d7. +- Disclosure open: Windows and Linux in two columns with outline buttons, Linux keeps ".deb package". +- 1440 dark: same layout, contrast holds. +- 320px pills (ko ru fr tr ja zh-tw): single line, no overflow. +- 390px ko: download section breaks Korean between words. +- Screenshots: /Users/jun/.browser-agent/screenshots/screenshot_1790139667580.png, /Users/jun/.browser-agent/screenshots/screenshot_1790139697444.png, /Users/jun/.browser-agent/screenshots/screenshot_1790139672949.png, /Users/jun/.browser-agent/screenshots/screenshot_1790139700162.png, /Users/jun/.browser-agent/screenshots/screenshot_1790139705932.png, /Users/jun/.browser-agent/screenshots/screenshot_1790139720186.png (uploaded to pr-assets for the PR body). + +## Gates + +- `cd docs-site && bun run build` → exit 0, 497 pages, internal links 65,499 checked. +- `rg 'App de bureau bêta|Autres plateformes' docs-site/dist/fr/index.html` → 2 matching lines; the old fr pill text and "SHA-256" → 0 in dist/fr and dist/index. +- cxc receipt test → `bun test` 5 files: 94 pass, 0 fail (receipt .codexclaw/evidence/01a0cc7c-73a3-7582-ad6d-17d34211ba09/test-receipt.json). +- `bun run privacy:scan` → passed; `git diff --check` clean. +- SoT: structure/ops/docs-and-release.md (docs-site owner) does not describe the landing download surface; no patch needed. +- Unobserved: none of the planned conditional paths remain unobserved (the iPad and Linux-arch rows were exercised through CDP emulation). + From 521ab4a70f7a36a531d1e704abd3ae5feb79e2f3 Mon Sep 17 00:00:00 2001 From: JUN Date: Wed, 23 Sep 2026 14:03:20 +0900 Subject: [PATCH 10/11] devlog: close desktop download focus unit (lands with PR #5638) --- devlog/{_plan => _fin}/260923_desktop_download_focus/000_plan.md | 0 .../{_plan => _fin}/260923_desktop_download_focus/010_evidence.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename devlog/{_plan => _fin}/260923_desktop_download_focus/000_plan.md (100%) rename devlog/{_plan => _fin}/260923_desktop_download_focus/010_evidence.md (100%) diff --git a/devlog/_plan/260923_desktop_download_focus/000_plan.md b/devlog/_fin/260923_desktop_download_focus/000_plan.md similarity index 100% rename from devlog/_plan/260923_desktop_download_focus/000_plan.md rename to devlog/_fin/260923_desktop_download_focus/000_plan.md diff --git a/devlog/_plan/260923_desktop_download_focus/010_evidence.md b/devlog/_fin/260923_desktop_download_focus/010_evidence.md similarity index 100% rename from devlog/_plan/260923_desktop_download_focus/010_evidence.md rename to devlog/_fin/260923_desktop_download_focus/010_evidence.md From 3fb0a8e91dfae58054bd5db90a4047e84e5514d3 Mon Sep 17 00:00:00 2001 From: JUN Date: Wed, 23 Sep 2026 14:19:42 +0900 Subject: [PATCH 11/11] docs-site: centre the landing download section --- .../260923_desktop_download_focus/010_evidence.md | 6 ++++++ docs-site/src/styles/custom.css | 11 +++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/devlog/_fin/260923_desktop_download_focus/010_evidence.md b/devlog/_fin/260923_desktop_download_focus/010_evidence.md index a479e6edd84..11f3e38d961 100644 --- a/devlog/_fin/260923_desktop_download_focus/010_evidence.md +++ b/devlog/_fin/260923_desktop_download_focus/010_evidence.md @@ -36,3 +36,9 @@ Test-method note: `--user-agent` alone does not change `navigator.userAgentData. - SoT: structure/ops/docs-and-release.md (docs-site owner) does not describe the landing download surface; no patch needed. - Unobserved: none of the planned conditional paths remain unobserved (the iPad and Linux-arch rows were exercised through CDP emulation). + +## Follow-up: centred layout (user steering during C) + +- custom.css: `.lp-download` centres its heading, subtitle, version line, the single detected card (`justify-content: center`), the Other platforms summary, the disclosure grid (`margin-inline: auto`) and the terminal row; card copy stays left-aligned (`.lp-dl-card { text-align: start }`). +- Rebuilt (exit 0) and re-observed at 1440 light (closed and open), 1440 dark, and 390px ko with the disclosure open: every block centred, no overlap. + diff --git a/docs-site/src/styles/custom.css b/docs-site/src/styles/custom.css index 7cba0f62653..45757eb5fe1 100644 --- a/docs-site/src/styles/custom.css +++ b/docs-site/src/styles/custom.css @@ -822,7 +822,10 @@ main:has(.lp) .content-panel:first-child { padding-block: 0; } border-radius: 24px; background-color: var(--ocx-surface); scroll-margin-top: calc(var(--sl-nav-height) + 1rem); + text-align: center; } +/* Section chrome is centred; card copy stays left-aligned for reading. */ +.lp-dl-card { text-align: start; } .lp-download-title { margin: 0; font-size: var(--sl-text-3xl); @@ -851,7 +854,10 @@ main:has(.lp) .content-panel:first-child { padding-block: 0; } } @media (max-width: 48rem) { .lp-dl-grid { grid-template-columns: 1fr; } } /* Detected platform: its card stands alone; the others sit in the disclosure. */ -.lp-download:has(.lp-dl-more:not([hidden])) .lp-dl-grid { grid-template-columns: minmax(0, 28rem); } +.lp-download:has(.lp-dl-more:not([hidden])) .lp-dl-grid { + grid-template-columns: minmax(0, 28rem); + justify-content: center; +} .lp-download:has(.lp-dl-more:not([hidden])) .lp-dl-grid .lp-dl-actions { min-height: 0; } .lp-dl-more:not([hidden]) { display: block; margin-top: 1rem; } .lp-dl-more > summary { @@ -882,7 +888,7 @@ main:has(.lp) .content-panel:first-child { padding-block: 0; } grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.875rem; max-width: 56rem; - margin-top: 0.5rem; + margin: 0.5rem auto 0; } @media (max-width: 48rem) { .lp-dl-more-grid { grid-template-columns: 1fr; } } .lp-dl-card { @@ -983,6 +989,7 @@ html:lang(ko) .lp-download { word-break: keep-all; overflow-wrap: break-word; } margin: 1.5rem 0 0; display: flex; flex-wrap: wrap; + justify-content: center; align-items: center; gap: 0.375rem 1rem; font-size: var(--sl-text-sm);