Termina is a fast, native SSH/SFTP client: a dark sidebar of saved hosts, tabbed terminal sessions rendered by libghostty (Ghostty's GPU terminal core), a built-in remote file browser, persistent tmux sessions, and a live view of your SSH tunnels.
brew install --cask rescenedev/tap/terminaOr grab the latest Termina.app from the
Releases page.
Termina is ad-hoc signed (not notarized), so Gatekeeper may block the first launch. If macOS says the app can't be opened, clear the quarantine flag:
xattr -dr com.apple.quarantine "/Applications/Termina.app"…or right-click the app in Finder and choose Open.
- libghostty terminal — each session renders with Ghostty's Metal-accelerated
core (the same engine as the Ghostty app), with SwiftTerm as a fallback
engine you can switch to (
Terminal ▸ Engine). - Works with your real ssh — sessions run the system
ssh, so everything you already have just works:rsa-sha2, ssh-agent, ProxyJump, and your full~/.ssh/config. Password hosts prompt right in the terminal. - tmux auto-attach — sessions attach
tmux new-session -Aby default so your work survives disconnects (gracefully falls back to a login shell when tmux isn't installed). Per-host toggle. - SSH tunnels with health — per-connection
-L/-R/-Dport forwards, plus a live tunnels panel in the sidebar showing every forward (from → to) and whether its local port is actuallyLISTENing. Click a local forward to open it in the browser. - SFTP file browser — breadcrumb navigation, upload/download, new folder, rename, delete, hidden-file toggle.
- Import from disk — pull hosts (and their
LocalForward/RemoteForwardrules) from~/.ssh/config, plus/etc/hosts. Auto-syncs config tunnels on launch. - Connection management — grouped, searchable sidebar with accent tags; a management sheet with ⇧/⌘-click multi-select, bulk delete, and one-click duplicate removal. Secrets live in the macOS Keychain, never on disk.
| Shortcut | Action |
|---|---|
| ⌘N | New connection |
| ⌘T | New session tab (current/selected host) |
| ⌘W | Close current tab |
| ⌃Tab / ⌃⇧Tab | Next / previous session |
| ⌘= / ⌘- / ⌘0 | Resize / reset terminal font (persists as the default) |
| ⇧⌘I | Import from ~/.ssh/config & /etc/hosts |
Requires macOS 15+ and a Swift 6 toolchain (Command Line Tools is enough for the app itself).
# Run
swift run
# Build a signed Termina.app bundle (with icon)
./Scripts/bundle.sh release
open dist/Termina.appThe terminal engine is a prebuilt GhosttyKit.xcframework that is not checked
in (it's a large build artifact). To produce it you need full Xcode + the
Metal Toolchain and Zig 0.15.2:
xcodebuild -downloadComponent MetalToolchain # one-time
mise install zig@0.15.2 # ghostty pins this exact version
./Scripts/build-libghostty.sh # builds & drops the xcframework into Vendor/The script works around a Zig-0.15.2-vs-macOS-26-SDK linker issue by pointing Zig's SDK detection at the macOS 15 SDK (see comments in the script). If the xcframework is absent, the app still builds and runs — it simply uses the SwiftTerm engine.
Sources/Termina/
├── App/ TerminaApp, AppModel, SessionTab
├── Models/ SSHConnection, AuthKind, PortForward
├── Store/ ConnectionStore (JSON), KeychainStore
├── SSH/ SSHTerminalSession, SFTPSession, SSHConfigImporter,
│ ListenPortScanner (tunnel health)
├── Terminal/ Ghostty/ (libghostty embedding), SwiftTerm backend,
│ TerminalBackend toggle
├── SFTP/ SFTPItem, SFTPBrowserView
├── UI/ Sidebar, TunnelsPanel, Editor, ManageConnections, …
└── Util/ Palette + soft rounded styling
The terminal backend is chosen at runtime behind a small seam, so libghostty and SwiftTerm are interchangeable.
- Host keys are accepted on first use (
StrictHostKeyChecking=accept-new); no known-hosts pinning yet. - The SFTP browser uses Citadel
(pure-Swift SSH), which currently signs RSA keys with legacy
ssh-rsaonly — so SFTP may fail on RSA-key hosts that requirersa-sha2. The terminal is unaffected (it uses systemssh).
Built on libghostty, SwiftTerm, and Citadel. MIT licensed — see LICENSE.