1:overview
2:features
-
instant switching
Every visited session keeps a warm, attached surface. Changing sessions is a visibility toggle, not a re-attach.
-
pin what matters
Pin a session — or a single window — and it floats to a Pinned section at the top of the sidebar, above every host, with its live Claude badge along for the ride.
-
the file pane
⌥⌘I opens a file browser beside the terminal, following the selected window's working directory — local or over SSH on the same connection. Space for Quick Look, double-click for a syntax-highlighted preview, and a git-aware Changes view with per-file diffs.
-
drag-and-drop transfers
Drop files onto the pane to copy them onto the host; download with a click the other way. Transfers run in the background with progress in the toolbar — closing the pane never interrupts one.
-
sessions outlive the app
On macOS the local tmux server is started under launchd, so even force-quitting Belfry can't take your sessions down.
-
battery-conscious
Hidden sessions absorb output without rendering, and the idle app measures ~0% CPU.
-
native rendering
Terminals on both platforms render with libghostty — the engine inside Ghostty. On the Mac it picks up your Ghostty theme; bundled Maple Mono NF keeps nerd-font glyphs sharp on iPad.
-
made for remote work
SSH connection sharing and a native askpass dialog on macOS. On iPad: Keychain-stored credentials, a floating key dock with saved commands, instant warm resume after backgrounding — plus optional Keep Alive for up to an hour. Pairs beautifully with Tailscale.
3:claude code badges
Run Claude Code inside your tmux windows and the sidebar shows what every one is up to, at a glance: Working, Agents still running after its turn, Idle, or Waiting on you. Optional per-host status hooks install (and uninstall) with one click, and label each pin with its Claude session's name. On macOS the Dock badge counts only the windows waiting for your input — you notice from across the room, and only when it matters.
4:build
No toolchain needed on the Mac: brew tap robgough/belfry && brew install --cask belfry, or download the notarized app (universal, macOS 14+), unzip, drag to Applications. Or build from source:
macOS 14+
# needs tmux (brew install tmux) + Xcode
git clone https://github.com/robgough/belfry
cd belfry
scripts/make_app.sh release
open Belfry.app
iPadOS / iOS 17+
# needs xcodegen (brew install xcodegen) git clone https://github.com/robgough/belfry cd belfry xcodegen generate open BelfryiOS.xcodeproj # set your team, run
Add hosts in-app: hostname, user, and a password or ed25519 key. Secrets go in the Keychain, never in the hosts file. The remote end just needs sshd and tmux.
5:how it works
Each host gets two planes. The control plane is a tmux -C client attached to a hidden per-launch session — it feeds the sidebar and issues actions, and never sizes your real sessions. The data plane is one terminal surface per visited session running tmux attach.
Both ride a per-platform transport behind a small seam: macOS forks PTYs and drives the system ssh with connection sharing; iPadOS speaks SSH in-process via SwiftNIO, running tmux as exec channels.