Monitor and interact with Claude Code sessions from your iPhone — and from a native floating panel on your Mac.
Balcony wraps Claude Code in a PTY, streams the live session to a menu bar agent on your Mac, and mirrors it to your iPhone over your local network with end-to-end encryption. Permission prompts and questions become native UI: respond from the terminal, the Mac panel, or your phone — whichever is closest. The first response wins.
┌─────────────┐ Unix socket ┌─────────────┐ WebSocket (E2E) ┌─────────────┐
│ balcony CLI │ ─────────────▶ │ BalconyMac │ ─────────────────▶ │ BalconyiOS │
│ (PTY wrap) │ ~/.balcony/ │ (menu bar) │ Bonjour + :29170 │ (iPhone) │
└─────────────┘ └─────────────┘ └─────────────┘
▲ ▲
│ spawns │ Claude Code hooks (~/.balcony/hooks.sock)
claude CLI structured prompt data
balconyCLI — drop-in wrapper: runbalconyanywhere you'd runclaude(all arguments pass through). It spawns Claude Code in a PTY and forwards the raw terminal stream to the Mac agent. Works fine even if the agent isn't running.- BalconyMac — menu bar agent. Hosts the WebSocket server, advertises via Bonjour, listens for Claude Code hook events, and shows floating prompt panels.
- BalconyiOS — iPhone app. Discovers your Mac on the local network, renders the session as a conversation, and surfaces prompts as native cards.
- Live session mirror — parsed terminal output rendered natively on iPhone, with text input, slash-command and
@-file menus. - Native permission prompts — Claude Code's
PermissionRequesthook delivers structured data (tool, command, risk level). The Mac shows a non-activating floating panel; iOS shows an enriched card. Answering anywhere dismisses everywhere. - Questions & idle prompts —
AskUserQuestionbecomes a step-by-step wizard with options and free-text input; when Claude stops and waits, you get an idle prompt with detected options. - Native pickers —
/model,/resume, and/rewindopen native pickers instead of TUI menus. - Mac niceties — double-tap ⌘ to focus the frontmost prompt panel, hold ⌘ for voice input, keyboard shortcuts on every action, notification sounds.
- Live Activity — session status (working / done / needs attention) on the lock screen and Dynamic Island.
- Proximity awareness — optional BLE signal between Mac and iPhone for away detection and notifications.
- End-to-end encryption — X25519 key exchange + XChaCha20-Poly1305 (libsodium). Keys live in the Keychain.
brew tap allthingsclaude/balcony https://github.com/allthingsclaude/balcony
brew install --cask balconyOr grab the notarized DMG from Releases. The cask also links the balcony CLI into your PATH.
On first launch, the setup wizard installs the hook handler to ~/.balcony/ and adds the hook configuration to ~/.claude/settings.json automatically — no manual hook setup needed. The app updates itself via Sparkle.
The iOS app is distributed through TestFlight / App Store Connect. To build it yourself, see Build from source.
- Launch Balcony on the Mac and open the menu bar popover.
- On the iPhone, Balcony discovers the Mac via Bonjour — tap it, or scan the QR code shown on the Mac for manual pairing.
- Run
balconyin any project. The session appears on both devices.
- macOS 14+ (Sonoma), iOS 16+
- Claude Code CLI installed
- Both devices on the same local network (a cloud relay for remote access is planned)
Prerequisites: Xcode 15+, xcodegen (brew install xcodegen).
git clone https://github.com/allthingsclaude/balcony.git
cd balcony
xcodegen generate
# Shared package tests
cd BalconyShared && swift test && cd ..
# Mac app
xcodebuild -project Balcony.xcodeproj -scheme BalconyMac -configuration Debug build
# iOS app (requires signing for device installs)
xcodebuild -project Balcony.xcodeproj -scheme BalconyiOS -configuration Debug \
-destination 'platform=iOS Simulator,name=iPhone 15' buildScripts/dev.sh does the kill → regenerate → build → relaunch cycle for the Mac app during development.
| Path | What it is |
|---|---|
BalconyCLI/ |
balcony PTY wrapper CLI |
BalconyMac/ |
macOS menu bar agent |
BalconyiOS/ |
iPhone app |
BalconyShared/ |
Swift package: models, protocol, crypto |
BalconyLiveActivity/, BalconyActivity/ |
Live Activity widget extension |
Scripts/ |
hook handler, release, DMG, notarization scripts |
supabase/ |
cloud relay scaffold (Phase 2, not yet active) |
- Prompts don't appear on iPhone/Mac panel — make sure you launched the session with
balcony(not bareclaude), and that the hook entries exist in~/.claude/settings.json(re-run the setup from the Mac app's menu if needed). - Hook debugging — set
BALCONY_HOOK_DEBUG=1in the environment where Claude Code runs to log hook traffic to/tmp/balcony-hook-debug.log. - iPhone can't find the Mac — both devices must be on the same network; check that the Mac agent is running (menu bar icon) and that port 29170 isn't blocked.