codex-plusplus-tweak-system
Expert knowledge for using codex-plusplus to inject tweaks, patch Codex desktop app, and write custom ESM tweak modules with lifecycle APIs.
Best use case
codex-plusplus-tweak-system is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Expert knowledge for using codex-plusplus to inject tweaks, patch Codex desktop app, and write custom ESM tweak modules with lifecycle APIs.
Teams using codex-plusplus-tweak-system should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/codex-plusplus-tweak-system/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How codex-plusplus-tweak-system Compares
| Feature / Agent | codex-plusplus-tweak-system | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Expert knowledge for using codex-plusplus to inject tweaks, patch Codex desktop app, and write custom ESM tweak modules with lifecycle APIs.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
Related Guides
SKILL.md Source
# codex-plusplus Tweak System
> Skill by [ara.so](https://ara.so) — Daily 2026 Skills collection.
`codex-plusplus` is a tweak injection system for the [Codex](https://chatgpt.com/codex) desktop app (Electron-based). It patches `app.asar`, injects a loader stub, and runs a hot-reloadable runtime from the user directory. Tweaks are small ESM modules with a manifest and `start/stop` lifecycle — no app rebuild required.
---
## Installation
### Homebrew (macOS, recommended)
```sh
brew install b-nnett/codex-plusplus/codexplusplus
codexplusplus install
```
### Bun (global)
```sh
bun install -g github:b-nnett/codex-plusplus
codexplusplus install
```
### Source bootstrap (macOS / Linux)
```sh
curl -fsSL https://raw.githubusercontent.com/b-nnett/codex-plusplus/main/install.sh | bash
```
### Windows PowerShell
```powershell
irm https://raw.githubusercontent.com/b-nnett/codex-plusplus/main/install.ps1 | iex
```
The installer:
1. Locates `Codex.app` (or Windows equivalent)
2. Backs up the original to `~/.codex-plusplus/backup/`
3. Patches `app.asar` to require the loader
4. Recomputes asar header SHA-256, writes it into `Info.plist`
5. Flips `EnableEmbeddedAsarIntegrityValidation` in the Electron Framework binary
6. Re-signs ad-hoc on macOS (`codesign --force --deep --sign -`)
7. Installs a launch agent / login item for auto-repair on Codex updates
8. Installs default tweaks unless `--no-default-tweaks` is passed
---
## Key CLI Commands
```sh
codexplusplus install # Patch Codex and install runtime
codexplusplus install --no-default-tweaks # Skip default tweak set
codexplusplus status # Show patch status and runtime version
codexplusplus doctor # Diagnose issues (integrity, signing, etc.)
codexplusplus repair # Re-apply patch (e.g. after Codex update)
codexplusplus repair --quiet # Silent repair (used by watcher/launch agent)
codexplusplus update # Pull latest codex-plusplus source, rebuild, repair
codexplusplus update-codex # Restore official-signed Codex for Sparkle updater
codexplusplus uninstall # Revert all patches, restore backup
codexplusplus tweaks list # List installed tweaks and enabled state
codexplusplus tweaks open # Open user tweaks directory in Finder/Explorer
```
---
## File Locations
| Artifact | Path |
|---|---|
| Loader stub | `Codex.app/Contents/Resources/app.asar` |
| Runtime | `<user-data-dir>/runtime/` |
| Tweaks | `<user-data-dir>/tweaks/` |
| Config | `<user-data-dir>/config.json` |
| Backup | `<user-data-dir>/backup/` |
**`<user-data-dir>` per OS:**
- macOS: `~/Library/Application Support/codex-plusplus/`
- Linux: `$XDG_DATA_HOME/codex-plusplus/` (default `~/.local/share/codex-plusplus/`)
- Windows: `%APPDATA%/codex-plusplus/`
---
## Writing a Tweak
### Folder Structure
```
<user-data-dir>/tweaks/my-tweak/
├── manifest.json
└── index.ts # or .js / .mjs
```
### manifest.json
```json
{
"id": "com.yourname.my-tweak",
"name": "My Tweak",
"version": "0.1.0",
"githubRepo": "yourname/my-tweak",
"author": "yourname",
"description": "Short description of what this tweak does.",
"minRuntime": "0.1.0"
}
```
**Required fields:** `id` (reverse-domain), `name`, `version`, `githubRepo` (for update checks), `author`, `description`, `minRuntime`.
### index.ts — Minimal Tweak
```ts
import type { Tweak } from "@codex-plusplus/sdk";
export default {
start(api) {
api.log.info("My tweak started");
},
stop() {
// Cleanup: remove event listeners, DOM nodes, etc.
},
} satisfies Tweak;
```
### index.ts — Settings Panel
```ts
import type { Tweak } from "@codex-plusplus/sdk";
export default {
start(api) {
api.settings.register({
id: "my-tweak",
title: "My Tweak",
render(root) {
root.innerHTML = `
<div style="padding: 16px;">
<h2>My Tweak Settings</h2>
<label>
<input type="checkbox" id="my-tweak-toggle" />
Enable feature
</label>
</div>
`;
const toggle = root.querySelector<HTMLInputElement>("#my-tweak-toggle")!;
toggle.checked = api.storage.get("enabled") ?? false;
toggle.addEventListener("change", () => {
api.storage.set("enabled", toggle.checked);
});
},
});
},
stop() {},
} satisfies Tweak;
```
### index.ts — DOM Injection with Cleanup
```ts
import type { Tweak } from "@codex-plusplus/sdk";
let cleanup: (() => void) | null = null;
export default {
start(api) {
// Wait for DOM element to appear
const unobserve = api.dom.waitFor(".codex-toolbar", (toolbar) => {
const btn = document.createElement("button");
btn.textContent = "My Action";
btn.className = "codex-plusplus-btn";
btn.addEventListener("click", () => {
api.log.info("Button clicked");
});
toolbar.appendChild(btn);
cleanup = () => btn.remove();
});
api.onStop(() => {
unobserve();
cleanup?.();
});
},
stop() {},
} satisfies Tweak;
```
### index.ts — Keyboard Shortcut
```ts
import type { Tweak } from "@codex-plusplus/sdk";
export default {
start(api) {
const handler = (e: KeyboardEvent) => {
if ((e.metaKey || e.ctrlKey) && e.shiftKey && e.key === "k") {
e.preventDefault();
api.log.info("Shortcut triggered: Cmd/Ctrl+Shift+K");
// your action here
}
};
document.addEventListener("keydown", handler);
api.onStop(() => document.removeEventListener("keydown", handler));
},
stop() {},
} satisfies Tweak;
```
---
## Tweak API Reference (`api` object in `start`)
| API | Description |
|---|---|
| `api.log.info(msg)` | Log to Codex++ console |
| `api.log.warn(msg)` | Warning log |
| `api.log.error(msg)` | Error log |
| `api.settings.register({ id, title, render })` | Add a panel under Settings → Tweaks |
| `api.storage.get(key)` | Read persisted value for this tweak |
| `api.storage.set(key, value)` | Persist value (JSON-serializable) |
| `api.dom.waitFor(selector, cb)` | Watch for a DOM element; returns unobserve fn |
| `api.onStop(fn)` | Register a cleanup callback called on `stop()` |
---
## Config (`config.json`)
```json
{
"autoRepair": true,
"autoUpdateRuntime": true,
"tweaks": {
"com.yourname.my-tweak": {
"enabled": true
}
}
}
```
- **`autoRepair`** — watcher re-patches after Codex updates (default `true`)
- **`autoUpdateRuntime`** — daily runtime refresh from CLI (default `true`); disable in Settings → Codex Plus Plus → Config
---
## Tweak Update Checks
Every tweak with `githubRepo` set is checked against GitHub Releases once per day. Codex++ compares the latest release tag (semver) to the local `manifest.json` version.
- **No auto-update** — users see "Update Available" in Settings → Tweaks with a link to the release.
- To publish a tweak update: create a GitHub Release with a semver tag (e.g. `v0.2.0`) and attach the tweak folder as a zip.
---
## Default Tweaks
Installed on first run (skip with `--no-default-tweaks`):
| ID | Repo |
|---|---|
| `co.bennett.custom-keyboard-shortcuts` | `b-nnett/codex-plusplus-keyboard-shortcuts` |
| `co.bennett.ui-improvements` | `b-nnett/codex-plusplus-bennett-ui` |
---
## Updating Codex (macOS — Sparkle conflict)
Codex++ ad-hoc signs the app, breaking Sparkle's integrity check. Use:
```sh
codexplusplus update-codex
```
This restores an official Developer ID–signed build for the updater. After Codex updates and restarts, the launch agent watcher re-applies Codex++ automatically.
---
## Uninstall
```sh
codexplusplus uninstall
```
Restores the backed-up original `app.asar`, removes the launch agent, and removes `<user-data-dir>`. Tweaks you wrote remain on disk unless you delete them manually.
---
## Troubleshooting
### "App is damaged and can't be opened" (macOS)
The ad-hoc signature isn't trusted on first launch. Run:
```sh
xattr -cr /Applications/Codex.app
```
Then open the app again.
### Patch not persisting after Codex update
The launch agent should re-run `repair` automatically. Check status:
```sh
codexplusplus status
codexplusplus doctor
```
If the launch agent isn't running, reinstall:
```sh
codexplusplus uninstall && codexplusplus install
```
### Tweak not loading
1. Check `manifest.json` has all required fields (`id`, `name`, `version`, `githubRepo`, `author`, `description`, `minRuntime`).
2. Ensure `index.js` / `index.ts` exports a default object with `start` and `stop`.
3. Check logs: `api.log.error` output appears in Codex DevTools console.
4. Run `codexplusplus doctor` for runtime integrity checks.
### Runtime version mismatch
```sh
codexplusplus repair # refreshes runtime from CLI
```
### Tweaks directory location
```sh
codexplusplus tweaks open # opens in Finder/Explorer
```
---
## Security Model
- Tweaks run in the **renderer process** with the same privileges as Codex's own renderer code.
- Codex++ does **not** auto-update tweak code — users must manually review and install updates.
- `githubRepo` is only used for version checks via the GitHub Releases API, not for auto-downloading code.
- See [`SECURITY.md`](https://github.com/b-nnett/codex-plusplus/blob/main/SECURITY.md) for the full policy and vulnerability reporting process.
---
## Community
- [Discord](https://discord.gg/6bY6gGX36H) — `#tweak-dev` channel for tweak authors
- [GitHub Issues](https://github.com/b-nnett/codex-plusplus/issues) — bug reports and feature requests
- Docs: [`docs/WRITING-TWEAKS.md`](https://github.com/b-nnett/codex-plusplus/blob/main/docs/WRITING-TWEAKS.md) and [`docs/ARCHITECTURE.md`](https://github.com/b-nnett/codex-plusplus/blob/main/docs/ARCHITECTURE.md)Related Skills
keep-codex-fast-maintenance
Backup-first skill for inspecting, archiving, and maintaining local Codex state to keep it fast, clean, and recoverable.
codex-session-patcher
Clean AI refusal responses from Codex CLI, Claude Code, and OpenCode session files, and inject CTF/pentest prompts to reduce refusals.
codex-plugin-cc
Use OpenAI Codex from inside Claude Code for code reviews and delegated background tasks.
codex-oauth-automation-extension
Chrome extension for automating OpenAI OAuth registration flows with captcha retrieval, CPA callback verification, and auto-recovery across multiple rounds
codex-autoresearch-loop
Self-directed iterative research skill for Codex that continuously cycles through modify, verify, retain or discard, and repeat until a measurable goal is reached.
```markdown
---
zeroboot-vm-sandbox
Sub-millisecond VM sandboxes for AI agents using copy-on-write KVM forking via Zeroboot
yourvpndead-vpn-detection
Android app that detects VPN/proxy servers (VLESS/xray/sing-box) via local SOCKS5 vulnerability, exposing exit IPs and server configs without root
xata-postgres-platform
Expert skill for Xata open-source cloud-native Postgres platform with copy-on-write branching, scale-to-zero, and Kubernetes deployment
x-mentor-skill-nuwa
AI-powered X (Twitter) content strategy skill that distills methodologies from 6 top creators + open-source algorithm data into actionable writing, growth, and monetization guidance.
wx-favorites-report
End-to-end pipeline to extract, decrypt, and visualize WeChat Mac favorites from encrypted SQLite DB into an interactive HTML report.
wterm-web-terminal
Web terminal emulator with Zig/WASM core, DOM rendering, and React/vanilla JS bindings