Use Codex CLI from your iPhone
Codex CLI asks before it runs commands — that is the point of approvals, and also why a long task stalls the moment you walk away. Answer it from the phone instead.
This guide is about the Codex CLI running on your own Mac, with your own config. ShiftStage does not replace it or call any model: it drives the CLI that is already installed.
What the phone gets
- Approvals as buttons. When Codex stops to ask, the question arrives as a notification with the command named; answer it without opening a laptop.
- The real terminal. A PTY with your shell and dotfiles, for everything the agent does not do for you.
- The diff, as a diff. Changes marked inside the line, counts per file; stage line by line, commit, push.
- The rest of the Mac. Files, running processes and the ports they hold, and CI runs on GitHub Actions, GitLab, Jenkins and TeamCity.
The same works for Claude Code, Gemini CLI, Cursor Agent, Amp, opencode, Crush, Goose,
Aider, Qwen Code and Factory Droid — all found on the PATH — and anything else
runs in the terminal as it is.
Set it up once
- Install the agent on the Mac. A signed, notarised app from our open
Homebrew tap. It shares only the folders you name.
brew install --cask shiftstage/shiftstage/shiftstage-agent - Install the app on the iPhone from the App Store.
- Pair them. Scan the code on the Mac's screen and confirm the same words on both devices. No account. The first pairing needs both on the same network.
That is the whole setup: no VPN, no port forwarding, no SSH keys. On the same Wi-Fi the phone talks to the Mac directly; away from home the connection goes peer to peer, or through a relay that forwards only end-to-end encrypted bytes.
Start Codex from the phone
Pick a shared folder, start a Codex session, and leave it. Sessions keep running when the app is in the background; the phone speaks up only when Codex asks, a build ends or a service dies — and names which one.
Keep the Mac awake
An agent on a sleeping Mac does nothing, and nothing can reach it — ShiftStage tells you the Mac is asleep instead of timing out. For a Mac that works while you are away, turn off system sleep and let it restart after a power cut:
sudo pmset -a sleep 0 disksleep 0
and enable "Start up automatically after a power failure" in System Settings. The display can still sleep.
Get it
The Mac agent: download page — one Homebrew command or a notarised disk image. The iPhone app: App Store. Free forever for one Mac on your own network, no account; $7.99 a month or $69.99 a year to reach it from anywhere.
More guides: all guides.