CodexSpeed is an independent local benchmark and public dashboard for comparing the visible output speed of Codex models at different reasoning efforts. Anyone can run the benchmark on their own computer and network; no API key is needed.
The benchmark runs locally through the installed Codex App Server. The public website never runs Codex and never receives Codex credentials. It can open a result JSON entirely in the browser for local viewing, while the maintainer can separately publish selected sanitized results through a signed upload path.
The project is independent and is not affiliated with, sponsored by, or endorsed by OpenAI. “Codex” is used only to identify the product being measured.
The reproducible v0.2.0 local runner, browser-local result viewer, signed
publication API, display dashboard, and genuine production benchmark are live.
Start at Test locally, or read the public
methodology and the approved
design.
Prerequisites are an installed Codex CLI and an existing ChatGPT login. The portable download includes its own fixed Node.js runtime.
On macOS or Linux, run:
curl --proto '=https' --tlsv1.2 -fsSL https://codexspeed.timmyagentic.com/run.sh | shOn Windows, run this in PowerShell:
irm https://codexspeed.timmyagentic.com/run.ps1 | iexIf Node.js 22 is already installed, the exact v0.2.0 GitHub Release package can instead be run with:
npx --yes https://github.com/timmyagentic/codexspeed/releases/download/v0.2.0/codexspeed-0.2.0.tgzThe guided runner checks Codex and the current model catalog without starting a model turn, then asks for one model and one reasoning effort. Its default test is one unmeasured warm-up plus three measured rounds: four real Codex turns. Before anything is run, it prints that exact count, warns that the turns use the current Codex/ChatGPT allowance and may have billing impact depending on the account, and requires explicit confirmation.
After the run, the terminal shows the p50 estimated visible-stream speed, first
visible-text latency, visible end-to-end speed, total latency, and sample
reliability. It also saves a timestamped codexspeed-result-*.json in the current
directory. Nothing is uploaded automatically.
Open codexspeed.timmyagentic.com/local
and choose that JSON file to see the same result as a matrix. The file is parsed,
validated, and summarized by the page in the browser; choosing it does not send
its contents to CodexSpeed.
Download the asset for the operating system and CPU, verify it against
SHA256SUMS,
then extract it. Run codexspeed/bin/codexspeed on macOS or Linux, or
codexspeed\bin\codexspeed.cmd on Windows.
CodexSpeed requires Node.js 22, pnpm 10 through Corepack, the installed Codex CLI, and an existing ChatGPT login. Install and build the workspace first:
corepack pnpm install --frozen-lockfile
corepack pnpm --filter @codexspeed/runner builddoctor checks the CLI, login, App Server protocol, model catalog, and isolated
instruction state without starting a model turn. plan also starts no model
turn and prints the exact bounded schedule:
corepack pnpm --filter @codexspeed/runner codexspeed -- doctor
corepack pnpm --filter @codexspeed/runner codexspeed -- plan --seed 7 --max-turns 200Every real run requires --max-turns and an output file. A one-cell smoke run
looks like this (replace the model and effort with a pair printed by plan):
corepack pnpm --filter @codexspeed/runner codexspeed -- run \
--model MODEL_ID \
--effort medium \
--rounds 1 \
--no-warmup \
--seed 7 \
--max-turns 1 \
--out /tmp/codexspeed-run.jsonA series run measures every visible comparable effort in one bounded model
family. It always uses one warm-up per selected model and three measured rounds;
it cannot be combined with model/effort filters, --no-warmup, or a different
round count. Plan first, then run with the same arguments:
corepack pnpm --filter @codexspeed/runner codexspeed -- plan \
--series gpt-5.6 \
--seed 13 \
--max-turns 48
corepack pnpm --filter @codexspeed/runner codexspeed -- run \
--series gpt-5.6 \
--seed 13 \
--max-turns 48 \
--out /tmp/codexspeed-gpt-5.6.jsonThe exact-or-hyphen-prefix boundary selects gpt-5.6 and gpt-5.6-*, but not
gpt-5.60-*. Hidden models and Ultra are excluded. If the live catalog changes,
the no-turn plan shows the new exact cell and turn count before execution.
The artifact is compact schema-validated JSON with owner-only permissions. It contains benchmark evidence, not prompt/response text, credentials, local paths, App Server transcripts, or arbitrary environment data.
Ordinary local tests do not need a publisher key and cannot publish to the public dashboard. Opening a JSON on the local-test page is not publication. The following authenticated path is reserved for the site maintainer.
The publisher key ID and unpadded base64url 32-byte HMAC secret are accepted only through environment variables. The secret must match the Cloudflare Worker secret; do not put it in command arguments or commit it to the repo.
export CODEXSPEED_KEY_ID=publisher-v1
read -r -s CODEXSPEED_HMAC_SECRET
export CODEXSPEED_HMAC_SECRET
corepack pnpm --filter @codexspeed/runner codexspeed -- publish \
/tmp/codexspeed-run.jsonPublication defaults to
https://codexspeed.timmyagentic.com/api/v1/runs. The runner validates the
artifact, signs the SHA-256 of its exact existing bytes, sends those same bytes,
and verifies the returned run ID and payload hash. Repeating a byte-identical
artifact is safe and reports already published; reusing a run ID with different
bytes returns a conflict.
Production artifacts must come from a verified immutable GitHub release tag
v<runnerVersion>. The run detail page links that exact tag and never treats a
mutable branch as reproducible source evidence. The methodology documents
scheduling, formulas, validity, limitations, cost safeguards, and reference
project licenses.
For local integration tests only, plain HTTP must be both loopback-only and
explicitly enabled. Query strings, fragments, user info, and any path other than
/api/v1/runs are rejected:
corepack pnpm --filter @codexspeed/runner codexspeed -- publish \
/tmp/codexspeed-run.json \
--endpoint http://127.0.0.1:8787/api/v1/runs \
--allow-http-localhostApache-2.0. See LICENSE. Bundled web dependencies and their MIT
license notices are listed in THIRD_PARTY_NOTICES.md.