codexify is a practical sidecar for the Codex CLI: model profiles, reliable Action Required notifications, global config backup, keep-awake sessions, diagnostics, and project sync through Conforme.
Codex remains fully usable on its own. Running codexify without a management command simply launches codex and forwards every argument and the exit code. Codexify never edits shell startup files or project dotfiles.
With Homebrew (macOS and Linux):
brew install maxgfr/tap/codexify
codexify doctorHomebrew installs Conforme as a dependency. To build from source:
cargo install --locked --git https://github.com/maxgfr/codexifyPrebuilt release binaries are available for macOS and Linux on ARM64 and x86-64.
codexify
codexify exec "explain this repository"
codexify --model gpt-5.6-luna
codexify --caffeine
codexify --caffeine=display exec "run the test suite"Unknown options and commands are forwarded unchanged. --caffeine is the only launch option consumed by Codexify.
Codex's native model selection is untouched until you opt in:
codexify use quality
codexify use gpt-5.6-terra high
codexify reset
codexify profile list
codexify profile show balanced
codexify profile add review gpt-5.6 high
codexify profile use review
codexify profile remove reviewThe editable presets live in ~/.codexify/profiles.toml:
| Preset | Default model | Effort |
|---|---|---|
quality |
gpt-5.6 |
xhigh |
balanced |
gpt-5.6 |
medium |
fast |
gpt-5.6-luna |
medium |
Model names and availability evolve; edit the file to match your account. The official model guide explains the current GPT-5.6 aliases. reset restores the exact pre-Codexify model and model_reasoning_effort values, including absence.
codexify notify on
codexify notify status
codexify notify test
codexify notify offnotify on repairs both common causes of missing Action Required alerts:
- it merges
agent-turn-completeandapproval-requestedinto[tui].notificationswithout removing custom events; - it sets Codex's terminal method to
belwith conditionalways, so Ghostty marks the originating tab even when another tab is active; - it replaces fragile commands such as
notify = ["node", "~/.codex/notify.mjs"]with the absolute installed path tocodexify notify emit.
It also appends an asynchronous PermissionRequest hook to ~/.codex/hooks.json. The hook only displays a notification: it emits no allow/deny decision, so the normal approval prompt continues. Existing hooks and the previous notify callback (including Codex Desktop callbacks) are preserved; Codexify chains the callback while enabled and restores it on notify off.
Codex requires changed non-managed hooks to be reviewed. After enabling notifications, open /hooks in Codex and trust the Codexify entry if prompted. This follows the official hook trust flow. The underlying keys are documented in the Codex configuration reference.
- Ghostty: a standalone BEL for tab attention, OSC 777, and a native desktop fallback because accepting OSC 777 does not guarantee a visible banner.
- iTerm2 and WezTerm: OSC 9 notifications.
- Kitty: OSC 99 title/body notifications.
- Terminal.app and unknown macOS terminals: a BEL for application attention when available, plus Notification Center through
osascript. - Linux: terminal protocol when detected, otherwise a BEL when available plus
notify-send. - WSL: a BEL when available plus the PowerShell notification fallback.
Codexify discards payloads identified as sub-agent events to avoid notification storms. notify off restores the previous notification method and focus condition exactly. For Ghostty, ensure notifications and badges are allowed for Ghostty in System Settings → Notifications, then run codexify notify test from the terminal. The bell marker remains visible on an unfocused tab until that tab receives focus.
codexify caffeine on # prevent system sleep for future launches
codexify caffeine on display # keep the display awake
codexify caffeine status
codexify caffeine offOn macOS, Codexify wraps the child in caffeinate; on Linux it uses systemd-inhibit. The lock exists only while the child process is alive and is released on success, error, or signal-driven termination. If no backend exists, Codex still launches and Codexify prints a warning.
Backups use a strict allow-list: AGENTS.md, config.toml, *.config.toml, hooks.json, and files under hooks/, rules/, and skills/.
They never include auth.json, sessions, history, logs, memories, goals, SQLite databases, caches, Browser/Computer Use data, plugin downloads, or any other unlisted file.
Create a private empty repository, then configure its Git URL:
gh repo create my-codex-config --private
codexify backup init repo git@github.com:YOUR_USER/my-codex-config.git
codexify backup push
codexify backup statusCreate a secret gist directly (or pass an existing gist ID):
codexify backup init gist new
# or: codexify backup init gist GIST_ID
codexify backup pushGist files are flattened with a manifest so directories round-trip. Repository and gist data replace the local allow-list by default. Use additive mode to retain local allow-listed files absent remotely:
codexify backup pull # show diff, ask, mirror restore
codexify backup pull --additive # show diff, ask, additive restore
codexify backup import --yes # non-interactive restoreBefore push, absolute home paths become the escaped portable $CODEXIFY_HOME$ token and local Codexify callbacks are removed. Literal token text and binary assets round-trip safely; paths are expanded and callbacks reattached after restore. A secret scan blocks push and prints only file, line, and finding type—never the matched value.
Automation is explicit and bounded:
codexify backup auto on # best-effort 2-second launch-time push
codexify backup hooks on # async Stop hook, 5-second timeout
codexify backup hooks off
codexify backup auto off
codexify backup offBackup failures never prevent Codex from launching.
Codexify deliberately does not own project configuration. It forwards arguments and exit status to Conforme:
codexify sync
codexify sync --dry-run
codexify sync --from claude --only cursor,codexSee Conforme's documentation for supported agents and project formats.
codexify status
codexify doctor
codexify config
codexify --versiondoctor also parses hooks.json and rejects hook commands whose executable is
missing or whose interpreter script path is relative to the session working
directory.
Codexify owns only ~/.codexify. Every write to ~/.codex/config.toml or ~/.codex/hooks.json is parsed structurally, backed up under ~/.codexify/backups, written through a same-directory temporary file, synced, and atomically renamed. Comments, ordering, unknown TOML keys, and non-Codexify hooks are preserved.
Detach managed configuration before uninstalling:
codexify notify off
codexify backup off
codexify reset
codexify purge
brew uninstall codexifypurge detaches notification and backup hooks before deleting ~/.codexify. Historical .bak files inside that directory are removed and cannot be recovered afterward. codex, its authentication, sessions, history, and all unrelated configuration remain untouched.
If a write was interrupted or manual recovery is needed, inspect ~/.codexify/backups/ and copy the desired timestamped file back to ~/.codex/.
cargo fmt --all -- --check
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all-features
cargo build --release --lockedReleases are automated with semantic-release on pushes to main. Conventional commits determine the version: feat: creates a minor release, fix: or perf: creates a patch, and a BREAKING CHANGE: footer creates a major release. Documentation, test, CI, refactor, and chore commits normally run the workflow without publishing. A release updates the crate version and changelog, creates the GitHub tag and a draft release, then builds all four platform binaries and publishes the release only after every artifact is attached. If a run fails after preparing a version or tag, use the manual Recover Release workflow with that v<version> tag.
See CONTRIBUTING.md and AGENTS.md. Codexify is MIT licensed.