Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
cddef15
feat(i18n): add Spanish dashboard and documentation localization
federicorv25 Oct 19, 2026
1871623
docs(i18n): synchronize Spanish with current dev behavior
federicorv25 Oct 19, 2026
da7bc3a
Merge remote-tracking branch 'upstream/dev' into feat/spanish-localiz…
federicorv25 Oct 19, 2026
9672350
fix(i18n): address Spanish localization review findings
federicorv25 Oct 19, 2026
5519320
Merge remote-tracking branch 'upstream/dev' into feat/spanish-localiz…
federicorv25 Oct 19, 2026
173bcaa
docs(i18n): reconcile Spanish with current dev and record review vali…
federicorv25 Oct 19, 2026
a23f191
fix(i18n): unify Spanish technical terms and clarify subagent guidance
federicorv25 Oct 20, 2026
41dd9d1
fix(i18n): resolve complete Spanish review and synchronize operationa…
federicorv25 Oct 20, 2026
4ea2e78
fix(i18n): resolve final documentation and exact identifier review
federicorv25 Oct 20, 2026
d8d9a4b
fix(i18n): address outside-diff Lab terminology review
federicorv25 Oct 20, 2026
2579244
fix(i18n): clarify hybrid delegation and account pool behavior
federicorv25 Oct 20, 2026
8fc14fd
docs(es): clarify socket handle leak terminology
federicorv25 Oct 20, 2026
99b5943
docs(es): preserve upstream pull request identifiers
federicorv25 Oct 20, 2026
9c00b75
docs(es): review Windows memory troubleshooting as a whole
federicorv25 Oct 20, 2026
bf4ab7d
fix(i18n): consolidate Spanish review corrections and contract guards
federicorv25 Oct 20, 2026
1e60fed
fix(i18n): address full-review translation and documentation findings
federicorv25 Oct 20, 2026
3096e10
Merge remote-tracking branch 'upstream/dev' into feat/spanish-localiz…
federicorv25 Oct 21, 2026
4d38be3
fix(i18n): consolidate Spanish review fixes against current dev
federicorv25 Oct 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 10 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ Sol drives the session and calls a Kimi K3 subagent.
</table>

<p align="center">
<a href="README.md">English</a> · <a href="readme/README.fr.md">Français</a> · <a href="readme/README.ko.md">한국어</a> · <a href="readme/README.zh-CN.md">简体中文</a> · <a href="readme/README.zh-TW.md">繁體中文</a> · <a href="readme/README.ru.md">Русский</a> · <a href="readme/README.ja.md">日本語</a> · <a href="readme/README.tr.md">Türkçe</a> · 📖 <a href="https://opencodex.me/"><b>Full documentation →</b></a>
<a href="README.md">English</a> · <a href="readme/README.fr.md">Français</a> · <a href="readme/README.ko.md">한국어</a> · <a href="readme/README.zh-CN.md">简体中文</a> · <a href="readme/README.zh-TW.md">繁體中文</a> · <a href="readme/README.ru.md">Русский</a> · <a href="readme/README.ja.md">日本語</a> · <a href="readme/README.tr.md">Türkçe</a> · <a href="readme/README.es.md">Español</a> · 📖 <a href="https://opencodex.me/"><b>Full documentation →</b></a>
</p>

opencodex is a lightweight local proxy that translates Codex's Responses API into whatever your
Expand Down Expand Up @@ -251,9 +251,7 @@ ocx start # or `ocx service`
ocx init # interactive setup: writes ~/.opencodex/config.json and wires Codex
```

`ocx init` never starts the proxy; start it first (or after — either order works, but headless
commands like `ocx provider add` and `ocx combo set` talk to the **live** proxy and exit nonzero
when it is unreachable). `ocx status` / `ocx doctor` / `ocx health` report the running state.
`ocx init` never starts the proxy; you can start it before or after setup. `ocx provider add` writes local configuration and does not require a running proxy. Live management commands such as `ocx combo set` communicate with the **running** proxy and exit nonzero when it is unreachable. `ocx status` / `ocx doctor` / `ocx health` report the running state.

> **Agents installing or running opencodex:** read
> [`AGENTS_INSTALL.md`](./AGENTS_INSTALL.md). An interactive `ocx start` may ask once whether to
Expand Down Expand Up @@ -432,10 +430,14 @@ npm uninstall -g @bitkyc08/opencodex

## Remote access

By default opencodex binds to `127.0.0.1` and needs no extra authentication. Binding beyond
loopback (`"hostname": "0.0.0.0"`) **requires** a bearer token — the proxy refuses to start
without `OPENCODEX_API_AUTH_TOKEN`, and every client request must carry it as
`x-opencodex-api-key`. Details: [configuration reference](https://opencodex.me/reference/configuration/).
By default opencodex binds to `127.0.0.1` and needs no extra data-plane authentication.
Binding beyond loopback (`"hostname": "0.0.0.0"`) **requires a data-plane credential**.
The data token can come from `OPENCODEX_API_AUTH_TOKEN`, `OCX_API_TOKEN_FILE`, or the
owner-only `service-api-token` file that `ocx service install` can provision.
Configured client API keys also provide data-plane admission. Clients send an accepted
credential in `x-opencodex-api-key`. Management uses a separate
`OPENCODEX_ADMIN_AUTH_TOKEN` or generated admin token; a data token does not grant
management access. Details: [configuration reference](https://opencodex.me/reference/configuration/).

## Documentation

Expand Down
228 changes: 228 additions & 0 deletions devlog/_plan/261019_spanish_localization/010_plan.md

Large diffs are not rendered by default.

147 changes: 75 additions & 72 deletions docs-site/astro.config.mjs

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions docs-site/src/components/FrontierBoards.astro
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import data from "../data/frontier-benchmarks.json";
import { FRONTIER_STRINGS } from "../data/frontier-i18n";

interface Props {
locale?: "en" | "fr" | "ko" | "zh-cn" | "zh-tw" | "ru" | "ja" | "tr";
locale?: "en" | "fr" | "ko" | "zh-cn" | "zh-tw" | "ru" | "ja" | "tr" | "es";
/** Comma-separated board ids to render; omit for all boards. */
boards?: string;
/** Show the page-level subtitle (overview pages only). */
Expand All @@ -26,7 +26,7 @@ const fill = (key: string, vars: Record<string, string>): string =>
Object.entries(vars).reduce((acc, [k, v]) => acc.replace(`{${k}}`, v), t(key));

// The PR i18n has no column-header key for "score" — keep a tiny local map.
const SCORE_HEADER: Record<string, string> = { en: "Score", fr: "Score", ko: "점수", "zh-cn": "得分", "zh-tw": "得分", ru: "Балл", ja: "スコア", tr: "Puan" };
const SCORE_HEADER: Record<string, string> = { es: "Puntuación", en: "Score", fr: "Score", ko: "점수", "zh-cn": "得分", "zh-tw": "得分", ru: "Балл", ja: "スコア", tr: "Puan" };
/** Dataset tags are kebab-case; i18n keys are camelCase (cheap-subagent → cheapSubagent). */
const tagKey = (tag: string): string => tag.replace(/-([a-z])/g, (_, c) => c.toUpperCase());

Expand Down
41 changes: 39 additions & 2 deletions docs-site/src/components/Header.astro
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,44 @@ const fr = {
'GitHub, {count} stars': 'GitHub, {count} étoiles',
} as const;

const es: Record<keyof typeof fr, string> = {
"Auto": "Automático",
"Light": "Claro",
"Dark": "Oscuro",
"Theme": "Tema",
"Click to use the next theme": "Haz clic para cambiar al siguiente tema",
"Getting Started": "Primeros pasos",
"Installation": "Instalación",
"Quickstart": "Inicio rápido",
"How It Works": "Cómo funciona",
"Agent Quickstart": "Inicio rápido para agentes",
"Guides": "Guías",
"Providers": "Proveedores",
"Model Routing": "Enrutamiento de modelos",
"Combos": "Combos",
"Codex Integration": "Integración con Codex",
"Codex App Model Picker": "Selector de modelos de Codex App",
"Sidecars: Search & Vision": "Sidecars: búsqueda y visión",
"Image Bridge": "Puente de imágenes",
"Video Bridge": "Puente de video",
"Web Dashboard": "Dashboard web",
"Sub-agent Surface": "Interfaz de subagentes",
"Reference": "Referencia",
"Configuration": "Configuración",
"Adapters": "Adaptadores",
"Architecture": "Arquitectura",
"Proxy API Formats": "Formatos de API del proxy",
"Management API": "API de administración",
"Contributing": "Cómo contribuir",
"Main": "Navegación principal",
"Select language": "Elegir idioma",
"Menu": "Menú",
"GitHub": "GitHub",
"GitHub, {count} stars": "GitHub, {count} estrellas",
};

const t = <K extends keyof typeof fr>(en: K, ko: string, zh: string, ru: string, ja: string, zhTW: string, tr: string): string =>
locale === 'fr' ? fr[en] : locale === 'ko' ? ko : locale === 'zh-cn' ? zh : locale === 'zh-tw' ? zhTW : locale === 'ru' ? ru : locale === 'ja' ? ja : locale === 'tr' ? tr : en;
locale === 'es' ? es[en] : locale === 'fr' ? fr[en] : locale === 'ko' ? ko : locale === 'zh-cn' ? zh : locale === 'zh-tw' ? zhTW : locale === 'ru' ? ru : locale === 'ja' ? ja : locale === 'tr' ? tr : en;

const starCount = await getStarCount();
const starLocale = locale ?? 'en';
Expand All @@ -68,9 +104,10 @@ const starLabel = t(
const githubAccessibleName = starCount === null ? githubLabel
: starLabel.replace('{count}', starCount.toLocaleString(starLocale));

type LanguageOption = { code: 'root' | 'fr' | 'ko' | 'zh-cn' | 'zh-tw' | 'ru' | 'ja' | 'tr'; label: string };
type LanguageOption = { code: 'root' | 'fr' | 'ko' | 'zh-cn' | 'zh-tw' | 'ru' | 'ja' | 'tr' | 'es'; label: string };
const languages: LanguageOption[] = [
{ code: 'root', label: 'English' },
{ code: 'es', label: 'Español' },
{ code: 'fr', label: 'Français' },
{ code: 'ko', label: '한국어' },
{ code: 'zh-cn', label: '简体中文' },
Expand Down
90 changes: 88 additions & 2 deletions docs-site/src/components/Landing.astro
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import SiteJsonLd from './SiteJsonLd.astro';
import { GITHUB_URL, getStarCount, formatStarCount } from '../data/github-stars';

interface Props {
locale?: 'fr' | 'ko' | 'zh-cn' | 'zh-tw' | 'ru' | 'ja' | 'tr';
locale?: 'fr' | 'ko' | 'zh-cn' | 'zh-tw' | 'ru' | 'ja' | 'tr' | 'es';
}
const { locale } = Astro.props;

Expand Down Expand Up @@ -117,8 +117,94 @@ const fr = {
'Star on GitHub, {count} stars': 'Ajouter une étoile sur GitHub, {count} étoiles',
} as const;

const es: Record<keyof typeof fr, string> = {
"Install": "Instalar",
"Start the proxy": "Iniciar el proxy",
"Inject a provider into Codex": "Inyectar un proveedor en Codex",
"Codex now routes through ocx": "Codex ahora se conecta a través de ocx",
"Getting Started": "Primeros pasos",
"Installation": "Instalación",
"Quickstart": "Inicio rápido",
"How It Works": "Cómo funciona",
"Agent Quickstart": "Inicio rápido para agentes",
"Guides": "Guías",
"Providers": "Proveedores",
"Model Routing": "Enrutamiento de modelos",
"Combos": "Combos",
"Codex Integration": "Integración con Codex",
"Codex App Model Picker": "Selector de modelos de Codex App",
"Sidecars: Search & Vision": "Sidecars: búsqueda y visión",
"Image Bridge": "Puente de imágenes",
"Video Bridge": "Puente de video",
"Web Dashboard": "Dashboard web",
"Sub-agent Surface": "Interfaz de subagentes",
"Reference": "Referencia",
"Configuration": "Configuración",
"Adapters": "Adaptadores",
"Architecture": "Arquitectura",
"Proxy API Formats": "Formatos de API del proxy",
"Management API": "API de administración",
"Project": "Proyecto",
"Contributing": "Cómo contribuir",
"Run ": "Ejecuta ",
" on any LLM.": " con cualquier LLM.",
"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 es un proxy local para Codex y Claude Code que usa un solo puerto. Convierte cada formato de protocolo para cualquier proveedor, con streaming, llamadas a herramientas, razonamiento e imágenes en ambas direcciones. No requiere parches en los clientes.",
"Get Started": "Comenzar",
"Supported providers": "Proveedores compatibles",
"40+ providers": "Más de 40 proveedores",
"The opencodex dashboard — live proxy status, routed providers, and available models": "Dashboard de opencodex: estado del proxy en tiempo real, proveedores enrutados y modelos disponibles",
"Install. Start. Codex, rerouted.": "Instala. Inicia. Codex, con otro proveedor.",
"Install.": "Instala.",
"Start.": "Inicia.",
"Codex, rerouted.": "Codex, con otro proveedor.",
"Full quickstart": "Inicio rápido completo",
"Watch Codex run on a routed model.": "Mira cómo Codex ejecuta un modelo enrutado.",
"Codex App running a task on a routed non-OpenAI model": "Codex App ejecuta una tarea con un modelo enrutado de otro proveedor distinto de OpenAI",
"One task, streamed end to end through opencodex.": "Una tarea, transmitida de extremo a extremo a través de opencodex.",
"One proxy, the whole surface.": "Un proxy para todas las funciones.",
"Any provider": "Cualquier proveedor",
"Five adapters cover Anthropic Messages, Google Gemini, Azure, the OpenAI Responses passthrough, and every OpenAI-compatible Chat Completions endpoint — 40+ built-in providers.": "Cinco adaptadores cubren Anthropic Messages, Google Gemini, Azure, el paso directo de OpenAI Responses y cualquier endpoint de Chat Completions compatible con OpenAI. Más de 40 proveedores integrados.",
"OAuth or API key": "OAuth o clave API",
"Log in with your xAI, Anthropic, or Kimi account — auto-refreshed — forward your ChatGPT login, or paste a key.": "Inicia sesión con tu cuenta de xAI, Anthropic o Kimi, con renovación automática; reenvía tu sesión de ChatGPT o pega una clave API.",
"ChatGPT account pool": "Grupo de cuentas ChatGPT",
"Existing threads keep their account; new sessions auto-route to the lowest-usage healthy one after quota refresh.": "Los hilos existentes conservan su cuenta. Tras actualizar las cuotas, las sesiones nuevas se asignan automáticamente a la cuenta disponible con menor uso.",
"Native in the model picker": "Nativo en el selector de modelos",
"Routed models show up in Codex App with reasoning effort levels, next to the native ones.": "Los modelos enrutados aparecen en la aplicación Codex con niveles de esfuerzo de razonamiento, junto a los nativos.",
"Codex App model picker with reasoning effort levels": "Selector de modelos de Codex App con niveles de esfuerzo de razonamiento",
"Sub-agents": "Subagentes",
"Pin up to five routed or native models for Codex spawn_agent, and switch the v1 / base / v2 surface globally.": "Fija hasta cinco modelos enrutados o nativos para spawn_agent de Codex y cambia globalmente entre las interfaces v1, base y v2.",
"ocx claude launches Claude Code against the same port — every routed model in the /model picker, auto-context up to 1M, roster sub-agents, and your claude.ai login stays active.": "ocx claude inicia Claude Code en el mismo puerto: todos los modelos enrutados aparecen en /model, con contexto automático de hasta 1M y subagentes del listado. Tu sesión de claude.ai permanece activa.",
"Claude Code running a routed model through opencodex — gpt-5.6-luna-medium active in the status bar": "Claude Code ejecutando un modelo enrutado a través de opencodex — gpt-5.6-luna-medium activo en la barra de estado",
"Search & vision sidecars": "Sidecars de búsqueda y visión",
"Give non-OpenAI models real web search and image understanding through a gpt-5.6-luna sidecar.": "Añade búsqueda web y comprensión de imágenes a los modelos de otros proveedores mediante un sidecar gpt-5.6-luna.",
"ocx init writes a provider into your Codex config and shares one model catalog with Codex CLI, TUI, App, and SDK. ocx stop restores native Codex cleanly.": "ocx init escribe un proveedor en su configuración de Codex y comparte un catálogo de modelos con Codex CLI, TUI, App y SDK. ocx stop restaura Codex nativo de forma limpia.",
"Documentation map": "Mapa de la documentación",
"Explore the docs": "Explorar la documentación",
"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 es un proyecto comunitario independiente, sin afiliación ni respaldo de OpenAI, Anthropic u otros proveedores. Algunos proveedores pueden restringir las cuentas que enrutan tráfico a través de proxies de terceros. Revisa los términos de servicio de cada proveedor antes de conectarte.",
"Desktop beta": "Desktop beta",
"Other platforms": "Otras plataformas",
"Download": "Descargar",
"Download for macOS": "Descargar para macOS",
"Download for Windows": "Descargar para Windows",
"Download for Linux": "Descargar para Linux",
"Download OpenCodex": "Descargar OpenCodex",
"The desktop app bundles the proxy, the dashboard and a tray. Beta.": "La aplicación de escritorio incluye el proxy, el dashboard y una bandeja. Versión beta.",
"Universal · Apple Silicon and Intel · macOS 13+ · .dmg": "Universal · Apple Silicon e Intel · macOS 13+ · .dmg",
"Installer not code-signed yet": "El instalador aún no tiene firma de código",
".deb package": "Paquete .deb",
"Recommended for your system": "Recomendado para tu sistema",
"Prefer the terminal?": "¿Prefieres la terminal?",
"Installation guide": "Guía de instalación",
"All releases and checksums": "Todas las versiones y sumas de comprobación",
"Desktop app guide": "Guía de la aplicación de escritorio",
"Desktop App": "Aplicación de escritorio",
"Latest release": "La última versión",
"Star on GitHub": "Dar una estrella en GitHub",
"Star on GitHub, {count} stars": "Dar una estrella en GitHub, {count} estrellas",
};

const t = <K extends keyof typeof fr>(en: K, ko: string, zh: string, ru: string, ja: string, zhTW: string, tr: string): string =>
locale === 'fr' ? fr[en] : locale === 'ko' ? ko : locale === 'zh-cn' ? zh : locale === 'zh-tw' ? zhTW : locale === 'ru' ? ru : locale === 'ja' ? ja : locale === 'tr' ? tr : en;
locale === 'es' ? es[en] : locale === 'fr' ? fr[en] : locale === 'ko' ? ko : locale === 'zh-cn' ? zh : locale === 'zh-tw' ? zhTW : locale === 'ru' ? ru : locale === 'ja' ? ja : locale === 'tr' ? tr : en;

const starCount = await getStarCount();
const starLocale = locale || 'en';
Expand Down
5 changes: 3 additions & 2 deletions docs-site/src/components/SiteJsonLd.astro
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,18 @@
const SITE_URL = 'https://opencodex.me';

interface Props {
locale?: 'fr' | 'ko' | 'zh-cn' | 'zh-tw' | 'ru' | 'ja' | 'tr';
locale?: 'fr' | 'ko' | 'zh-cn' | 'zh-tw' | 'ru' | 'ja' | 'tr' | 'es';
}
const { locale } = Astro.props;

// Locale path segment (root/English has none) mapped to its BCP-47 tag.
const langs = { fr: 'fr', ko: 'ko', 'zh-cn': 'zh-CN', 'zh-tw': 'zh-TW', ru: 'ru', ja: 'ja', tr: 'tr' } as const;
const langs = { es: 'es', fr: 'fr', ko: 'ko', 'zh-cn': 'zh-CN', 'zh-tw': 'zh-TW', ru: 'ru', ja: 'ja', tr: 'tr' } as const;

const homeUrl = locale ? `${SITE_URL}/${locale}/` : `${SITE_URL}/`;
const inLanguage = locale ? langs[locale] : 'en';

const descriptions = {
es: "Proxy universal de proveedores para OpenAI Codex y Claude Code: usa cualquier LLM con Codex CLI, App, SDK y Claude Code.",
en: 'Universal provider proxy for OpenAI Codex & Claude Code — use any LLM with Codex CLI, App, SDK, and Claude Code.',
fr: 'Proxy universel de fournisseurs pour OpenAI Codex et Claude Code — utilisez n’importe quel LLM avec Codex CLI, App, SDK et Claude Code.',
ko: 'OpenAI Codex & Claude Code를 위한 범용 프로바이더 프록시 — Codex CLI, App, SDK와 Claude Code에서 어떤 LLM이든 사용하세요.',
Expand Down
7 changes: 4 additions & 3 deletions docs-site/src/content/docs/contributing.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,9 @@ bun run build

GitHub Actions intentionally stay small:

- **Cross-platform CI** (`.github/workflows/ci.yml`) runs on pull requests and `main` pushes that
touch runtime, tests, package, script, TypeScript, or workflow files. Its Bun matrix covers Linux,
- **Cross-platform CI** (`.github/workflows/ci.yml`) runs only the fast Ubuntu subset on pull requests.
Full cross-platform jobs run through `workflow_dispatch` and pushes to `main`/`preview`, subject
to the workflow's path filters; pushes to `dev` do not run the full suite. Its Bun matrix covers Linux,
Windows, and macOS with install, typecheck, tests, privacy scan, a release-helper build smoke, GUI
build, and `ocx help`. A second three-OS lane proves npm global install works without a separately
installed Bun by using the package's bundled runtime.
Expand Down Expand Up @@ -161,7 +162,7 @@ description.

- Target **`dev`**. Do not open feature or fix pull requests against **`main`**.
- Branch from the current **`dev`** tip, not from **`main`**. The required **`enforce-target`** check rejects heads whose merge base sits on the **`main`** tip while the branch is far behind the pull request base (the failure mode seen in #644).
- Write a real description: a **Summary** of what changed and why, plus a **Test plan** (or equivalent substance). Empty bodies, placeholder-only text, and descriptions that use escaped `\n` instead of real line breaks fail the check.
- Complete the repository template's `Summary`, `Verification`, and `Checklist` sections: explain what changed and why, and document the test plan and results. Empty bodies, placeholder-only text, and descriptions that use escaped `\n` instead of real line breaks fail the check.
- If the pull request changes files under `gui/`, include a screenshot of the UI change in the description; the `enforce-target` check re-runs on description edits until the screenshot is present. Drag the image into the description editor rather than committing it: an image on your branch rides the squash merge into `dev`. Maintainers uploading from the command line use the `pr-assets` branch and link by commit SHA.
- Workflow changes in this repository use **`pull_request_target`**. Updated enforcement logic applies only after the workflow is promoted to the repository default branch — the same operational caveat documented in #631.

Expand Down
Loading
Loading