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.

22 stars

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

$curl -o ~/.claude/skills/codex-plusplus-tweak-system/SKILL.md --create-dirs "https://raw.githubusercontent.com/Aradotso/trending-skills/main/skills/codex-plusplus-tweak-system/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/codex-plusplus-tweak-system/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How codex-plusplus-tweak-system Compares

Feature / Agentcodex-plusplus-tweak-systemStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/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

22
from Aradotso/trending-skills

Backup-first skill for inspecting, archiving, and maintaining local Codex state to keep it fast, clean, and recoverable.

codex-session-patcher

22
from Aradotso/trending-skills

Clean AI refusal responses from Codex CLI, Claude Code, and OpenCode session files, and inject CTF/pentest prompts to reduce refusals.

codex-plugin-cc

22
from Aradotso/trending-skills

Use OpenAI Codex from inside Claude Code for code reviews and delegated background tasks.

codex-oauth-automation-extension

22
from Aradotso/trending-skills

Chrome extension for automating OpenAI OAuth registration flows with captcha retrieval, CPA callback verification, and auto-recovery across multiple rounds

codex-autoresearch-loop

22
from Aradotso/trending-skills

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

22
from Aradotso/trending-skills

---

zeroboot-vm-sandbox

22
from Aradotso/trending-skills

Sub-millisecond VM sandboxes for AI agents using copy-on-write KVM forking via Zeroboot

yourvpndead-vpn-detection

22
from Aradotso/trending-skills

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

22
from Aradotso/trending-skills

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

22
from Aradotso/trending-skills

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

22
from Aradotso/trending-skills

End-to-end pipeline to extract, decrypt, and visualize WeChat Mac favorites from encrypted SQLite DB into an interactive HTML report.

wterm-web-terminal

22
from Aradotso/trending-skills

Web terminal emulator with Zig/WASM core, DOM rendering, and React/vanilla JS bindings