Loading...
Loading...
Expert knowledge for using codex-plusplus to inject tweaks, patch Codex desktop app, and write custom ESM tweak modules with lifecycle APIs.
npx skill4agent add aradotso/trending-skills codex-plusplus-tweak-systemSkill by ara.so — Daily 2026 Skills collection.
codex-plusplusapp.asarstart/stopbrew install b-nnett/codex-plusplus/codexplusplus
codexplusplus installbun install -g github:b-nnett/codex-plusplus
codexplusplus installcurl -fsSL https://raw.githubusercontent.com/b-nnett/codex-plusplus/main/install.sh | bashirm https://raw.githubusercontent.com/b-nnett/codex-plusplus/main/install.ps1 | iexCodex.app~/.codex-plusplus/backup/app.asarInfo.plistEnableEmbeddedAsarIntegrityValidationcodesign --force --deep --sign ---no-default-tweakscodexplusplus 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| Artifact | Path |
|---|---|
| Loader stub | |
| Runtime | |
| Tweaks | |
| Config | |
| Backup | |
<user-data-dir>~/Library/Application Support/codex-plusplus/$XDG_DATA_HOME/codex-plusplus/~/.local/share/codex-plusplus/%APPDATA%/codex-plusplus/<user-data-dir>/tweaks/my-tweak/
├── manifest.json
└── index.ts # or .js / .mjs{
"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"
}idnameversiongithubRepoauthordescriptionminRuntimeimport 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;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;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;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;apistart| API | Description |
|---|---|
| Log to Codex++ console |
| Warning log |
| Error log |
| Add a panel under Settings → Tweaks |
| Read persisted value for this tweak |
| Persist value (JSON-serializable) |
| Watch for a DOM element; returns unobserve fn |
| Register a cleanup callback called on |
config.json{
"autoRepair": true,
"autoUpdateRuntime": true,
"tweaks": {
"com.yourname.my-tweak": {
"enabled": true
}
}
}autoRepairtrueautoUpdateRuntimetruegithubRepomanifest.jsonv0.2.0--no-default-tweaks| ID | Repo |
|---|---|
| |
| |
codexplusplus update-codexcodexplusplus uninstallapp.asar<user-data-dir>xattr -cr /Applications/Codex.apprepaircodexplusplus status
codexplusplus doctorcodexplusplus uninstall && codexplusplus installmanifest.jsonidnameversiongithubRepoauthordescriptionminRuntimeindex.jsindex.tsstartstopapi.log.errorcodexplusplus doctorcodexplusplus repair # refreshes runtime from CLIcodexplusplus tweaks open # opens in Finder/ExplorergithubRepoSECURITY.md#tweak-devdocs/WRITING-TWEAKS.mddocs/ARCHITECTURE.md