glas.sh is a native visionOS SSH terminal app with a glass-first UI and multi-window workflow.
This README documents the current implementation in this repository.
- Website: glas.sh
- GitHub Sponsors / donations: github.com/sponsors/msitarzewski
- Native SSH connection flow using Citadel (
SSHClient.withPTY) - SSH negotiation compatibility retry (
SSHAlgorithms()first, then.allon key-exchange failure) - PTY interactive terminal sessions (not command-by-command exec)
- Dynamic PTY resize via
WindowChangeRequest(rows/cols update as terminal size changes) - SwiftTerm-backed terminal rendering (real terminal widget, not a text-log approximation)
- ANSI/truecolor-capable rendering through SwiftTerm
- Multi-window architecture:
- Connection manager
- Terminal windows (per session)
- HTML preview window
- Port forwarding manager window
- Settings window
- Connection manager with favorites/recent sections, tag filters, and server search
- Host key trust flow:
- host key verification mode (Ask / Strict / Insecure Accept Any)
- trust prompt with fingerprint details
- Terminal window UX:
- footer-first status/actions
- in-window search overlay
- terminal-local settings modal (
Terminal,Overrides,Port Forwarding)
- Session close on clean remote exit
- Secure password retrieval via Keychain helper
- SSH key authentication (RSA, Ed25519) with per-server key assignment
- Secure Enclave-backed P-256 key generation with user-presence auth prompt
- Network/SSH:
Citadel+ vendoredswift-nio-sshcompatibility patch - Terminal view:
SwiftTermTerminalViewhosted in SwiftUI - Input path: SwiftTerm -> delegate callback -> raw bytes -> SSH channel
- Output path: SSH channel stdout/stderr -> SwiftTerm
feed(byteArray:) - Resize path: SwiftTerm size change callback ->
TerminalSession.updateTerminalGeometry(...)-> remote PTY resize
Primary files:
glas.sh/Models.swiftglas.sh/TerminalWindowView.swiftPackages/RealityKitContent/Sources/RealityKitContent/SwiftTermHostView.swiftPackages/RealityKitContent/Package.swift
glas.sh/- App entry + UI windows + models/managers
Packages/RealityKitContent/- App-shared package used by the main target
- SwiftTerm host wrapper and terminal helpers
Packages/Citadel/- Vendored SSH client package
Packages/swift-nio-ssh/- Vendored patched dependency for toolchain compatibility
- Open
glas.sh.xcodeproj - Select scheme:
glas.sh - Select a visionOS Simulator destination
- Build and run
A lightweight project site now lives in docs/ for GitHub Pages.
- Source files:
docs/index.htmldocs/styles.css
- Suggested Pages URL (once enabled):
https://msitarzewski.github.io/glas.sh/
To publish from this repository:
- Push this branch and merge to
main. - In GitHub: Settings -> Pages.
- Set Source to Deploy from a branch.
- Select branch
mainand folder/docs. - Save and wait for the first Pages deployment.
- Typing
exitin remote shell is treated as clean session termination. - Terminal display background opacity/blur/tint applies to the terminal pane, with per-session overrides.
- Settings can be opened from the Connections window and in a dedicated Settings window.
SSH Agentauth path is present in UI, but connection auth still falls back to password-based auth for agent-based requests.- Port forwarding UI/state management exists, but start/stop forwarding is not yet wired to active SSH forwarding.
These are not fully shipped yet:
- System close affordance interception/warning for active remote processes (only in-app close flows can currently be fully controlled).
- SSH agent-based authentication execution path.
- Active SSH port forwarding lifecycle (start/stop backing tunnel operations).
- Additional terminal parity work (selection semantics, advanced key mapping, and edge-case TUI behavior).
Local Xcode/SwiftPM state is intentionally gitignored (for cleaner diffs and fewer merge conflicts):
xcuserdata.swiftpm- derived/build output
See .gitignore.