11# Security Model
22
3- Hermes Desktop is a native macOS client for Hermes that talks directly to the
4- selected host over SSH.
3+ Hermes Desktop is a native macOS client for Hermes that operates directly on
4+ this Mac or connects to another machine over SSH.
55
6- The host stays the source of truth. The app does not introduce a gateway API,
7- background daemon, local mirror, or separate sync layer.
6+ The active Hermes machine stays the source of truth. The app does not introduce
7+ a gateway API, background daemon, synchronized mirror, or separate sync layer.
88
99This document describes the current implementation in this repository. It is
1010not a promise about future packaging, signing, or infrastructure changes.
@@ -16,17 +16,24 @@ Hermes Desktop runs as a normal macOS app on your Mac.
1616Local execution includes:
1717
1818- the app UI and local state handling
19- - ` /usr/bin/ssh ` for all host communication
20- - a local embedded terminal session that opens an SSH shell to the selected
21- host
19+ - direct ` /bin/sh ` service commands when the connection type is ` This Mac `
20+ - a local embedded terminal when the connection type is ` This Mac `
21+ - ` /usr/bin/ssh ` and an embedded SSH shell when the connection type is
22+ ` SSH Host `
2223- the built-in update check, which requests the latest Hermes Desktop release
2324 metadata from the GitHub Releases API
2425
2526The app does not install a helper service on the host or on your Mac.
2627
27- ## What Executes Remotely Over SSH
28+ Direct-local commands run with the current macOS user's permissions against
29+ that account's real Hermes files. The app reuses the same ` HERMES_HOME ` , named
30+ profile, custom-home, PATH, Hermes CLI, service, and terminal bootstrap rules
31+ used for SSH connections.
2832
29- Hermes Desktop uses SSH to execute commands on the selected host.
33+ ## What Can Execute Remotely Over SSH
34+
35+ For an ` SSH Host ` connection, Hermes Desktop uses SSH to execute commands on
36+ the selected host.
3037
3138Current remote execution includes:
3239
@@ -35,7 +42,7 @@ Current remote execution includes:
3542- remote shell startup for the embedded terminal
3643- remote ` hermes ` CLI invocations for in-app chat and session resume flows
3744
38- The app therefore depends on the remote SSH environment you already trust:
45+ SSH mode therefore depends on the remote SSH environment you already trust:
3946
4047- SSH access must already work from Terminal on your Mac
4148- ` python3 ` must exist on the host for service-style RPC requests
@@ -51,12 +58,12 @@ Hermes Desktop stores a small amount of local state under:
5158Current files written there include:
5259
5360- ` connections.json `
54- Saved connection definitions such as label, SSH alias or host, user, port,
55- and selected Hermes profile
61+ Saved connection definitions including connection type, label, SSH routing
62+ fields when applicable, and the selected Hermes profile or custom home
5663- ` preferences.json `
5764 App preferences and lightweight workspace state such as last-used
5865 connection, terminal theme and font preferences, app appearance preference,
59- background image metadata, update-check preference, bookmarked remote files,
66+ background image metadata, update-check preference, bookmarked Hermes files,
6067 pinned sessions, sidebar order, and workflow presets
6168
6269If you choose a custom appearance background image, Hermes Desktop copies that
@@ -69,40 +76,41 @@ support directory is created with private directory permissions (`0700`).
6976They are ordinary JSON files under your macOS user account, not Keychain
7077entries.
7178
72- The app also creates SSH control sockets under:
79+ For SSH connections, the app also creates control sockets under:
7380
7481` /tmp/hd-<uid> `
7582
7683That directory is also created with private directory permissions (` 0700 ` ).
7784
7885## What Is Not Stored Locally
7986
80- Hermes Desktop does not maintain a local mirror of Hermes host state.
87+ Hermes Desktop does not maintain a synchronized mirror of Hermes state.
8188
8289In the current implementation, it does not store these Hermes artifacts as a
83- local source of truth:
90+ second source of truth:
8491
85- - remote session databases and transcripts
86- - remote Kanban databases
87- - remote cron job definitions
88- - remote Hermes skill directories
89- - remote workspace files as a synchronized mirror
92+ - session databases and transcripts
93+ - Kanban databases
94+ - cron job definitions
95+ - Hermes skill directories
96+ - workspace files as a synchronized mirror
9097
9198Unsaved edits can still exist transiently in app memory while you are working,
92- but the app's design is to read and write the canonical state on the host.
99+ but the app's design is to read and write the canonical state on the active
100+ Hermes machine.
93101
94102Workflow presets are the notable local exception: they are intentionally stored
95- as lightweight launch helpers on your Mac, scoped to the selected host/profile,
96- and used only to seed a fresh remote Terminal session. They are not a local
97- mirror of remote Hermes state.
103+ as lightweight launch helpers on your Mac, scoped to the active
104+ connection/profile, and used only to seed a fresh local or SSH Terminal
105+ session. They are not a mirror of Hermes state.
98106
99107## Secrets And Credentials
100108
101109Hermes Desktop does not ask you to enter an SSH password into the app.
102110
103- Current connection profiles store routing details such as alias, host, user ,
104- port, and Hermes profile name. They do not contain SSH private keys, API keys,
105- or a stored SSH password.
111+ Current connection profiles store the connection type, Hermes profile details ,
112+ and—when using SSH—routing details such as alias, host, user, and port. They do
113+ not contain SSH private keys, API keys, or a stored SSH password.
106114
107115The app assumes SSH authentication is already handled by your existing macOS
108116and SSH setup.
@@ -113,7 +121,7 @@ Hermes Desktop keeps its network surface intentionally small.
113121
114122In the current implementation, network calls are:
115123
116- - SSH connections to the host you explicitly configure
124+ - SSH connections only for hosts you explicitly configure as ` SSH Host `
117125- an optional GitHub API request to
118126 ` https://api.github.com/repos/dodo-reach/hermes-desktop/releases/latest `
119127 when checking whether a newer Hermes Desktop version exists
@@ -133,8 +141,8 @@ If you want to validate the app before trusting it:
133141- verify the installed bundle with
134142 ` codesign --verify --deep --strict /Applications/HermesDesktop.app `
135143- observe live connections with Little Snitch, LuLu, ` lsof ` , or ` nettop `
136- - compare this document with the current code, especially the SSH transport,
137- local storage, update check, and packaging scripts
144+ - compare this document with the current code, especially the local/ SSH
145+ transport switch, local storage, update check, and packaging scripts
138146
139147For release-specific details and the limits of those checks, see
140148[ docs/distribution.md] ( docs/distribution.md ) .
0 commit comments