you@anywhere tmux attach — without the terminal

A native macOS + iPadOS front-end for real tmux.

A sidebar of hosts → sessions → windows you click to switch, with the selected session's live terminal filling the rest. Local or over SSH. Your sessions live in tmux, exactly as they always have — Belfry attaches; it never owns them. Quit the app, kill the network, switch devices: everything keeps running.

1:overview

Belfry on macOS: a sidebar of hosts, sessions and windows next to a live libghostty terminal, with a Working badge on a claude window
macOS — libghostty surfaces, your Ghostty theme picked up automatically
Belfry on iPad: a full-screen tmux session over SSH with a key bar of esc, ctrl, arrows and function keys
iPadOS — SwiftTerm over in-process SSH, key bar included

2:features

3:claude code badges

Run Claude Code inside your tmux windows and the sidebar shows what it's up to: Working, or Waiting on you. Optional per-host status hooks install (and uninstall) with one click from the UI, and on macOS the Dock badge counts the windows waiting for your input — so you notice from across the room.

4:build

No toolchain needed on the Mac: 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.