What I was doing
I finally got to the point of dispatching my first Hermes swarm(the latest update 0.15.1) to finish out some Temporal workflows and ended up on hermes-desktop (the native macOS app) after the web UI wasn't cutting it for my setup/workflow. After a fresh install I tried opening it up to connect to my VPS but every time I put in my credentials, then saved it to connect the app to my host, nothing appeared. No error, no spinner, no timeout message. Just sitting back at the main screen.
What I found out that happened
The app silently enters an infinite loop on launch when preferences.json is missing the lastConnectionID field. There's no UI feedback at all — no error, no loading state, no indication anything is wrong. It just loops forever and you have no idea. This happens on a fresh install because preferences.json is created without lastConnectionID by default.
Steps to reproduce
- Fresh install of hermes-desktop on macOS
- Open the app — it creates preferences.json if it doesn't exist
- Add a connection via the UI (it gets saved to connections.json)
- Attempt to connect to your host
- App loops silently, no feedback, no timeout
Expected behavior
Either auto-select the first/only connection, surface an error, or prompt the user to pick a connection. Anything but a silent loop.
Actual behavior
Silent infinite loop. Zero UI feedback.
Root cause
preferences.json is missing the lastConnectionID key on a fresh install. The app appears to loop waiting for it without ever telling you that's the problem. preferences.json (broken state): json{"theme": "dark"} connections.json has your connection entry with an id field — but preferences.json has no lastConnectionID pointing to it, so the app never knows which connection to use.
Fix that worked
Manually inject lastConnectionID into preferences.json, matching the id of the entry in connections.json:json {"theme": "dark", "lastConnectionID": "your-connection-id-here"} Relaunch. App auto-connects immediately. Every subsequent launch works fine after that — the field gets maintained once it's seeded.
Why this matters
I'm not sure if I'm the first but new users on a fresh install may hit this wall every time. There's no error message, no log output visible in the UI, and no mention of this in the README. I spent longer than I'd like to admit ruling out VPS config, firewall rules, and SSH issues before tracing it to a missing JSON key lol.
Happy to help test a fix or take a crack at a PR if you can point me at the right place in the codebase. From what I've used it for so far I have been enjoying the overall app experience though!
What I was doing
I finally got to the point of dispatching my first Hermes swarm(the latest update 0.15.1) to finish out some Temporal workflows and ended up on hermes-desktop (the native macOS app) after the web UI wasn't cutting it for my setup/workflow. After a fresh install I tried opening it up to connect to my VPS but every time I put in my credentials, then saved it to connect the app to my host, nothing appeared. No error, no spinner, no timeout message. Just sitting back at the main screen.
What I found out that happened
The app silently enters an infinite loop on launch when preferences.json is missing the lastConnectionID field. There's no UI feedback at all — no error, no loading state, no indication anything is wrong. It just loops forever and you have no idea. This happens on a fresh install because preferences.json is created without lastConnectionID by default.
Steps to reproduce
Expected behavior
Either auto-select the first/only connection, surface an error, or prompt the user to pick a connection. Anything but a silent loop.
Actual behavior
Silent infinite loop. Zero UI feedback.
Root cause
preferences.json is missing the lastConnectionID key on a fresh install. The app appears to loop waiting for it without ever telling you that's the problem. preferences.json (broken state): json{"theme": "dark"} connections.json has your connection entry with an id field — but preferences.json has no lastConnectionID pointing to it, so the app never knows which connection to use.
Fix that worked
Manually inject lastConnectionID into preferences.json, matching the id of the entry in connections.json:json {"theme": "dark", "lastConnectionID": "your-connection-id-here"} Relaunch. App auto-connects immediately. Every subsequent launch works fine after that — the field gets maintained once it's seeded.
Why this matters
I'm not sure if I'm the first but new users on a fresh install may hit this wall every time. There's no error message, no log output visible in the UI, and no mention of this in the README. I spent longer than I'd like to admit ruling out VPS config, firewall rules, and SSH issues before tracing it to a missing JSON key lol.
Happy to help test a fix or take a crack at a PR if you can point me at the right place in the codebase. From what I've used it for so far I have been enjoying the overall app experience though!