{"id":49524807,"url":"https://github.com/b-nnett/codex-plusplus","last_synced_at":"2026-05-05T05:01:50.486Z","repository":{"id":355004635,"uuid":"1223449495","full_name":"b-nnett/codex-plusplus","owner":"b-nnett","description":"Codex++ tweak system for the Codex desktop app","archived":false,"fork":false,"pushed_at":"2026-05-03T02:09:24.000Z","size":4143,"stargazers_count":859,"open_issues_count":13,"forks_count":42,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-05-04T04:33:07.794Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/b-nnett.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-28T10:35:16.000Z","updated_at":"2026-05-04T03:10:32.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/b-nnett/codex-plusplus","commit_stats":null,"previous_names":["b-nnett/codex-plusplus"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/b-nnett/codex-plusplus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/b-nnett%2Fcodex-plusplus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/b-nnett%2Fcodex-plusplus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/b-nnett%2Fcodex-plusplus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/b-nnett%2Fcodex-plusplus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/b-nnett","download_url":"https://codeload.github.com/b-nnett/codex-plusplus/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/b-nnett%2Fcodex-plusplus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32636108,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-04T10:08:07.713Z","status":"online","status_checked_at":"2026-05-05T02:00:06.033Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-02T02:11:13.560Z","updated_at":"2026-05-05T05:01:50.442Z","avatar_url":"https://github.com/b-nnett.png","language":"TypeScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# Codex++\n\n[Join the Discord Community!](https://discord.gg/6bY6gGX36H)\n\nA tweak system for the [Codex](https://chatgpt.com/codex) desktop app. Inject custom features, fix UI bugs, and add a tweak manager — without rebuilding the app.\n\n\u003e **Status:** ~~alpha~~ Beta! Confirmed working on both macOS \u0026 Windows. Expect bugs, especially around auto-updating and new Codex updates. PRs welcome.\n\n\u003cimg width=\"1413\" height=\"1016\" alt=\"Screenshot 2026-04-28 at 19 42 56\" src=\"https://github.com/user-attachments/assets/ea0b2ffc-c30d-4f68-ae12-dd8d6a997b2f\" /\u003e\n\n## What it does\n\n`codex-plusplus` patches your local Codex.app installation so a small **loader** runs on startup. The loader pulls a **runtime** from your user directory, which discovers and loads **tweaks** (small ESM modules with a manifest + `start/stop` lifecycle). The runtime injects a \"Tweaks\" tab into Codex's settings UI so you can enable, disable, and configure tweaks in-app.\n\nEverything beyond the one-time install patch lives **outside** the app bundle, so iterating on tweaks is just save-and-reload.\n\n## Install\n\nAgentic Install (via Codex):\n\n```sh\nInspect \u0026 install this for me: https://github.com/b-nnett/codex-plusplus, tell me where you install it and send me the local path for me to add new tweaks.\n```\n\nBun:\n\n```sh\nbun install -g github:b-nnett/codex-plusplus\ncodexplusplus install\n```\n\nSource bootstrap (macOS / Linux):\n\n```sh\ncurl -fsSL https://raw.githubusercontent.com/b-nnett/codex-plusplus/main/install.sh | bash\n```\n\nWindows PowerShell:\n\n```powershell\nirm https://raw.githubusercontent.com/b-nnett/codex-plusplus/main/install.ps1 | iex\n```\n\nThat's it. The installer:\n\n1. Locates your Codex.app (`/Applications/Codex.app`, `%LOCALAPPDATA%/codex/...`, etc.).\n2. Backs it up to `~/.codex-plusplus/backup/`.\n3. Patches `app.asar` to require our loader.\n4. Recomputes the asar header SHA-256 and writes it into `Info.plist` (`ElectronAsarIntegrity`).\n5. Flips `EnableEmbeddedAsarIntegrityValidation` in the Electron Framework binary as a belt-and-suspenders.\n6. Re-signs the app ad-hoc on macOS (`codesign --force --deep --sign -`).\n7. Installs a launch agent / login item that detects app updates and re-runs `repair --quiet`.\n8. Installs the default tweak set from their latest GitHub releases unless `--no-default-tweaks` is passed.\n\nThe watcher also runs hourly through the GitHub-installed local CLI. If a newer Codex++ GitHub release is available, it downloads the release, rebuilds the local CLI/runtime, and runs `repair` so the runtime in your user directory is refreshed without replacing tweak code. You can turn this off from Settings → Codex Plus Plus → Config.\n\nAfter source-bootstrap install, the installer adds `codexplusplus` and `codex-plusplus`\nto a writable PATH directory when possible. Use `codexplusplus` for day-to-day commands:\n\n```sh\ncodexplusplus status\ncodexplusplus repair\ncodexplusplus update\n```\n\n`codexplusplus update` downloads the latest Codex++ GitHub release, rebuilds it, and runs\n`repair`. If the command is not on PATH yet, rerun the source bootstrap once.\nUse `codexplusplus update --ref main` only when you intentionally want the current development branch instead of the latest release.\n\nTo revert:\n\n```sh\ncodexplusplus uninstall\n```\n\nOther commands: `status`, `doctor`, `repair`, `tweaks list`, `tweaks open` (opens user tweaks dir).\n\n### Updating Codex on macOS\n\nCodex++ modifies and ad-hoc signs `Codex.app`, so Sparkle cannot safely install an\nofficial Codex update while the app is patched. Use:\n\n```sh\ncodexplusplus update-codex\n```\n\nThis restores a Developer ID signed Codex.app for the official updater. After\nCodex updates and restarts, the watcher re-applies Codex++ to the new app.\n\nDefault tweaks currently installed on first run:\n\n- `co.bennett.custom-keyboard-shortcuts` from `b-nnett/codex-plusplus-keyboard-shortcuts`\n- `co.bennett.ui-improvements` from `b-nnett/codex-plusplus-bennett-ui`\n\n## Writing a tweak\n\nA tweak is a folder under `\u003cuser-data-dir\u003e/tweaks/` with:\n\n```\nmy-tweak/\n├── manifest.json\n└── index.js            # or .mjs / .ts (transpiled by runtime)\n```\n\n```json\n{\n  \"id\": \"com.you.my-tweak\",\n  \"name\": \"My Tweak\",\n  \"version\": \"0.1.0\",\n  \"githubRepo\": \"you/my-tweak\",\n  \"author\": \"you\",\n  \"description\": \"Adds a button.\",\n  \"minRuntime\": \"0.1.0\"\n}\n```\n\n```ts\nimport type { Tweak } from \"@codex-plusplus/sdk\";\n\nexport default {\n  start(api) {\n    api.settings.register({\n      id: \"my-tweak\",\n      title: \"My Tweak\",\n      render: (root) =\u003e {\n        root.innerHTML = `\u003cbutton\u003ehi\u003c/button\u003e`;\n      },\n    });\n    api.log.info(\"started\");\n  },\n  stop() {},\n} satisfies Tweak;\n```\n\nSee [`docs/WRITING-TWEAKS.md`](./docs/WRITING-TWEAKS.md) for the full API.\n\n## Tweak updates\n\nEvery tweak manifest must include `githubRepo` in `owner/repo` form. Codex++ checks GitHub Releases for each installed tweak at most once per day and shows **Update Available** in Settings → Tweaks when a newer semver release exists.\n\nCodex++ does **not** auto-update tweaks. The manager links to the GitHub release so users can review the diff, release notes, and repository before manually replacing local tweak files.\n\nSee [`SECURITY.md`](./SECURITY.md) for the security model and reporting policy.\n\n## How it works (TL;DR)\n\n| Thing | Location |\n|---|---|\n| Loader stub | `Codex.app/Contents/Resources/app.asar` (entry replaced with `loader.cjs`) |\n| Runtime | `\u003cuser-data-dir\u003e/runtime/` (auto-installed, hot-reloadable) |\n| Tweaks | `\u003cuser-data-dir\u003e/tweaks/` |\n| Config | `\u003cuser-data-dir\u003e/config.json` |\n| Backup | `\u003cuser-data-dir\u003e/backup/` |\n\n`\u003cuser-data-dir\u003e` per-OS:\n\n- macOS: `~/Library/Application Support/codex-plusplus/`\n- Linux: `$XDG_DATA_HOME/codex-plusplus/` (default `~/.local/share/codex-plusplus/`)\n- Windows: `%APPDATA%/codex-plusplus/`\n\nSee [`docs/ARCHITECTURE.md`](./docs/ARCHITECTURE.md) for details.\n\n## Legal\n\nThis is an unofficial project. Not affiliated with OpenAI. Modifying Codex.app violates its code signature; on macOS you may need to allow the re-signed app on first launch. Auto-updates from Sparkle overwrite the patch, so `codex-plusplus` installs a watcher that re-applies it.\n\nUse at your own risk.\n\nMIT.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fb-nnett%2Fcodex-plusplus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fb-nnett%2Fcodex-plusplus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fb-nnett%2Fcodex-plusplus/lists"}