{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreifeisfrdw74p7eopxv7zx23niongf4bntegjx3cavffomgfwk3viu",
    "uri": "at://did:plc:2u26gaflouttm3uj6jkgroyz/app.bsky.feed.post/3meepk5glmcz2"
  },
  "coverImage": {
    "$type": "blob",
    "ref": {
      "$link": "bafkreiellbg4elzmwqplew6jmzx6nv4dj22tc5aigxjuieoja3cckbt6mm"
    },
    "mimeType": "image/png",
    "size": 139810
  },
  "description": "CodexMonitor recently developed an iOS app for connecting to your projects running on your desktop over Tailscale. Until there's a TestFlight / AppStore build you will need to build this yourself if you want to use it. Here's what I did to get it working.",
  "path": "/til/2026/02/08/how-i-got-codex-monitor-running-on-my-iphone-over-tailscale/",
  "publishedAt": "2026-02-08T19:53:24.000Z",
  "site": "https://danielraffel.me",
  "tags": [
    "CodexMonitor",
    "https://www.codexmonitor.app",
    "https://github.com/Dimillian/CodexMonitor",
    "Xcode](https://apps.apple.com/us/app/xcode/id497799835?mt=12 Xcode) + [Command Line Tools",
    "Command Line Tools [",
    "Apple Developer Account",
    "Codex"
  ],
  "textContent": "CodexMonitor recently developed an iOS app for connecting to your projects running on your desktop over Tailscale. Until there's a TestFlight / AppStore build you will need to build this yourself if you want to use it. Here's what I did to get it working.\n\n## Pre-requisites\n\n  * **Desktop app (prebuilt):** https://www.codexmonitor.app\nI installed/updated this instead of building the desktop app myself (the latest builds include Tailscale support + the iOS work).\n  * **iOS app (from source):** https://github.com/Dimillian/CodexMonitor\nThe iOS app isn’t on TestFlight, so I built it locally. This has dependencies but I am not going to list them since building should resolve.\n  * Xcode](https://apps.apple.com/us/app/xcode/id497799835?mt=12 Xcode) + Command Line Tools [\nI used my Apple Developer Account (TeamID, AppleID) to build and deploy to my device not sure if that's required.\n  * [Tailscale on macOS](https://apps.apple.com/us/app/tailscale/id1475387142?mt=12 Tailscale) and [Tailscale on iOS](https://apps.apple.com/us/app/tailscale/id1470499037 Tailscale) logged in and connected\n  * Codex installed and authorized to your account\n\n\n\n* * *\n\n### 1. Get the desktop app running + note your Tailscale IP\n\nOn the Mac where CodexMonitor runs, open Tailscale from the menu bar and copy your **Tailscale IPv4** (something like `100.x.y.z`). That’s the IP the iPhone will target.\n\nI used that IP as the **remote backend address** inside CodexMonitor.\n\nUpdate the Remote Backend IP and Port if default is already in use\n\n* * *\n\n### 2. Configure CodexMonitor desktop to run as a Remote Daemon and Start Mobile Access\n\nIn **CodexMonitor (desktop)** go to:\n\n**Settings → Server**\n\nSet:\n\n  * **Backend mode:** Remote (daemon)\n  * **Remote backend IP:port:** `<TAILSCALE_IP>:<PORT>`\n    * I had to change the port (example below uses `4735`)\n    * **Token:** set a token\n  * **Mobile access Daemon** : Click **Start daemon**\n  * **Tailscale Helper:** Click **Detect Tailscale**\n\n\n\n### If Tailscale Helper Doesn’t Work\n\nYou can also start the daemon yourself from a shell. **CodexMonitor shows you the exact command to use so don’t copy the generic example below as-is** because it won’t include your macOS username, path, IP:port. _Replace_`100.x.y.z:4735` _with your Tailscale IP and the port you set in Step 1._\n\n\n    '/Applications/CodexMonitor.app/Contents/MacOS/codex_monitor_daemon' \\\n      --listen '100.x.y.z:4735' \\\n      --data-dir '/Users/username/Library/Application Support/com.dimillian.codexmonitor' \\\n      --token '12345'\n\nExpected output:\n\n\n    codex-monitor-daemon listening on 100.x.y.z:4735 (data dir: /Users/username/Library/Application Support/com.dimillian.codexmonitor)\n\n* * *\n\n### 3. Build and install the iOS app on your device (local signing)\n\nClone the repo and install dependencies:\n\n\n    git clone https://github.com/Dimillian/CodexMonitor.git\n    cd CodexMonitor\n    npm install\n\nList devices to confirm your iPhone is visible:\n\n\n    ./scripts/build_run_ios_device.sh --list-devices\n\nThen build + install to your iPhone (you need an Apple Team ID that’s available in Xcode on this Mac):\n\n\n    ./scripts/build_run_ios_device.sh --device \"iPhone\" --team \"<YOUR_TEAM_ID>\"\n\nIf signing isn’t set up yet\n\nThe script supports opening the generated Xcode project so you can do one-time signing setup:\n\n\n    ./scripts/build_run_ios_device.sh --open-xcode --team \"<YOUR_TEAM_ID>\"\n\nIn Xcode, add your Apple account and choose the correct team for signing, then re-run the device script.\n\n* * *\n\n### 4. What Codex actually did to get the iOS build working\n\nI asked Codex to run the repo’s iOS device script end-to-end and fix whatever broke. The flow looked like this:\n\n  * Ran ./scripts/build_run_ios_device.sh --help\n  * Listed devices with --list-devices\n  * First build failed due to missing signing team\n  * Installed missing JS deps via npm install\n  * Hit xcodebuild exit code 65 (signing/provisioning issues on that Mac)\n  * Checked available signing identities (security find-identity -v -p codesigning)\n  * Re-ran with a local team, still blocked until Xcode account setup was correct\n  * Eventually isolated a linker failure related to Swift compatibility libs being searched under a stale toolchain path\n  * Patched the generated Xcode project’s LIBRARY_SEARCH_PATHS to include stable Xcode Swift library directories as a fallback\n  * After that, the iOS build succeeded and the app installed to my iPhone\n\n\n\nOne important obvious gotcha: auto-launch via CLI fails if your iPhone is locked. If that happens, unlock the phone and re-run launch:\n\n\n    xcrun devicectl device process launch --device \"iPhone\" --terminate-existing com.dimillian.codexmonitor\n\n* * *\n\n### 5. Configure the iOS app to talk to the desktop daemon\n\nOn iOS, set the exact same values as desktop (you might find the connect overlays are kinda in the way ignore that and tap the fields):\n\n  * Host/IP: <TAILSCALE_IP>\n  * Port: (e.g. 4735)\n  * Token: the same token you set on desktop\n\n\n\nThen connect.\n\nCodexMonitor running natively on iOS connected to CodexMonitor desktop client over Tailscale",
  "title": "How I Got CodexMonitor Running on My iPhone Over Tailscale",
  "updatedAt": "2026-02-08T20:15:45.537Z"
}