A native macOS workspace for browsing Teleport nodes and running SSH sessions through tsh.
Important
Teleport Desktop is an independent community project. It is not affiliated
with, endorsed by, sponsored by, or maintained by Teleport.
Teleport and tsh are trademarks or products of their respective owners.
Teleport Desktop fills a small but noticeable gap in the Teleport workflow: tsh
is an excellent command-line client, but moving between many nodes, labels,
accounts, and concurrent sessions can still require a lot of terminal navigation.
This app adds a focused macOS interface on top of the existing CLI instead of
reimplementing Teleport.
It discovers your active profile and nodes through tsh, then uses tsh behind
the scenes for login, SSH, and file transfers. Your Teleport cluster remains the
source of truth for authentication and access.
| Browse nodes by label | Expand and collapse groups |
|---|---|
![]() |
![]() |
All clusters, groups, usernames, addresses, and nodes shown above are fictional demo data.
- Browse nodes without repeatedly running
tsh ls. - Group and filter large node lists using Teleport labels.
- Keep several embedded SSH sessions open in tabs.
- Rename nodes locally with names that make sense to you.
- Jump back to favorites and recently used nodes.
- Upload and download files through
tsh scp. - Open a session in Terminal, iTerm2, Warp, or another supported terminal.
Teleport Desktop does not replace tsh. It provides a native interface for the
workflows you already use and delegates the actual Teleport operations to the CLI.
- Reads the active Teleport session and available SSH nodes.
- Searches hostnames, addresses, labels, and local names.
- Groups nodes by a configurable label such as
customerorenvironment. - Supports collapsible groups, favorites, and a separate recent-nodes list.
- Stores custom node names locally and keeps them across app restarts.
- Opens
tsh sshsessions in an embedded terminal. - Supports multiple tabs and keyboard navigation between them.
- Resolves SSH logins from a configurable node label, with a fallback login.
- Can hand sessions off to an external terminal application.
- Uploads and downloads files with
tsh scp. - Shows transfer progress when
tshreports it. - Supports cancelling an active transfer.
Teleport Desktop calls the locally installed tsh executable:
| Task | Command used |
|---|---|
| Read the active profile | tsh status --format=json |
| Discover nodes | tsh ls --format=json |
| Authenticate | tsh login |
| Connect to a node | tsh ssh |
| Transfer files | tsh scp |
The app does not implement the Teleport protocol, manage cluster-side resources, or bypass Teleport's authentication and authorization model.
- macOS 14 Sonoma or newer.
- A working Teleport setup and access to a Teleport cluster.
tshinstalled and available inPATH.- Full Xcode with its Metal Toolchain when building from source (SwiftTerm compiles Metal shaders; Command Line Tools alone are insufficient).
Confirm that the CLI is available and that you have an active profile:
tsh version
tsh statusIf needed, authenticate before opening the app:
tsh login --proxy=teleport.example.comClone the repository and run the included build script:
git clone https://github.com/kernelp4nic/teleport-desktop.git
cd teleport-desktop
./script/build_and_run.shThe script builds the Swift package, creates the app bundle under dist/, and
opens it.
The script uses the selected developer tools, falling back to
/Applications/Xcode.app if Command Line Tools are selected. You can choose a
different Xcode installation with DEVELOPER_DIR. If its Metal Toolchain is
missing, install it before building:
DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer xcodebuild -downloadComponent MetalToolchainTo run the test suite:
DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer xcrun swift testNote
Prebuilt, signed, and notarized releases are not available yet.
Open Settings to configure:
- Proxy — optionally override the proxy from the active
tshprofile. - Grouping label — choose the node label used to create sections.
- Login label — choose the label used to resolve the SSH username.
- Fallback login — provide a default when a node has no matching label.
- Terminal application — choose where external sessions should open.
- Sound feedback — enable or disable action sounds and adjust their volume.
Node names, favorites, and recent-node history are local preferences. Renaming a node changes only its display name in Teleport Desktop; connections still use the real hostname reported by Teleport.
Teleport Desktop is an early-stage project built to solve a real workflow need. Interfaces, storage formats, and behavior may change while the project matures.
Good next steps include:
- Signed and notarized release builds.
- Automated GitHub releases.
- Broader accessibility and keyboard-navigation coverage.
- More tests around desktop interaction and long-running transfers.
Issues and focused pull requests are welcome.
- Open an issue describing the problem or proposed improvement.
- Keep changes focused and avoid unrelated refactors.
- Add or update tests when behavior changes.
- Run
swift testbefore opening a pull request. - Explain any user-facing changes and include screenshots when relevant.
Please do not include cluster addresses, usernames, access tokens, certificates, or other sensitive Teleport information in issues, logs, or screenshots.
If you believe you found a security issue, do not publish credentials or private cluster details in a public issue. Until a private reporting policy is added, share only a minimal, redacted description with the maintainer.
This repository does not currently include an open-source license. Until one is
added, the source remains subject to standard copyright restrictions. Add a
LICENSE file before presenting the project as open source.

