Metadata-Version: 2.4
Name: codex-lb
Version: 1.14.0
Summary: Codex load balancer and proxy for ChatGPT accounts with usage dashboard
Author-email: Soju06 <qlskssk@gmail.com>
Maintainer-email: Soju06 <qlskssk@gmail.com>, choi138 <kidjustinchoi@gmail.com>, aaiyer <aaiyer0@proton.me>
License: MIT License
        
        Copyright (c) 2025 Soju06
        
        Permission is hereby granted, free of charge, to any person obtaining a copy
        of this software and associated documentation files (the "Software"), to deal
        in the Software without restriction, including without limitation the rights
        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        copies of the Software, and to permit persons to whom the Software is
        furnished to do so, subject to the following conditions:
        
        The above copyright notice and this permission notice shall be included in all
        copies or substantial portions of the Software.
        
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        SOFTWARE.
License-File: LICENSE
Keywords: chatgpt,codex,dashboard,fastapi,load-balancer,proxy,rate-limit,usage
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Console
Classifier: Framework :: FastAPI
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Internet :: Proxy Servers
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: System :: Networking
Requires-Python: >=3.13
Requires-Dist: aiohttp-retry>=2.9.1
Requires-Dist: aiohttp>=3.13.3
Requires-Dist: aiosqlite>=0.22.1
Requires-Dist: alembic>=1.16.5
Requires-Dist: asyncpg>=0.30.0
Requires-Dist: bcrypt>=4.3.0
Requires-Dist: brotli>=1.2.0
Requires-Dist: cryptography>=46.0.3
Requires-Dist: fastapi[standard]>=0.128.0
Requires-Dist: greenlet>=3.3.0
Requires-Dist: psycopg[binary]>=3.2.12
Requires-Dist: pydantic-settings>=2.12.0
Requires-Dist: pydantic>=2.12.5
Requires-Dist: pyotp>=2.9.0
Requires-Dist: python-dotenv>=1.2.1
Requires-Dist: python-multipart>=0.0.21
Requires-Dist: segno>=1.6.6
Requires-Dist: sqlalchemy>=2.0.45
Requires-Dist: websockets>=16.0
Requires-Dist: zstandard>=0.25.0
Provides-Extra: metrics
Requires-Dist: prometheus-client>=0.20; extra == 'metrics'
Provides-Extra: tracing
Requires-Dist: opentelemetry-api>=1.25; extra == 'tracing'
Requires-Dist: opentelemetry-exporter-otlp>=1.25; extra == 'tracing'
Requires-Dist: opentelemetry-instrumentation-aiohttp-client>=0.46; extra == 'tracing'
Requires-Dist: opentelemetry-instrumentation-fastapi>=0.46; extra == 'tracing'
Requires-Dist: opentelemetry-instrumentation-sqlalchemy>=0.46; extra == 'tracing'
Requires-Dist: opentelemetry-sdk>=1.25; extra == 'tracing'
Description-Content-Type: text/markdown

# codex-lb

Load balancer for ChatGPT accounts. Pool multiple accounts, track usage, manage API keys, view everything in a dashboard.

| ![dashboard](docs/screenshots/dashboard.jpg) | ![accounts](docs/screenshots/accounts.jpg) |
|:---:|:---:|

More screenshots

| Settings | Login |
|:---:|:---:|
| ![settings](docs/screenshots/settings.jpg) | ![login](docs/screenshots/login.jpg) |

| Dashboard (dark) | Accounts (dark) | Settings (dark) |
|:---:|:---:|:---:|
| ![dashboard-dark](docs/screenshots/dashboard-dark.jpg) | ![accounts-dark](docs/screenshots/accounts-dark.jpg) | ![settings-dark](docs/screenshots/settings-dark.jpg) |

## Features

 Account Pooling
Load balance across multiple ChatGPT accounts
 Usage Tracking
Per-account tokens, cost, 28-day trends
 API Keys
Per-key rate limits by token, cost, window, model

 Dashboard Auth
Password + optional TOTP
 OpenAI-compatible
Codex CLI, OpenCode, any OpenAI client
 Auto Model Sync
Available models fetched from upstream

## Quick Start

```bash
# Docker (recommended)
docker volume create codex-lb-data
docker run -d --name codex-lb \
  -p 2455:2455 -p 1455:1455 \
  -v codex-lb-data:/var/lib/codex-lb \
  ghcr.io/soju06/codex-lb:latest

# or uvx
uvx codex-lb
```

Open [localhost:2455](http://localhost:2455) → Add account → Done.

## Remote Setup

When accessing the dashboard remotely for the first time, a bootstrap token is required to set the initial password.

**Auto-generated (default):** On first startup (no password configured), the server generates a one-time token and prints it to logs:

```bash
docker logs codex-lb
# ============================================
#   Dashboard bootstrap token (first-run):
#   <token>
# ============================================
```

Open the dashboard → enter the token + new password → done. The token is shared across replicas and remains valid until a password is set. In multi-replica setups, replicas must share the same encryption key (the Helm chart default) for restart recovery to work.

**Manual token:** To use a fixed token instead, set the env var before starting:

```bash
docker run -d --name codex-lb \
  -e CODEX_LB_DASHBOARD_BOOTSTRAP_TOKEN=your-secret-token \
  -p 2455:2455 -p 1455:1455 \
  -v codex-lb-data:/var/lib/codex-lb \
  ghcr.io/soju06/codex-lb:latest
```

**Local access** (localhost) bypasses bootstrap entirely — no token needed.

## Client Setup

Point any OpenAI-compatible client at codex-lb. If [API key auth](#api-key-authentication) is enabled, pass a key from the dashboard as a Bearer token.

| Logo | Client | Endpoint | Config |
|---|--------|----------|--------|
| OpenAI | **Codex CLI** | `http://127.0.0.1:2455/backend-api/codex` | `~/.codex/config.toml` |
| OpenCode | **OpenCode** | `http://127.0.0.1:2455/v1` | `~/.config/opencode/opencode.json` |
| OpenClaw | **OpenClaw** | `http://127.0.0.1:2455/v1` | `~/.openclaw/openclaw.json` |
| Python | **OpenAI Python SDK** | `http://127.0.0.1:2455/v1` | Code |

OpenAI Codex CLI / IDE Extension

`~/.codex/config.toml`:

```toml
model = "gpt-5.3-codex"
model_reasoning_effort = "xhigh"
model_provider = "codex-lb"

[model_providers.codex-lb]
name = "OpenAI"  # required — enables remote /responses/compact
base_url = "http://127.0.0.1:2455/backend-api/codex"
wire_api = "responses"
supports_websockets = true
requires_openai_auth = true # required for codex app
```

Optional: enable native upstream WebSockets for Codex streaming while keeping `codex-lb` pooling:

```bash
export CODEX_LB_UPSTREAM_STREAM_TRANSPORT=websocket
```

`auto` is the default and uses native WebSockets for native Codex headers or models that prefer them.
You can also switch this in the dashboard under Settings -> Routing -> Upstream stream transport.

Note: Codex itself does not currently expose a stable documented `wire_api = "websocket"` provider mode.
If you want to experiment on the Codex side, the current CLI exposes under-development feature flags:

```toml
[features]
responses_websockets = true
# or
responses_websockets_v2 = true
```

These flags are experimental and do not replace `wire_api = "responses"`.

If upstream websocket handshakes must use environment proxies in your deployment, set
`CODEX_LB_UPSTREAM_WEBSOCKET_TRUST_ENV=true`. By default websocket handshakes connect directly to
match Codex CLI's native transport.

**With [API key auth](#api-key-authentication):**

```toml
[model_providers.codex-lb]
name = "OpenAI"
base_url = "http://127.0.0.1:2455/backend-api/codex"
wire_api = "responses"
env_key = "CODEX_LB_API_KEY"
supports_websockets = true
requires_openai_auth = true # required for codex app
```

```bash
export CODEX_LB_API_KEY="sk-clb-..."   # key from dashboard
codex
```

**Verify WebSocket transport**

Use a one-off debug run:

```bash
RUST_LOG=debug codex exec "Reply with OK only."
```

Healthy websocket signals:

- CLI logs contain `connecting to websocket` and `successfully connected to websocket`
- `codex-lb` logs show `WebSocket /backend-api/codex/responses`
- `codex-lb` logs do **not** show fallback `POST /backend-api/codex/responses` for the same run

If you run `codex-lb` behind a reverse proxy, make sure it forwards WebSocket upgrades.

**Migrating from direct OpenAI** — `codex resume` filters by `model_provider`;
old sessions won't appear until you re-tag them:

```bash
# JSONL session files (all versions)
find ~/.codex/sessions -name '*.jsonl' \
  -exec sed -i '' 's/"model_provider":"openai"/"model_provider":"codex-lb"/g' {} +

# SQLite state DB (>= v0.105.0, creates ~/.codex/state_*.sqlite)
sqlite3 ~/.codex/state_5.sqlite \
  "UPDATE threads SET model_provider = 'codex-lb' WHERE model_provider = 'openai';"
```


OpenCode OpenCode

> **Important**: Use the built-in `openai` provider with `baseURL` override — not a custom provider with `@ai-sdk/openai-compatible`. Custom providers use the Chat Completions API which **drops reasoning/thinking content**. The built-in `openai` provider uses the Responses API, which properly preserves `encrypted_content` and multi-turn reasoning state.

Before starting, please ensure that all existing OpenAI credentials is cleared in `~/.local/share/opencode/auth.json`
You can clean the config by using this one-liner
`jq 'del(.openai)' ~/.local/share/opencode/auth.json > auth.json.tmp && mv auth.json.tmp ~/.local/share/opencode/auth.json`

`~/.config/opencode/opencode.json`:

```jsonc
{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "openai": {
      "options": {
        "baseURL": "http://127.0.0.1:2455/v1",
        "apiKey": "{env:CODEX_LB_API_KEY}"
      },
      "models": {
        "gpt-5.4": {
          "name": "GPT-5.4",
          "reasoning": true,
          "options": { "reasoningEffort": "high", "reasoningSummary": "detailed" },
          "limit": { "context": 1050000, "output": 128000 }
        },
        "gpt-5.3-codex": {
          "name": "GPT-5.3 Codex",
          "reasoning": true,
          "options": { "reasoningEffort": "high", "reasoningSummary": "detailed" },
          "limit": { "context": 272000, "output": 65536 }
        },
        "gpt-5.1-codex-mini": {
          "name": "GPT-5.1 Codex Mini",
          "reasoning": true,
          "options": { "reasoningEffort": "high", "reasoningSummary": "detailed" },
          "limit": { "context": 272000, "output": 65536 }
        },
        "gpt-5.3-codex-spark": {
          "name": "GPT-5.3 Codex Spark",
          "reasoning": true,
          "options": { "reasoningEffort": "xhigh", "reasoningSummary": "detailed" },
          "limit": { "context": 128000, "output": 65536 }
        }
      }
    }
  },
  "model": "openai/gpt-5.3-codex"
}
```

This overrides the built-in `openai` provider's endpoint to point at codex-lb while keeping the Responses API code path that handles reasoning properly.

```bash
export CODEX_LB_API_KEY="sk-clb-..."   # key from dashboard
opencode
```


OpenClaw OpenClaw

`~/.openclaw/openclaw.json`:

```jsonc
{
  "agents": {
    "defaults": {
      "model": { "primary": "codex-lb/gpt-5.4" },
      "models": {
        "codex-lb/gpt-5.4": { "params": { "cacheRetention": "short" } }
        "codex-lb/gpt-5.4-mini": { "params": { "cacheRetention": "short" } }
        "codex-lb/gpt-5.3-codex": { "params": { "cacheRetention": "short" } }
      }
    }
  },
  "models": {
    "mode": "merge",
    "providers": {
      "codex-lb": {
        "baseUrl": "http://127.0.0.1:2455/v1",
        "apiKey": "${CODEX_LB_API_KEY}",   // or "dummy" if API key auth is disabled
        "api": "openai-responses",
        "models": [
          {
            "id": "gpt-5.4",
            "name": "gpt-5.4 (codex-lb)",
            "contextWindow": 1050000,
            "contextTokens": 272000,
            "maxTokens": 4096,
            "input": ["text"],
            "reasoning": false
          },
          {
            "id": "gpt-5.4-mini",
            "name": "gpt-5.4-mini (codex-lb)",
            "contextWindow": 400000,
            "contextTokens": 272000,
            "maxTokens": 4096,
            "input": ["text"],
            "reasoning": false
          },
          {
            "id": "gpt-5.3-codex",
            "name": "gpt-5.3-codex (codex-lb)",
            "contextWindow": 400000,
            "contextTokens": 272000,
            "maxTokens": 4096,
            "input": ["text"],
            "reasoning": false
          }
        ]
      }
    }
  }
}
```

Set the env var or replace `${CODEX_LB_API_KEY}` with a key from the dashboard. If API key auth is disabled,
local requests can omit the key, but non-local requests are still rejected until proxy authentication is configured.

Python OpenAI Python SDK

```python
from openai import OpenAI

client = OpenAI(
    base_url="http://127.0.0.1:2455/v1",
    api_key="sk-clb-...",  # from dashboard, or any non-empty string if auth is disabled
)

response = client.chat.completions.create(
    model="gpt-5.3-codex",
    messages=[{"role": "user", "content": "Hello!"}],
)
print(response.choices[0].message.content)
```


## API Key Authentication

API key auth is **disabled by default**. In that mode, only local requests to the protected proxy routes can
proceed without a key; non-local requests are rejected until proxy authentication is configured. Enable it in
**Settings → API Key Auth** on the dashboard when clients connect remotely or through Docker, VM, or container
networking that appears non-local to the service.

When enabled, clients must pass a valid API key as a Bearer token:

```
Authorization: Bearer sk-clb-...
```

The protected proxy routes covered by this setting are:

- `/v1/*` (except `/v1/usage`, which always requires a valid key)
- `/backend-api/codex/*`
- `/backend-api/transcribe`

**Creating keys**: Dashboard → API Keys → Create. The full key is shown **only once** at creation. Keys support optional expiration, model restrictions, and rate limits (tokens / cost per day / week / month).

## Configuration

Environment variables with `CODEX_LB_` prefix or `.env.local`. See [`.env.example`](.env.example).
SQLite is the default database backend; PostgreSQL is optional via `CODEX_LB_DATABASE_URL` (for example `postgresql+asyncpg://...`).

### Dashboard authentication modes

`codex-lb` supports three dashboard auth modes via environment variables:

- `CODEX_LB_DASHBOARD_AUTH_MODE=standard` — built-in dashboard password with optional TOTP from the Settings page.
- `CODEX_LB_DASHBOARD_AUTH_MODE=trusted_header` — trust a reverse-proxy auth header such as Authelia's `Remote-User`, but only from `CODEX_LB_FIREWALL_TRUSTED_PROXY_CIDRS`. Built-in password/TOTP remain available as an optional fallback, and password/TOTP management still requires a fallback password session.
- `CODEX_LB_DASHBOARD_AUTH_MODE=disabled` — fully bypass dashboard auth. Use only behind network restrictions or external auth. Built-in password/TOTP management is disabled in this mode.

`trusted_header` mode also requires:

```bash
CODEX_LB_FIREWALL_TRUST_PROXY_HEADERS=true
CODEX_LB_FIREWALL_TRUSTED_PROXY_CIDRS=172.18.0.0/16
CODEX_LB_DASHBOARD_AUTH_PROXY_HEADER=Remote-User
```

If the trusted header is missing and no fallback password is configured, the dashboard fails closed and shows a reverse-proxy-required message instead of loading the UI.

### Docker examples

**Authelia / trusted header**

```bash
docker run -d --name codex-lb \
  -p 2455:2455 -p 1455:1455 \
  -e CODEX_LB_DASHBOARD_AUTH_MODE=trusted_header \
  -e CODEX_LB_DASHBOARD_AUTH_PROXY_HEADER=Remote-User \
  -e CODEX_LB_FIREWALL_TRUST_PROXY_HEADERS=true \
  -e CODEX_LB_FIREWALL_TRUSTED_PROXY_CIDRS=172.18.0.0/16 \
  -v codex-lb-data:/var/lib/codex-lb \
  ghcr.io/soju06/codex-lb:latest
```

**Hard override / no app-level dashboard auth**

```bash
docker run -d --name codex-lb \
  -p 2455:2455 -p 1455:1455 \
  -e CODEX_LB_DASHBOARD_AUTH_MODE=disabled \
  -v codex-lb-data:/var/lib/codex-lb \
  ghcr.io/soju06/codex-lb:latest
```

For Helm, pass the same values through `extraEnv`.

## Data

| Environment | Path |
|-------------|------|
| Local / uvx | `~/.codex-lb/` |
| Docker | `/var/lib/codex-lb/` |

Backup this directory to preserve your data.

## Kubernetes

```bash
helm install codex-lb oci://ghcr.io/soju06/charts/codex-lb \
  --set postgresql.auth.password=changeme \
  --set config.databaseMigrateOnStartup=true \
  --set migration.schemaGate.enabled=false
kubectl port-forward svc/codex-lb 2455:2455
```

Open [localhost:2455](http://localhost:2455) → Add account → Done.

The Helm chart auto-configures HTTP `/responses` owner handoff for multi-replica installs using a headless-service DNS name per pod. The default cluster domain is `cluster.local`; set Helm `clusterDomain` if your cluster uses a different suffix. Override `config.sessionBridgeAdvertiseBaseUrl` only if pods must be reached through a different internal address.

For external database, production config, ingress, observability, and more see the [Helm chart README](deploy/helm/codex-lb/README.md).

## Development

```bash
# Docker
docker compose watch

# Local
uv sync && cd frontend && bun install && cd ..
uv run fastapi run app/main.py --reload        # backend :2455
cd frontend && bun run dev                     # frontend :5173
```

## Contributors ✨

Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):

       Soju06
Soju06 (https://github.com/Soju06)
💻 (https://github.com/Soju06/codex-lb/commits?author=Soju06) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=Soju06) 🚧 🚇
       Jonas Kamsker
Jonas Kamsker (http://jonas.kamsker.at/)
💻 (https://github.com/Soju06/codex-lb/commits?author=JKamsker) 🐛 (https://github.com/Soju06/codex-lb/issues?q=author%3AJKamsker) 🚧
       Quack
Quack (https://github.com/Quack6765)
💻 (https://github.com/Soju06/codex-lb/commits?author=Quack6765) 🐛 (https://github.com/Soju06/codex-lb/issues?q=author%3AQuack6765) 🚧 🎨
       Jill Kok, San Mou
Jill Kok, San Mou (https://github.com/hhsw2015)
💻 (https://github.com/Soju06/codex-lb/commits?author=hhsw2015) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=hhsw2015) 🚧 🐛 (https://github.com/Soju06/codex-lb/issues?q=author%3Ahhsw2015)
       PARK CHANYOUNG
PARK CHANYOUNG (https://github.com/pcy06)
📖 (https://github.com/Soju06/codex-lb/commits?author=pcy06) 💻 (https://github.com/Soju06/codex-lb/commits?author=pcy06) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=pcy06)
       Choi138
Choi138 (https://github.com/choi138)
💻 (https://github.com/Soju06/codex-lb/commits?author=choi138) 🐛 (https://github.com/Soju06/codex-lb/issues?q=author%3Achoi138) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=choi138)
       LYA⚚CAP⚚OCEAN
LYA⚚CAP⚚OCEAN (https://github.com/dwnmf)
💻 (https://github.com/Soju06/codex-lb/commits?author=dwnmf) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=dwnmf)

       Eugene Korekin
Eugene Korekin (https://github.com/azkore)
💻 (https://github.com/Soju06/codex-lb/commits?author=azkore) 🐛 (https://github.com/Soju06/codex-lb/issues?q=author%3Aazkore) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=azkore)
       jordan
jordan (https://github.com/JordxnBN)
💻 (https://github.com/Soju06/codex-lb/commits?author=JordxnBN) 🐛 (https://github.com/Soju06/codex-lb/issues?q=author%3AJordxnBN) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=JordxnBN)
       DOCaCola
DOCaCola (https://github.com/DOCaCola)
🐛 (https://github.com/Soju06/codex-lb/issues?q=author%3ADOCaCola) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=DOCaCola) 📖 (https://github.com/Soju06/codex-lb/commits?author=DOCaCola)
       JoeBlack2k
JoeBlack2k (https://github.com/joeblack2k)
💻 (https://github.com/Soju06/codex-lb/commits?author=joeblack2k) 🐛 (https://github.com/Soju06/codex-lb/issues?q=author%3Ajoeblack2k) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=joeblack2k)
       Peter A.
Peter A. (https://github.com/ink-splatters)
📖 (https://github.com/Soju06/codex-lb/commits?author=ink-splatters) 💻 (https://github.com/Soju06/codex-lb/commits?author=ink-splatters) 🐛 (https://github.com/Soju06/codex-lb/issues?q=author%3Aink-splatters)
       Hannah Markfort
Hannah Markfort (https://github.com/xCatalitY)
💻 (https://github.com/Soju06/codex-lb/commits?author=xCatalitY) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=xCatalitY)
       mws-weekend-projects
mws-weekend-projects (https://github.com/mws-weekend-projects)
💻 (https://github.com/Soju06/codex-lb/commits?author=mws-weekend-projects) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=mws-weekend-projects)

       Quang Do
Quang Do (http://hextra.us)
💻 (https://github.com/Soju06/codex-lb/commits?author=quangdo126) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=quangdo126)
       Anand Aiyer
Anand Aiyer (https://github.com/aaiyer)
🐛 (https://github.com/Soju06/codex-lb/issues?q=author%3Aaaiyer) 💻 (https://github.com/Soju06/codex-lb/commits?author=aaiyer) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=aaiyer)
       defin85
defin85 (https://github.com/defin85)
💻 (https://github.com/Soju06/codex-lb/commits?author=defin85) 🐛 (https://github.com/Soju06/codex-lb/issues?q=author%3Adefin85) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=defin85)
       Jacky Fong
Jacky Fong (https://linktree.huzky.dev/)
💻 (https://github.com/Soju06/codex-lb/commits?author=huzky-v) 🐛 (https://github.com/Soju06/codex-lb/issues?q=author%3Ahuzky-v) 💬 🚧 ⚠️ (https://github.com/Soju06/codex-lb/commits?author=huzky-v)
       flokosti96
flokosti96 (https://github.com/flokosti96)
💻 (https://github.com/Soju06/codex-lb/commits?author=flokosti96) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=flokosti96)
       Woonggi Min
Woonggi Min (https://github.com/minpeter)
💻 (https://github.com/Soju06/codex-lb/commits?author=minpeter) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=minpeter)
       Yigit Konur
Yigit Konur (https://www.linkedin.com/in/yigitkonur/)
🐛 (https://github.com/Soju06/codex-lb/issues?q=author%3Ayigitkonur) 💻 (https://github.com/Soju06/codex-lb/commits?author=yigitkonur)

       Ruben
Ruben (https://github.com/Daltonganger)
💻 (https://github.com/Soju06/codex-lb/commits?author=Daltonganger) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=Daltonganger) 🐛 (https://github.com/Soju06/codex-lb/issues?q=author%3ADaltonganger)
       Steve Santacroce
Steve Santacroce (https://github.com/L1st3r)
💻 (https://github.com/Soju06/codex-lb/commits?author=L1st3r) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=L1st3r) 🐛 (https://github.com/Soju06/codex-lb/issues?q=author%3AL1st3r)
       Hugh Do
Hugh Do (https://github.com/mhughdo)
💻 (https://github.com/Soju06/codex-lb/commits?author=mhughdo) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=mhughdo)
       Hubert Salwin
Hubert Salwin (https://github.com/salwinh)
💻 (https://github.com/Soju06/codex-lb/commits?author=salwinh) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=salwinh)
       Teemu Koskinen
Teemu Koskinen (https://github.com/Daeroni)
📖 (https://github.com/Soju06/codex-lb/commits?author=Daeroni)
       Yu Peng Zheng
Yu Peng Zheng (http://felixypz.me)
📖 (https://github.com/Soju06/codex-lb/commits?author=Felix201209) 💻 (https://github.com/Soju06/codex-lb/commits?author=Felix201209)
       embogomolov
embogomolov (https://github.com/embogomolov)
💻 (https://github.com/Soju06/codex-lb/commits?author=embogomolov) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=embogomolov)

       Renat Sharipov
Renat Sharipov (https://github.com/SHAREN)
💻 (https://github.com/Soju06/codex-lb/commits?author=SHAREN) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=SHAREN)
       Liu Rui
Liu Rui (https://ximatai.net)
📖 (https://github.com/Soju06/codex-lb/commits?author=aruis)
       OverHash
OverHash (https://github.com/OverHash)
💻 (https://github.com/Soju06/codex-lb/commits?author=OverHash) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=OverHash)
       Kazet
Kazet (https://github.com/Kazet111)
💻 (https://github.com/Soju06/codex-lb/commits?author=Kazet111) ⚠️ (https://github.com/Soju06/codex-lb/commits?author=Kazet111)

This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
