A native block terminal for Mac & iPhone whose sessions survive closed tabs, app relaunches, and device changes.
Important
Portal 1.0 requires macOS 26.1 or newer. GitHub releases contain the Mac app; this repository also contains the iPhone app.
- Download the latest DMG.
- Drag Portal to Applications.
- Open it.
Portal renders each command and its output as a block while the shell runs in a separate portal-sessiond process.
Close a tab with ⌘W and reopen it with ⌘⇧T. Quit Portal and come back later. Typing exit ends the session; closing its window only detaches.
The new-tab screen lists every live session, including its working directory, recent command, and host.
Turn on Remote Access in the new-tab screen or the Portal menu. Macs signed in to the same Apple Account then appear in Portal on your other devices. You can attach to a live session or start a new one.
Portal creates the remote-access key on your device and syncs it through iCloud Keychain. Portal encrypts terminal traffic and session catalogs before they reach the relay. The Mac makes outbound connections; Portal opens no terminal listener on your LAN.
Warning
Read the security model and feel contented before enabling Remote Access.
The relay implementation and wire protocol are in this repository. Portal does not support self-hosted relays yet.
Portal combines executable names, shell builtins, command history, paths, and bundled Fig completion specs as you type. The same completions work when you attach to another Mac.
Warning
Fig generators can execute shell code. A generator for a remote session runs as your user on that Mac. Use completion specs you trust.
You need macOS 26.1, Xcode, and Rust.
$ scripts/build.sh --debug --runNote
The full app build currently needs Portal's Developer ID Application identity and matching provisioning profile because the app authenticates its session daemon by code signature. You can build and test the Swift and Rust cores without them. You can run your own relay if you prefer… it’s not trivial tho.
Run the Swift and Rust tests:
$ swift test
$ cargo testProtocol changes must also pass the release gate:
$ scripts/validate-protocol-compatibility.shFor build, DMG, notarization, and publishing options:
$ scripts/build.sh --help