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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,16 @@

## Unreleased

## 1.5.5 — 2026-09-30

- Add GPT-6.1 Sol as a distinct model with dated API and Codex rates from September 29, including the lower cached-input price, cache writes, Fast and API long-context pricing.
- Separate GPT-6.1 Sol purchased-credit Fast pricing (2x) from included-subscription quota weighting (2.5x) in quota calibration and forecasts.
- Preserve earlier model rates, historical Fast availability, saved custom prices and original model IDs through collection and Mesh synchronization.
- Include the previously merged recovery of recorded reasoning effort from thread settings.
- Patch vulnerable development-tool dependencies (`undici`, `brace-expansion` and `fast-uri`) without changing the deployed application dependency set.

Docker: `capitaine/codex-usage-dashboard:1.5.5` and `:latest` (Linux AMD64 and ARM64). Recreate containers with their existing configuration and storage volumes.

## 1.5.4 — 2026-09-23

- Add GPT-6 Sol and GPT-6 Luna API pricing to the current and historical catalogs, preserving dated prices and calculation support.
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ LABEL org.opencontainers.image.source="https://github.com/capisoft-lib/codex_usa
org.opencontainers.image.licenses="AGPL-3.0-or-later" \
org.opencontainers.image.title="Local Usage Dashboard for Codex" \
org.opencontainers.image.description="Independent local dashboard for Codex usage, token activity, and cost estimates" \
org.opencontainers.image.version="1.5.4"
org.opencontainers.image.version="1.5.5"

ENV NODE_ENV=production \
HOST=0.0.0.0 \
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

Local Usage turns the Codex session metadata stored on your computer into a fast, privacy-conscious usage dashboard. It can run entirely on one machine, or several machines can send signed, minimized usage snapshots to an optional central dashboard hosted with OpenAI Sites or on your own server.

[**Stable release 1.5.4**](https://github.com/capisoft-lib/codex_usage/releases/tag/v1.5.4) · [Docker image 1.5.4](https://hub.docker.com/r/capitaine/codex-usage-dashboard) · [AGPL-3.0-or-later](LICENSE) · [Changelog](CHANGELOG.md) · [CI status](https://github.com/capisoft-lib/codex_usage/actions/workflows/ci.yml)
[**Stable release 1.5.5**](https://github.com/capisoft-lib/codex_usage/releases/tag/v1.5.5) · [Docker image 1.5.5](https://hub.docker.com/r/capitaine/codex-usage-dashboard) · [AGPL-3.0-or-later](LICENSE) · [Changelog](CHANGELOG.md) · [CI status](https://github.com/capisoft-lib/codex_usage/actions/workflows/ci.yml)

Setup guides: [deploy the central dashboard with OpenAI Sites](docs/sites-deployment.md) · [deploy the public Mesh ingress](docs/mesh-ingress.md) · [install a reporting agent](docs/reporting-agent.md)

Expand Down Expand Up @@ -163,7 +163,7 @@ The dashboard image runs as a non-root user with all Linux capabilities removed.
The public Linux AMD64/ARM64 image is:

```text
capitaine/codex-usage-dashboard:1.5.4
capitaine/codex-usage-dashboard:1.5.5
```

The 1.0.2 release is also mirrored at `ghcr.io/capisoft-lib/codex-usage-dashboard:1.0.2`.
Expand All @@ -172,7 +172,7 @@ On Windows PowerShell:

```powershell
$codexData = Join-Path $env:USERPROFILE ".codex"
$image = "capitaine/codex-usage-dashboard:1.5.4"
$image = "capitaine/codex-usage-dashboard:1.5.5"

docker pull $image
docker volume create codex-usage-dashboard-storage
Expand All @@ -196,7 +196,7 @@ docker run -d `
On macOS or Linux:

```bash
IMAGE="capitaine/codex-usage-dashboard:1.5.4"
IMAGE="capitaine/codex-usage-dashboard:1.5.5"

docker pull "$IMAGE"
docker volume create codex-usage-dashboard-storage
Expand Down Expand Up @@ -488,7 +488,7 @@ The dashboard derives two separate estimates from locally observed model calls.
- **Codex credits** use the published ChatGPT Codex rate card. Each call inherits its recorded service tier, and known Fast/Priority calls receive the documented credit multiplier.
- **API-equivalent cost** estimates what the same calls would have cost through the API. Standard prices, published API Fast rates, and long-context adjustments are applied independently from ChatGPT credit multipliers.
- Both estimates select the rate applicable at each call's original timestamp from a shared, versioned catalog. Later price cuts do not reduce earlier consumption; late imports retain their historical rate.
- GPT-6 Astra is supported, including independent API Fast (2x), Codex Fast (2.5x), and API long-context rules.
- GPT-6 Astra, Sol, Luna and GPT-6.1 Sol are supported with distinct model IDs, dated rates and API long-context rules. Sol 6.1 cached input costs $0.10 or 2.5 Codex credits per million tokens; its Fast purchased-credit billing is 2x and included-subscription quota weighting is 2.5x. Earlier periods retain their recorded factors.
- Unknown models, dates outside documented coverage and unsupported tiers remain visibly unrated and are excluded from totals. A reference API price is available only in explicitly selected custom simulation.
- The pricing dialog includes historical/current/custom modes, sourced rate history, catalog verification status and an export of the applied calculation. Legacy custom browser prices are preserved for custom simulation.

Expand Down
16 changes: 8 additions & 8 deletions docs/dockerhub-readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

Local Usage turns the Codex session metadata stored on your computer into a fast, privacy-conscious usage dashboard. It can run entirely on one machine, or several machines can send signed, minimized usage snapshots to an optional central dashboard.

[**Stable release 1.5.4**](https://github.com/capisoft-lib/codex_usage/releases/tag/v1.5.4) · [Docker image 1.5.4](https://hub.docker.com/r/capitaine/codex-usage-dashboard/tags) · [Source code](https://github.com/capisoft-lib/codex_usage) · [AGPL-3.0-or-later](https://github.com/capisoft-lib/codex_usage/blob/main/LICENSE) · [Changelog](https://github.com/capisoft-lib/codex_usage/blob/main/CHANGELOG.md) · [CI status](https://github.com/capisoft-lib/codex_usage/actions/workflows/ci.yml)
[**Stable release 1.5.5**](https://github.com/capisoft-lib/codex_usage/releases/tag/v1.5.5) · [Docker image 1.5.5](https://hub.docker.com/r/capitaine/codex-usage-dashboard/tags) · [Source code](https://github.com/capisoft-lib/codex_usage) · [AGPL-3.0-or-later](https://github.com/capisoft-lib/codex_usage/blob/main/LICENSE) · [Changelog](https://github.com/capisoft-lib/codex_usage/blob/main/CHANGELOG.md) · [CI status](https://github.com/capisoft-lib/codex_usage/actions/workflows/ci.yml)

## Donate

Expand All @@ -22,29 +22,29 @@ If you like this project and want to support its ongoing development, you can [b
- project, model, period, usage, and conversation filters;
- nine interface languages.

## New in 1.5.4
## New in 1.5.5

- GPT-6 Sol and GPT-6 Luna API pricing is available in current and historical calculations.
- Reporting agents recover from stale replay sequences after synchronization rejection.
- GPT-6.1 Sol has distinct API and Codex credit rates, including its lower cached-input price.
- Sol 6.1 Fast credit billing (2x) and included-subscription quota weighting (2.5x) are calculated separately.
- Recent releases added relational SQLite storage, faster history queries, and clearer loading and error states.

## Docker

The public image supports Linux AMD64 and ARM64 and runs as a non-root user:

```text
capitaine/codex-usage-dashboard:1.5.4
capitaine/codex-usage-dashboard:1.5.5
```

```bash
docker pull capitaine/codex-usage-dashboard:1.5.4
docker pull capitaine/codex-usage-dashboard:1.5.5
docker compose up -d
```

The `1.5.4` and `latest` tags share OCI digest:
Inspect the published multi-platform manifest and digest:

```text
sha256:5a0076a20c3da2da39ba1f7e7dc37e74f45bdb01d90f62a85fa8b4287134b5e4
docker buildx imagetools inspect capitaine/codex-usage-dashboard:1.5.5
```

The published manifests include SBOM and provenance attestations. See the [full README](https://github.com/capisoft-lib/codex_usage#readme) for scoped read-only mounts, PowerShell/macOS/Linux commands, Compose configuration, and hardened deployment examples.
Expand Down
16 changes: 12 additions & 4 deletions docs/pricing-history.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Dated OpenAI pricing

Research window: **2025-08-07 to 2026-09-23**, covering more than twelve months.
Catalog: `public/pricing-catalog.js`, version `2026-09-23.1`.
Last source review: 2026-09-23 (Europe/Paris). Next routine review: 2026-10-23.
Research window: **2025-08-07 to 2026-09-30**, covering more than twelve months.
Catalog: `public/pricing-catalog.js`, version `2026-09-30.1`.
Last source review: 2026-09-30 (Europe/Paris). Next routine review: 2026-10-30.

## What the dashboard measures

Expand Down Expand Up @@ -39,6 +39,14 @@ Standard text-token amounts below are USD per million **input / cached input / o

The changelog also covers image, audio, video, tools and storage products. Examples in this window include the December 2025 image-model release, April 2026 image-model release and June 2026 container billing granularity change. Their counters/units are not present in this dashboard's token observations, so they are not silently mixed into text-token estimates. This is a sourced history for supported text/Codex models, not a claim to reconstruct every OpenAI product's invoices or every account-specific contract.

### GPT-6.1 Sol — September 29, 2026

The [API changelog](https://developers.openai.com/api/docs/changelog) dates `gpt-6.1-sol` to September 29. It is a distinct model, not an alias or a price change for `gpt-6-sol`. The [API card](https://developers.openai.com/api/docs/pricing) and [model card](https://developers.openai.com/api/docs/models/gpt-6.1-sol) give $2 / $0.10 / $10 per million input / cached input / output tokens, with $2.50 cache writes. Above 272K input tokens, the whole request uses 2x input/cache/write and 1.5x output; Fast stacks another 2x.

The [Codex card](https://learn.chatgpt.com/docs/pricing#token-rates) gives 50 / 2.5 / 250 credits per million tokens, without a separate cache-write charge. The [speed documentation](https://learn.chatgpt.com/docs/agent-configuration/speed) distinguishes purchased-credit/Enterprise Fast billing (2x) from included-subscription consumption (2.5x). Sol 6.1 credit totals and exports use 2x; quota capacity calibration and forecasts use 2.5x. Earlier model periods retain their previously recorded factors; this addition does not backdate the current distinction across old history. Historical Fast observation gates remain September 23 even when the catalog review date advances.

Rates are reviewed on September 30 and applied from the day-only launch boundary at 00:00 UTC on September 29; launch-day calls remain estimated. The date-suffixed ID is recognized, while undocumented moving aliases, private suffixes and unsupported Batch/Flex/Ultrafast tiers remain unrated.

## Evidence, precision and missing history

- `documented`: dated announcement plus published amounts/rules. Base periods continue until the next documented change. This cannot prove the absence of an unannounced/account-specific change.
Expand All @@ -52,7 +60,7 @@ The changelog also covers image, audio, video, tools and storage products. Examp

## GPT-6 and accounting boundaries

For GPT-6 Astra, Sol, and Luna API calls, prompts **strictly above 272,000 input tokens** apply 2x to input/cache and 1.5x to output for the whole request. API Fast applies another 2x. These API factors are not copied into the credit calculator; Codex credits use their own published 2.5x Fast factor.
For GPT-6 Astra, Sol, Luna and GPT-6.1 Sol API calls, prompts **strictly above 272,000 input tokens** apply 2x to input/cache and 1.5x to output for the whole request. API Fast applies another 2x. These API factors are not copied into the credit calculator. Sol 6.1 uses the distinct credit/subscription Fast factors described above; earlier periods retain their recorded factors.

Input includes cached reads and cache writes, so ordinary fresh input is `inputTokens - cachedInputTokens - cacheWriteInputTokens`. The [official cache cost example](https://developers.openai.com/api/docs/guides/prompt-caching) confirms this accounting. Reasoning output is already part of output tokens and is not charged twice. Invalid/nonfinite counters and cache exceeding input are reported rather than coerced into a plausible amount. A missing published cached rate is `null`, not a free cache price.

Expand Down
6 changes: 3 additions & 3 deletions mesh-ingress/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion mesh-ingress/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"wrangler": "4.123.0"
},
"overrides": {
"sharp": "0.35.4"
"sharp": "0.35.4",
"undici": "7.29.1"
}
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "codex-usage-dashboard",
"private": true,
"version": "1.5.4",
"version": "1.5.5",
"description": "An independent, privacy-conscious local dashboard for Codex usage, model calls, timing, and theoretical cost.",
"license": "AGPL-3.0-or-later",
"type": "module",
Expand Down
4 changes: 2 additions & 2 deletions public/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -1037,7 +1037,7 @@ function renderQuotaPage() {
const credits = codexCreditsOfCalls(calls);
const calibrationAt = Date.parse(quota?.peakObservedAt || quota?.observedAt);
const calibrationCalls = Number.isFinite(calibrationAt) ? calls.filter((call) => Date.parse(call.timestamp) <= calibrationAt) : [];
const calibrationCredits = codexCreditsOfCalls(calibrationCalls);
const calibrationCredits = codexCreditsOfCalls(calibrationCalls, { billing: "subscription" });
const observedPercent = Number(quota?.peakUsedPercent ?? quota?.usedPercent);
const estimatedCapacity = observedPercent > 0 && calibrationCredits.credits > 0 ? calibrationCredits.credits * 100 / observedPercent : null;
const capacityPartial = calibrationCredits.unratedCalls > 0;
Expand Down Expand Up @@ -1074,7 +1074,7 @@ function forecastDateTimeLabel(value) {
function quotaForecastSamples(quota) {
const sessions = (state.data?.sessions || []).filter((session) => !quota?.nodeId || session.nodeId === quota.nodeId);
return sessions.flatMap((session) => session.calls.map((call) => {
const priced = codexCreditsOfCalls([call]);
const priced = codexCreditsOfCalls([call], { billing: "subscription" });
return { timestamp: call.timestamp, value: priced.credits, rated: priced.unratedCalls === 0 };
}));
}
Expand Down
19 changes: 15 additions & 4 deletions public/pricing-catalog.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
// Public, offline rate history. Evidence and maintenance: docs/pricing-history.md.
// Day-only announcements use 00:00 UTC; their boundary day remains estimated.
export const PRICING_CATALOG_VERSION = "2026-09-23.1";
export const PRICING_VERIFIED_AT = "2026-09-23";
export const PRICING_CATALOG_VERSION = "2026-09-30.1";
export const PRICING_VERIFIED_AT = "2026-09-30";
export const PRICING_RESEARCHED_FROM = "2025-08-07";
export const PRICING_REVIEW_AFTER = "2026-10-23";
export const PRICING_REVIEW_AFTER = "2026-10-30";
export const PRICING_SOURCES = Object.freeze({
api: "https://developers.openai.com/api/docs/pricing",
credits: "https://learn.chatgpt.com/docs/pricing",
Expand All @@ -21,6 +21,7 @@ export const PRICING_SOURCES = Object.freeze({
gpt6Launch: "https://openai.com/index/introducing-gpt-6-sol-and-luna/",
gpt6Sol: "https://developers.openai.com/api/docs/models/gpt-6-sol",
gpt6Luna: "https://developers.openai.com/api/docs/models/gpt-6-luna",
gpt61Sol: "https://developers.openai.com/api/docs/models/gpt-6.1-sol",
});

const entries = [];
Expand All @@ -40,7 +41,7 @@ const credits = (...args) => add("credits", ...args);
const long = { longContextThreshold: 272_000 };
// Rates whose historical Fast availability was not established are only enabled
// from the date of direct verification. Earlier Fast calls stay visibly unrated.
const currentFast = (multiplier) => ({ fastMultiplier: multiplier, fastFrom: PRICING_VERIFIED_AT });
const currentFast = (multiplier) => ({ fastMultiplier: multiplier, fastFrom: "2026-09-23" });

api("gpt-5", "2025-08-07", [1.25, 0.125, 10], { sources: ["gpt5", "api"], ...currentFast(2) });
api("gpt-5-mini", "2025-08-07", [0.25, 0.025, 2], { sources: ["gpt5", "api"], ...currentFast(1.8) });
Expand Down Expand Up @@ -81,6 +82,10 @@ const gpt6Api = {
};
api("gpt-6-sol", "2026-09-22", [2, 0.2, 10], { ...gpt6Api, sources: ["gpt6Launch", "gpt6Sol", "api", "changelog"] });
api("gpt-6-luna", "2026-09-22", [0.1, 0.01, 0.5], { ...gpt6Api, sources: ["gpt6Launch", "gpt6Luna", "api", "changelog"] });
api("gpt-6.1-sol", "2026-09-29", [2, 0.1, 10], {
...long, fastMultiplier: 2, fastFrom: "2026-09-29", fastLongContextFrom: "2026-09-29",
cacheWriteMultiplier: 1.25, sources: ["gpt61Sol", "api", "changelog"],
});

// Codex credits are independent of API USD. Before our dated observation on
// August 11 the older token rate cards are not recoverable from these sources.
Expand All @@ -99,6 +104,12 @@ credits("gpt-5.6-sol", "2026-08-21", [100, 10, 500], { ...creditOptions(2.5), ev
credits("gpt-6-astra", "2026-09-03", [250, 25, 1250], { fastMultiplier: 2.5, fastFrom: "2026-09-03", sources: ["credits", "speed", "changelog"] });
credits("gpt-6-sol", "2026-09-22", [50, 5, 250], { fastMultiplier: 2.5, fastFrom: "2026-09-22", sources: ["credits", "speed", "codexChangelog"] });
credits("gpt-6-luna", "2026-09-22", [2.5, 0.25, 12.5], { fastMultiplier: 2.5, fastFrom: "2026-09-22", sources: ["credits", "speed", "codexChangelog"] });
// Purchased credits and included subscription limits have distinct Fast factors.
// Older periods retain the factors recorded with their original evidence.
credits("gpt-6.1-sol", "2026-09-29", [50, 2.5, 250], {
fastMultiplier: 2, subscriptionFastMultiplier: 2.5, fastFrom: "2026-09-29",
sources: ["credits", "speed", "changelog"],
});

for (const entry of entries) {
const next = entries.filter((candidate) => candidate.billing === entry.billing && candidate.model === entry.model && candidate.effectiveFrom > entry.effectiveFrom).sort((a, b) => a.effectiveFrom.localeCompare(b.effectiveFrom))[0];
Expand Down
Loading
Loading