CodexMonitor is a Tauri app for orchestrating multiple Codex agents across local workspaces. It provides a sidebar to manage projects, a home screen for quick actions, and a conversation view backed by the Codex app-server protocol.
- Add and persist workspaces, group/sort them, and jump into recent agent activity from the home dashboard.
- Spawn one
codex app-serverper workspace, resume threads, and track unread/running state. - Worktree and clone agents for isolated work; worktrees live under the app data directory (legacy
.codex-worktreessupported). - Thread management: pin/rename/archive/copy, per-thread drafts, and stop/interrupt in-flight turns.
- Optional remote backend (daemon) mode for running Codex on another machine.
- Remote setup helpers for self-hosted connectivity (Orbit actions + Tailscale detection/host bootstrap for TCP mode).
- Compose with queueing plus image attachments (picker, drag/drop, paste).
- Autocomplete for skills (
$), prompts (/prompts:), reviews (/review), and file paths (@). - Model picker, collaboration modes (when enabled), reasoning effort, access mode, and context usage ring.
- Dictation with hold-to-talk shortcuts and live waveform (Whisper).
- Render reasoning/tool/diff items and handle approval prompts.
- Diff stats, staged/unstaged file diffs, revert/stage controls, and commit log.
- Branch list with checkout/create plus upstream ahead/behind counts.
- GitHub Issues and Pull Requests via
gh(lists, diffs, comments) and open commits/PRs in the browser. - PR composer: "Ask PR" to send PR context into a new agent thread.
- File tree with search, file-type icons, and Reveal in Finder/Explorer.
- Prompt library for global/workspace prompts: create/edit/delete/move and run in current or new threads.
- Resizable sidebar/right/plan/terminal/debug panels with persisted sizes.
- Responsive layouts (desktop/tablet/phone) with tabbed navigation.
- Sidebar usage and credits meter for account rate limits plus a home usage snapshot.
- Terminal dock with multiple tabs for background commands (experimental).
- In-app updates with toast-driven download/install, debug panel copy/clear, sound notifications, plus platform-specific window effects (macOS overlay title bar + vibrancy) and a reduced transparency toggle.
- Node.js + npm
- Rust toolchain (stable)
- CMake (required for native dependencies; dictation/Whisper uses it)
- LLVM/Clang (required on Windows to build dictation dependencies via bindgen)
- Codex CLI installed and available as
codexinPATH(or configure a custom Codex binary in app/workspace settings) - Git CLI (used for worktree operations)
- GitHub CLI (
gh) for GitHub Issues/PR integrations (optional)
If you hit native build errors, run:
npm run doctorInstall dependencies:
npm installRun in dev mode:
npm run tauri:deviOS support is currently in progress.
- Current status: mobile layout runs, remote backend flow is wired, and iOS defaults to remote backend mode.
- Current limits: terminal and dictation remain unavailable on mobile builds.
- Desktop behavior is unchanged: macOS/Linux/Windows remain local-first unless remote mode is explicitly selected.
Use this when connecting the iOS app to a desktop-hosted daemon over your Tailscale tailnet.
- Install and sign in to Tailscale on both desktop and iPhone (same tailnet).
- On desktop CodexMonitor, open
Settings > Server. - Keep
Remote providerset toTCP (wip). - Set a
Remote backend token. - Start the desktop daemon with
Start daemon(inMobile access daemon). - In
Tailscale helper, useDetect Tailscaleand note the suggested host (for exampleyour-mac.your-tailnet.ts.net:4732). - On iOS CodexMonitor, open
Settings > Server. - Set
Connection typetoTCP. - Enter the desktop Tailscale host and the same token.
- Tap
Connect & testand confirm it succeeds.
Notes:
- The desktop daemon must stay running while iOS is connected.
- If the test fails, confirm both devices are online in Tailscale and that host/token match desktop settings.
- If you want to use Orbit instead of Tailscale TCP, switch
Connection typetoOrbiton iOS and use your desktop Orbit websocket URL/token.
- Xcode + Command Line Tools installed.
- Rust iOS targets installed:
rustup target add aarch64-apple-ios aarch64-apple-ios-sim
# Optional (Intel Mac simulator builds):
rustup target add x86_64-apple-ios- Apple signing configured (development team).
- Set
bundle.iOS.developmentTeaminsrc-tauri/tauri.ios.conf.json(preferred), or - pass
--team <TEAM_ID>to the device script.
- Set
./scripts/build_run_ios.shOptions:
--simulator "<name>"to target a specific simulator.--target aarch64-sim|x86_64-simto override architecture.--skip-buildto reuse the current app bundle.--no-cleanto preservesrc-tauri/gen/apple/buildbetween builds.
List discoverable devices:
./scripts/build_run_ios_device.sh --list-devicesBuild, install, and launch on a specific device:
./scripts/build_run_ios_device.sh --device "<device name or identifier>" --team <TEAM_ID>Additional options:
--target aarch64to override architecture.--skip-buildto reuse the current app bundle.--bundle-id <id>to launch a non-default bundle identifier.
First-time device setup usually requires:
- iPhone unlocked and trusted with this Mac.
- Developer Mode enabled on iPhone.
- Pairing/signing approved in Xcode at least once.
If signing is not ready yet, open Xcode from the script flow:
./scripts/build_run_ios_device.sh --open-xcodeUse the end-to-end script to archive, upload, configure compliance, assign beta group, and submit for beta review.
./scripts/release_testflight_ios.shThe script auto-loads release metadata from .testflight.local.env (gitignored).
For new setups, copy .testflight.local.env.example to .testflight.local.env and fill values.
Build the production Tauri bundle:
npm run tauri:buildArtifacts will be in src-tauri/target/release/bundle/ (platform-specific subfolders).
Windows builds are opt-in and use a separate Tauri config file to avoid macOS-only window effects.
npm run tauri:build:winArtifacts will be in:
src-tauri/target/release/bundle/nsis/(installer exe)src-tauri/target/release/bundle/msi/(msi)
Note: building from source on Windows requires LLVM/Clang (for bindgen / libclang) in addition to CMake.
Run the TypeScript checker (no emit):
npm run typecheckNote: npm run build also runs tsc before bundling the frontend.
Recommended validation commands:
npm run lint
npm run test
npm run typecheck
cd src-tauri && cargo checksrc/
features/ feature-sliced UI + hooks
services/ Tauri IPC wrapper
styles/ split CSS by area
types.ts shared types
src-tauri/
src/lib.rs Tauri app backend command registry
src/bin/codex_monitor_daemon.rs remote daemon JSON-RPC process
src/shared/ shared backend core used by app + daemon
src/workspaces/ workspace/worktree adapters
src/codex/ codex app-server adapters
src/files/ file adapters
tauri.conf.json window configuration
- Workspaces persist to
workspaces.jsonunder the app data directory. - App settings persist to
settings.jsonunder the app data directory (theme, backend mode/provider, remote endpoints/tokens, Codex path, default access mode, UI scale). - Feature settings are supported in the UI and synced to
$CODEX_HOME/config.toml(or~/.codex/config.toml) on load/save. Stable: Collaboration modes (features.collaboration_modes), personality (personality), Steer mode (features.steer), and Background terminal (features.unified_exec). Experimental: Collab mode (features.collab) and Apps (features.apps). - On launch and on window focus, the app reconnects and refreshes thread lists for each workspace.
- Threads are restored by filtering
thread/listresults using the workspacecwd. - Selecting a thread always calls
thread/resumeto refresh messages from disk. - CLI sessions appear if their
cwdmatches the workspace path; they are not live-streamed unless resumed. - The app uses
codex app-serverover stdio; seesrc-tauri/src/lib.rsandsrc-tauri/src/codex/. - The remote daemon entrypoint is
src-tauri/src/bin/codex_monitor_daemon.rs; shared domain logic lives insrc-tauri/src/shared/. - Codex home resolves from workspace settings (if set), then legacy
.codexmonitor/, then$CODEX_HOME/~/.codex. - Worktree agents live under the app data directory (
worktrees/<workspace-id>); legacy.codex-worktrees/paths remain supported, and the app no longer edits repo.gitignorefiles. - UI state (panel sizes, reduced transparency toggle, recent thread activity) is stored in
localStorage. - Custom prompts load from
$CODEX_HOME/prompts(or~/.codex/prompts) with optional frontmatter description/argument hints.
Frontend calls live in src/services/tauri.ts and map to commands in src-tauri/src/lib.rs. The current surface includes:
- Settings/config/files:
get_app_settings,update_app_settings,get_codex_config_path,get_config_model,file_read,file_write,codex_doctor,menu_set_accelerators. - Workspaces/worktrees:
list_workspaces,is_workspace_path_dir,add_workspace,add_clone,add_worktree,worktree_setup_status,worktree_setup_mark_ran,rename_worktree,rename_worktree_upstream,apply_worktree_changes,update_workspace_settings,update_workspace_codex_bin,remove_workspace,remove_worktree,connect_workspace,list_workspace_files,read_workspace_file,open_workspace_in,get_open_app_icon. - Threads/turns/reviews:
start_thread,fork_thread,compact_thread,list_threads,resume_thread,archive_thread,set_thread_name,send_user_message,turn_interrupt,respond_to_server_request,start_review,remember_approval_rule,get_commit_message_prompt,generate_commit_message,generate_run_metadata. - Account/models/collaboration:
model_list,account_rate_limits,account_read,skills_list,apps_list,collaboration_mode_list,codex_login,codex_login_cancel,list_mcp_server_status. - Git/GitHub:
get_git_status,list_git_roots,get_git_diffs,get_git_log,get_git_commit_diff,get_git_remote,stage_git_file,stage_git_all,unstage_git_file,revert_git_file,revert_git_all,commit_git,push_git,pull_git,fetch_git,sync_git,list_git_branches,checkout_git_branch,create_git_branch,get_github_issues,get_github_pull_requests,get_github_pull_request_diff,get_github_pull_request_comments. - Prompts:
prompts_list,prompts_create,prompts_update,prompts_delete,prompts_move,prompts_workspace_dir,prompts_global_dir. - Terminal/dictation/notifications/usage:
terminal_open,terminal_write,terminal_resize,terminal_close,dictation_model_status,dictation_download_model,dictation_cancel_download,dictation_remove_model,dictation_request_permission,dictation_start,dictation_stop,dictation_cancel,send_notification_fallback,is_macos_debug_build,local_usage_snapshot. - Remote backend helpers:
orbit_connect_test,orbit_sign_in_start,orbit_sign_in_poll,orbit_sign_out,orbit_runner_start,orbit_runner_stop,orbit_runner_status,tailscale_status,tailscale_daemon_command_preview,tailscale_daemon_start,tailscale_daemon_stop,tailscale_daemon_status.
