feat(installer): rename macOS installer to "Hermes" and make it a launcher - #37516
Conversation
…ncher
The bootstrap installer was branded "Hermes Setup" and always re-ran the full
install flow on every open — so the /Applications app said "Setup" and couldn't
double as a way to relaunch Hermes (the real desktop app lives in ~/.hermes,
not /Applications, with no Dock/Launchpad entry).
Two changes, macOS-focused:
1. Rename the installer's user-visible name to "Hermes" (productName, window
title, shortDescription, document title). Bundle id stays
com.nousresearch.hermes.setup (distinct from the desktop app's
com.nousresearch.hermes); the on-disk staged updater name (hermes-setup) is
unchanged, so the desktop's update hand-off still resolves it.
2. Launcher fast path: on a bare ("Install") launch, if Hermes is already
installed (bootstrap-complete marker + a built desktop app on disk), skip the
installer UI entirely and relaunch the desktop app, then exit. First run still
installs; Update mode and fresh/repair installs still show the UI. The window
now starts hidden ("visible": false) and is revealed only when the UI is
actually needed, so the launcher path never flashes a window.
Net UX: one "Hermes" in /Applications you can pin to the Dock — first click
installs, every later click opens the app instantly (same icon throughout, so
the Dock stays seamless). Nothing pins to the Dock permanently; the app shows a
normal Dock icon only while running.
Windows naming is intentionally left as-is in this change (scope: macOS).
🔎 Lint report:
|
There was a problem hiding this comment.
Pull request overview
This PR polishes the apps/bootstrap-installer macOS installer experience by rebranding the bundled app as “Hermes” and adding a launcher-style fast path that immediately opens the already-installed desktop app instead of re-running the installer UI.
Changes:
- Rebrand installer app strings to “Hermes” (Tauri
productName, window title, bundle short description, and HTML document title). - Add a launcher fast path in the Tauri
setuphook to spawn the installed desktop app and exit when already installed. - Prevent window flashing by starting the main window hidden and only showing it when the installer UI is actually needed.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| apps/bootstrap-installer/src-tauri/tauri.conf.json | Renames displayed app/window strings to “Hermes” and starts the window hidden to avoid UI flash on launcher path. |
| apps/bootstrap-installer/src-tauri/src/lib.rs | Adds a setup-time launcher fast path and reveals the window only when UI is required. |
| apps/bootstrap-installer/src-tauri/src/bootstrap.rs | Exposes desktop executable resolver and adds helpers to detect/install status and spawn the installed desktop app. |
| apps/bootstrap-installer/index.html | Updates the document <title> to “Hermes”. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…ilures Address review feedback: - Gate the already-installed launcher fast path to macOS (cfg!(target_os = "macos")). On Windows/Linux the installer keeps its prior behavior, so the change is a pure no-op there. This avoids relaunching the desktop app on Windows via a spawn that lacks the DETACHED_PROCESS + startup-grace handling launch_hermes_desktop uses (which could race the installer's exit). - Add a brief startup grace before exiting on the mac fast path, mirroring launch_hermes_desktop. - Log (instead of silently ignoring) failures to show the main window, and log when the "main" window can't be found, so a no-UI state is diagnosable.
… Windows Address follow-up review: - Add a `--reinstall`/`--repair` flag that forces the installer UI even when Hermes is already installed, so a broken install can be repaired by re-running setup instead of the launcher fast path silently relaunching the (possibly bad) app. - Apply DETACHED_PROCESS on Windows in spawn_installed_desktop, mirroring launch_hermes_desktop, so the helper stays correct cross-platform even though its only caller is macOS-gated today.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Extract the force-setup flag parsing into a unit-testable `force_setup_from_args` helper (mirrors `AppMode::from_args`) and add tests: - --reinstall and --repair are recognized - bare/unrelated args (incl. --update) do not force setup - the repair flags never affect Install<->Update mode selection
…ncher (NousResearch#37516) * feat(installer): rename macOS installer to "Hermes" and make it a launcher The bootstrap installer was branded "Hermes Setup" and always re-ran the full install flow on every open — so the /Applications app said "Setup" and couldn't double as a way to relaunch Hermes (the real desktop app lives in ~/.hermes, not /Applications, with no Dock/Launchpad entry). Two changes, macOS-focused: 1. Rename the installer's user-visible name to "Hermes" (productName, window title, shortDescription, document title). Bundle id stays com.nousresearch.hermes.setup (distinct from the desktop app's com.nousresearch.hermes); the on-disk staged updater name (hermes-setup) is unchanged, so the desktop's update hand-off still resolves it. 2. Launcher fast path: on a bare ("Install") launch, if Hermes is already installed (bootstrap-complete marker + a built desktop app on disk), skip the installer UI entirely and relaunch the desktop app, then exit. First run still installs; Update mode and fresh/repair installs still show the UI. The window now starts hidden ("visible": false) and is revealed only when the UI is actually needed, so the launcher path never flashes a window. Net UX: one "Hermes" in /Applications you can pin to the Dock — first click installs, every later click opens the app instantly (same icon throughout, so the Dock stays seamless). Nothing pins to the Dock permanently; the app shows a normal Dock icon only while running. Windows naming is intentionally left as-is in this change (scope: macOS). * fix(installer): gate launcher fast path to macOS + log window-show failures Address review feedback: - Gate the already-installed launcher fast path to macOS (cfg!(target_os = "macos")). On Windows/Linux the installer keeps its prior behavior, so the change is a pure no-op there. This avoids relaunching the desktop app on Windows via a spawn that lacks the DETACHED_PROCESS + startup-grace handling launch_hermes_desktop uses (which could race the installer's exit). - Add a brief startup grace before exiting on the mac fast path, mirroring launch_hermes_desktop. - Log (instead of silently ignoring) failures to show the main window, and log when the "main" window can't be found, so a no-UI state is diagnosable. * fix(installer): add --reinstall escape hatch + keep spawn detached on Windows Address follow-up review: - Add a `--reinstall`/`--repair` flag that forces the installer UI even when Hermes is already installed, so a broken install can be repaired by re-running setup instead of the launcher fast path silently relaunching the (possibly bad) app. - Apply DETACHED_PROCESS on Windows in spawn_installed_desktop, mirroring launch_hermes_desktop, so the helper stays correct cross-platform even though its only caller is macOS-gated today. * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * test(installer): unit-test --reinstall/--repair force-setup parsing Extract the force-setup flag parsing into a unit-testable `force_setup_from_args` helper (mirrors `AppMode::from_args`) and add tests: - --reinstall and --repair are recognized - bare/unrelated args (incl. --update) do not force setup - the repair flags never affect Install<->Update mode selection --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…ncher (NousResearch#37516) * feat(installer): rename macOS installer to "Hermes" and make it a launcher The bootstrap installer was branded "Hermes Setup" and always re-ran the full install flow on every open — so the /Applications app said "Setup" and couldn't double as a way to relaunch Hermes (the real desktop app lives in ~/.hermes, not /Applications, with no Dock/Launchpad entry). Two changes, macOS-focused: 1. Rename the installer's user-visible name to "Hermes" (productName, window title, shortDescription, document title). Bundle id stays com.nousresearch.hermes.setup (distinct from the desktop app's com.nousresearch.hermes); the on-disk staged updater name (hermes-setup) is unchanged, so the desktop's update hand-off still resolves it. 2. Launcher fast path: on a bare ("Install") launch, if Hermes is already installed (bootstrap-complete marker + a built desktop app on disk), skip the installer UI entirely and relaunch the desktop app, then exit. First run still installs; Update mode and fresh/repair installs still show the UI. The window now starts hidden ("visible": false) and is revealed only when the UI is actually needed, so the launcher path never flashes a window. Net UX: one "Hermes" in /Applications you can pin to the Dock — first click installs, every later click opens the app instantly (same icon throughout, so the Dock stays seamless). Nothing pins to the Dock permanently; the app shows a normal Dock icon only while running. Windows naming is intentionally left as-is in this change (scope: macOS). * fix(installer): gate launcher fast path to macOS + log window-show failures Address review feedback: - Gate the already-installed launcher fast path to macOS (cfg!(target_os = "macos")). On Windows/Linux the installer keeps its prior behavior, so the change is a pure no-op there. This avoids relaunching the desktop app on Windows via a spawn that lacks the DETACHED_PROCESS + startup-grace handling launch_hermes_desktop uses (which could race the installer's exit). - Add a brief startup grace before exiting on the mac fast path, mirroring launch_hermes_desktop. - Log (instead of silently ignoring) failures to show the main window, and log when the "main" window can't be found, so a no-UI state is diagnosable. * fix(installer): add --reinstall escape hatch + keep spawn detached on Windows Address follow-up review: - Add a `--reinstall`/`--repair` flag that forces the installer UI even when Hermes is already installed, so a broken install can be repaired by re-running setup instead of the launcher fast path silently relaunching the (possibly bad) app. - Apply DETACHED_PROCESS on Windows in spawn_installed_desktop, mirroring launch_hermes_desktop, so the helper stays correct cross-platform even though its only caller is macOS-gated today. * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * test(installer): unit-test --reinstall/--repair force-setup parsing Extract the force-setup flag parsing into a unit-testable `force_setup_from_args` helper (mirrors `AppMode::from_args`) and add tests: - --reinstall and --repair are recognized - bare/unrelated args (incl. --update) do not force setup - the repair flags never affect Install<->Update mode selection --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…ncher (#37516) * feat(installer): rename macOS installer to "Hermes" and make it a launcher The bootstrap installer was branded "Hermes Setup" and always re-ran the full install flow on every open — so the /Applications app said "Setup" and couldn't double as a way to relaunch Hermes (the real desktop app lives in ~/.hermes, not /Applications, with no Dock/Launchpad entry). Two changes, macOS-focused: 1. Rename the installer's user-visible name to "Hermes" (productName, window title, shortDescription, document title). Bundle id stays com.nousresearch.hermes.setup (distinct from the desktop app's com.nousresearch.hermes); the on-disk staged updater name (hermes-setup) is unchanged, so the desktop's update hand-off still resolves it. 2. Launcher fast path: on a bare ("Install") launch, if Hermes is already installed (bootstrap-complete marker + a built desktop app on disk), skip the installer UI entirely and relaunch the desktop app, then exit. First run still installs; Update mode and fresh/repair installs still show the UI. The window now starts hidden ("visible": false) and is revealed only when the UI is actually needed, so the launcher path never flashes a window. Net UX: one "Hermes" in /Applications you can pin to the Dock — first click installs, every later click opens the app instantly (same icon throughout, so the Dock stays seamless). Nothing pins to the Dock permanently; the app shows a normal Dock icon only while running. Windows naming is intentionally left as-is in this change (scope: macOS). * fix(installer): gate launcher fast path to macOS + log window-show failures Address review feedback: - Gate the already-installed launcher fast path to macOS (cfg!(target_os = "macos")). On Windows/Linux the installer keeps its prior behavior, so the change is a pure no-op there. This avoids relaunching the desktop app on Windows via a spawn that lacks the DETACHED_PROCESS + startup-grace handling launch_hermes_desktop uses (which could race the installer's exit). - Add a brief startup grace before exiting on the mac fast path, mirroring launch_hermes_desktop. - Log (instead of silently ignoring) failures to show the main window, and log when the "main" window can't be found, so a no-UI state is diagnosable. * fix(installer): add --reinstall escape hatch + keep spawn detached on Windows Address follow-up review: - Add a `--reinstall`/`--repair` flag that forces the installer UI even when Hermes is already installed, so a broken install can be repaired by re-running setup instead of the launcher fast path silently relaunching the (possibly bad) app. - Apply DETACHED_PROCESS on Windows in spawn_installed_desktop, mirroring launch_hermes_desktop, so the helper stays correct cross-platform even though its only caller is macOS-gated today. * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * test(installer): unit-test --reinstall/--repair force-setup parsing Extract the force-setup flag parsing into a unit-testable `force_setup_from_args` helper (mirrors `AppMode::from_args`) and add tests: - --reinstall and --repair are recognized - bare/unrelated args (incl. --update) do not force setup - the repair flags never affect Install<->Update mode selection --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…ncher (NousResearch#37516) * feat(installer): rename macOS installer to "Hermes" and make it a launcher The bootstrap installer was branded "Hermes Setup" and always re-ran the full install flow on every open — so the /Applications app said "Setup" and couldn't double as a way to relaunch Hermes (the real desktop app lives in ~/.hermes, not /Applications, with no Dock/Launchpad entry). Two changes, macOS-focused: 1. Rename the installer's user-visible name to "Hermes" (productName, window title, shortDescription, document title). Bundle id stays com.nousresearch.hermes.setup (distinct from the desktop app's com.nousresearch.hermes); the on-disk staged updater name (hermes-setup) is unchanged, so the desktop's update hand-off still resolves it. 2. Launcher fast path: on a bare ("Install") launch, if Hermes is already installed (bootstrap-complete marker + a built desktop app on disk), skip the installer UI entirely and relaunch the desktop app, then exit. First run still installs; Update mode and fresh/repair installs still show the UI. The window now starts hidden ("visible": false) and is revealed only when the UI is actually needed, so the launcher path never flashes a window. Net UX: one "Hermes" in /Applications you can pin to the Dock — first click installs, every later click opens the app instantly (same icon throughout, so the Dock stays seamless). Nothing pins to the Dock permanently; the app shows a normal Dock icon only while running. Windows naming is intentionally left as-is in this change (scope: macOS). * fix(installer): gate launcher fast path to macOS + log window-show failures Address review feedback: - Gate the already-installed launcher fast path to macOS (cfg!(target_os = "macos")). On Windows/Linux the installer keeps its prior behavior, so the change is a pure no-op there. This avoids relaunching the desktop app on Windows via a spawn that lacks the DETACHED_PROCESS + startup-grace handling launch_hermes_desktop uses (which could race the installer's exit). - Add a brief startup grace before exiting on the mac fast path, mirroring launch_hermes_desktop. - Log (instead of silently ignoring) failures to show the main window, and log when the "main" window can't be found, so a no-UI state is diagnosable. * fix(installer): add --reinstall escape hatch + keep spawn detached on Windows Address follow-up review: - Add a `--reinstall`/`--repair` flag that forces the installer UI even when Hermes is already installed, so a broken install can be repaired by re-running setup instead of the launcher fast path silently relaunching the (possibly bad) app. - Apply DETACHED_PROCESS on Windows in spawn_installed_desktop, mirroring launch_hermes_desktop, so the helper stays correct cross-platform even though its only caller is macOS-gated today. * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * test(installer): unit-test --reinstall/--repair force-setup parsing Extract the force-setup flag parsing into a unit-testable `force_setup_from_args` helper (mirrors `AppMode::from_args`) and add tests: - --reinstall and --repair are recognized - bare/unrelated args (incl. --update) do not force setup - the repair flags never affect Install<->Update mode selection --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…ncher (NousResearch#37516) * feat(installer): rename macOS installer to "Hermes" and make it a launcher The bootstrap installer was branded "Hermes Setup" and always re-ran the full install flow on every open — so the /Applications app said "Setup" and couldn't double as a way to relaunch Hermes (the real desktop app lives in ~/.hermes, not /Applications, with no Dock/Launchpad entry). Two changes, macOS-focused: 1. Rename the installer's user-visible name to "Hermes" (productName, window title, shortDescription, document title). Bundle id stays com.nousresearch.hermes.setup (distinct from the desktop app's com.nousresearch.hermes); the on-disk staged updater name (hermes-setup) is unchanged, so the desktop's update hand-off still resolves it. 2. Launcher fast path: on a bare ("Install") launch, if Hermes is already installed (bootstrap-complete marker + a built desktop app on disk), skip the installer UI entirely and relaunch the desktop app, then exit. First run still installs; Update mode and fresh/repair installs still show the UI. The window now starts hidden ("visible": false) and is revealed only when the UI is actually needed, so the launcher path never flashes a window. Net UX: one "Hermes" in /Applications you can pin to the Dock — first click installs, every later click opens the app instantly (same icon throughout, so the Dock stays seamless). Nothing pins to the Dock permanently; the app shows a normal Dock icon only while running. Windows naming is intentionally left as-is in this change (scope: macOS). * fix(installer): gate launcher fast path to macOS + log window-show failures Address review feedback: - Gate the already-installed launcher fast path to macOS (cfg!(target_os = "macos")). On Windows/Linux the installer keeps its prior behavior, so the change is a pure no-op there. This avoids relaunching the desktop app on Windows via a spawn that lacks the DETACHED_PROCESS + startup-grace handling launch_hermes_desktop uses (which could race the installer's exit). - Add a brief startup grace before exiting on the mac fast path, mirroring launch_hermes_desktop. - Log (instead of silently ignoring) failures to show the main window, and log when the "main" window can't be found, so a no-UI state is diagnosable. * fix(installer): add --reinstall escape hatch + keep spawn detached on Windows Address follow-up review: - Add a `--reinstall`/`--repair` flag that forces the installer UI even when Hermes is already installed, so a broken install can be repaired by re-running setup instead of the launcher fast path silently relaunching the (possibly bad) app. - Apply DETACHED_PROCESS on Windows in spawn_installed_desktop, mirroring launch_hermes_desktop, so the helper stays correct cross-platform even though its only caller is macOS-gated today. * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * test(installer): unit-test --reinstall/--repair force-setup parsing Extract the force-setup flag parsing into a unit-testable `force_setup_from_args` helper (mirrors `AppMode::from_args`) and add tests: - --reinstall and --repair are recognized - bare/unrelated args (incl. --update) do not force setup - the repair flags never affect Install<->Update mode selection --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…ncher (NousResearch#37516) * feat(installer): rename macOS installer to "Hermes" and make it a launcher The bootstrap installer was branded "Hermes Setup" and always re-ran the full install flow on every open — so the /Applications app said "Setup" and couldn't double as a way to relaunch Hermes (the real desktop app lives in ~/.hermes, not /Applications, with no Dock/Launchpad entry). Two changes, macOS-focused: 1. Rename the installer's user-visible name to "Hermes" (productName, window title, shortDescription, document title). Bundle id stays com.nousresearch.hermes.setup (distinct from the desktop app's com.nousresearch.hermes); the on-disk staged updater name (hermes-setup) is unchanged, so the desktop's update hand-off still resolves it. 2. Launcher fast path: on a bare ("Install") launch, if Hermes is already installed (bootstrap-complete marker + a built desktop app on disk), skip the installer UI entirely and relaunch the desktop app, then exit. First run still installs; Update mode and fresh/repair installs still show the UI. The window now starts hidden ("visible": false) and is revealed only when the UI is actually needed, so the launcher path never flashes a window. Net UX: one "Hermes" in /Applications you can pin to the Dock — first click installs, every later click opens the app instantly (same icon throughout, so the Dock stays seamless). Nothing pins to the Dock permanently; the app shows a normal Dock icon only while running. Windows naming is intentionally left as-is in this change (scope: macOS). * fix(installer): gate launcher fast path to macOS + log window-show failures Address review feedback: - Gate the already-installed launcher fast path to macOS (cfg!(target_os = "macos")). On Windows/Linux the installer keeps its prior behavior, so the change is a pure no-op there. This avoids relaunching the desktop app on Windows via a spawn that lacks the DETACHED_PROCESS + startup-grace handling launch_hermes_desktop uses (which could race the installer's exit). - Add a brief startup grace before exiting on the mac fast path, mirroring launch_hermes_desktop. - Log (instead of silently ignoring) failures to show the main window, and log when the "main" window can't be found, so a no-UI state is diagnosable. * fix(installer): add --reinstall escape hatch + keep spawn detached on Windows Address follow-up review: - Add a `--reinstall`/`--repair` flag that forces the installer UI even when Hermes is already installed, so a broken install can be repaired by re-running setup instead of the launcher fast path silently relaunching the (possibly bad) app. - Apply DETACHED_PROCESS on Windows in spawn_installed_desktop, mirroring launch_hermes_desktop, so the helper stays correct cross-platform even though its only caller is macOS-gated today. * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * test(installer): unit-test --reinstall/--repair force-setup parsing Extract the force-setup flag parsing into a unit-testable `force_setup_from_args` helper (mirrors `AppMode::from_args`) and add tests: - --reinstall and --repair are recognized - bare/unrelated args (incl. --update) do not force setup - the repair flags never affect Install<->Update mode selection --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…ncher (NousResearch#37516) * feat(installer): rename macOS installer to "Hermes" and make it a launcher The bootstrap installer was branded "Hermes Setup" and always re-ran the full install flow on every open — so the /Applications app said "Setup" and couldn't double as a way to relaunch Hermes (the real desktop app lives in ~/.hermes, not /Applications, with no Dock/Launchpad entry). Two changes, macOS-focused: 1. Rename the installer's user-visible name to "Hermes" (productName, window title, shortDescription, document title). Bundle id stays com.nousresearch.hermes.setup (distinct from the desktop app's com.nousresearch.hermes); the on-disk staged updater name (hermes-setup) is unchanged, so the desktop's update hand-off still resolves it. 2. Launcher fast path: on a bare ("Install") launch, if Hermes is already installed (bootstrap-complete marker + a built desktop app on disk), skip the installer UI entirely and relaunch the desktop app, then exit. First run still installs; Update mode and fresh/repair installs still show the UI. The window now starts hidden ("visible": false) and is revealed only when the UI is actually needed, so the launcher path never flashes a window. Net UX: one "Hermes" in /Applications you can pin to the Dock — first click installs, every later click opens the app instantly (same icon throughout, so the Dock stays seamless). Nothing pins to the Dock permanently; the app shows a normal Dock icon only while running. Windows naming is intentionally left as-is in this change (scope: macOS). * fix(installer): gate launcher fast path to macOS + log window-show failures Address review feedback: - Gate the already-installed launcher fast path to macOS (cfg!(target_os = "macos")). On Windows/Linux the installer keeps its prior behavior, so the change is a pure no-op there. This avoids relaunching the desktop app on Windows via a spawn that lacks the DETACHED_PROCESS + startup-grace handling launch_hermes_desktop uses (which could race the installer's exit). - Add a brief startup grace before exiting on the mac fast path, mirroring launch_hermes_desktop. - Log (instead of silently ignoring) failures to show the main window, and log when the "main" window can't be found, so a no-UI state is diagnosable. * fix(installer): add --reinstall escape hatch + keep spawn detached on Windows Address follow-up review: - Add a `--reinstall`/`--repair` flag that forces the installer UI even when Hermes is already installed, so a broken install can be repaired by re-running setup instead of the launcher fast path silently relaunching the (possibly bad) app. - Apply DETACHED_PROCESS on Windows in spawn_installed_desktop, mirroring launch_hermes_desktop, so the helper stays correct cross-platform even though its only caller is macOS-gated today. * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * test(installer): unit-test --reinstall/--repair force-setup parsing Extract the force-setup flag parsing into a unit-testable `force_setup_from_args` helper (mirrors `AppMode::from_args`) and add tests: - --reinstall and --repair are recognized - bare/unrelated args (incl. --update) do not force setup - the repair flags never affect Install<->Update mode selection --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…ncher (NousResearch#37516) * feat(installer): rename macOS installer to "Hermes" and make it a launcher The bootstrap installer was branded "Hermes Setup" and always re-ran the full install flow on every open — so the /Applications app said "Setup" and couldn't double as a way to relaunch Hermes (the real desktop app lives in ~/.hermes, not /Applications, with no Dock/Launchpad entry). Two changes, macOS-focused: 1. Rename the installer's user-visible name to "Hermes" (productName, window title, shortDescription, document title). Bundle id stays com.nousresearch.hermes.setup (distinct from the desktop app's com.nousresearch.hermes); the on-disk staged updater name (hermes-setup) is unchanged, so the desktop's update hand-off still resolves it. 2. Launcher fast path: on a bare ("Install") launch, if Hermes is already installed (bootstrap-complete marker + a built desktop app on disk), skip the installer UI entirely and relaunch the desktop app, then exit. First run still installs; Update mode and fresh/repair installs still show the UI. The window now starts hidden ("visible": false) and is revealed only when the UI is actually needed, so the launcher path never flashes a window. Net UX: one "Hermes" in /Applications you can pin to the Dock — first click installs, every later click opens the app instantly (same icon throughout, so the Dock stays seamless). Nothing pins to the Dock permanently; the app shows a normal Dock icon only while running. Windows naming is intentionally left as-is in this change (scope: macOS). * fix(installer): gate launcher fast path to macOS + log window-show failures Address review feedback: - Gate the already-installed launcher fast path to macOS (cfg!(target_os = "macos")). On Windows/Linux the installer keeps its prior behavior, so the change is a pure no-op there. This avoids relaunching the desktop app on Windows via a spawn that lacks the DETACHED_PROCESS + startup-grace handling launch_hermes_desktop uses (which could race the installer's exit). - Add a brief startup grace before exiting on the mac fast path, mirroring launch_hermes_desktop. - Log (instead of silently ignoring) failures to show the main window, and log when the "main" window can't be found, so a no-UI state is diagnosable. * fix(installer): add --reinstall escape hatch + keep spawn detached on Windows Address follow-up review: - Add a `--reinstall`/`--repair` flag that forces the installer UI even when Hermes is already installed, so a broken install can be repaired by re-running setup instead of the launcher fast path silently relaunching the (possibly bad) app. - Apply DETACHED_PROCESS on Windows in spawn_installed_desktop, mirroring launch_hermes_desktop, so the helper stays correct cross-platform even though its only caller is macOS-gated today. * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * test(installer): unit-test --reinstall/--repair force-setup parsing Extract the force-setup flag parsing into a unit-testable `force_setup_from_args` helper (mirrors `AppMode::from_args`) and add tests: - --reinstall and --repair are recognized - bare/unrelated args (incl. --update) do not force setup - the repair flags never affect Install<->Update mode selection --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…ncher (NousResearch#37516) * feat(installer): rename macOS installer to "Hermes" and make it a launcher The bootstrap installer was branded "Hermes Setup" and always re-ran the full install flow on every open — so the /Applications app said "Setup" and couldn't double as a way to relaunch Hermes (the real desktop app lives in ~/.hermes, not /Applications, with no Dock/Launchpad entry). Two changes, macOS-focused: 1. Rename the installer's user-visible name to "Hermes" (productName, window title, shortDescription, document title). Bundle id stays com.nousresearch.hermes.setup (distinct from the desktop app's com.nousresearch.hermes); the on-disk staged updater name (hermes-setup) is unchanged, so the desktop's update hand-off still resolves it. 2. Launcher fast path: on a bare ("Install") launch, if Hermes is already installed (bootstrap-complete marker + a built desktop app on disk), skip the installer UI entirely and relaunch the desktop app, then exit. First run still installs; Update mode and fresh/repair installs still show the UI. The window now starts hidden ("visible": false) and is revealed only when the UI is actually needed, so the launcher path never flashes a window. Net UX: one "Hermes" in /Applications you can pin to the Dock — first click installs, every later click opens the app instantly (same icon throughout, so the Dock stays seamless). Nothing pins to the Dock permanently; the app shows a normal Dock icon only while running. Windows naming is intentionally left as-is in this change (scope: macOS). * fix(installer): gate launcher fast path to macOS + log window-show failures Address review feedback: - Gate the already-installed launcher fast path to macOS (cfg!(target_os = "macos")). On Windows/Linux the installer keeps its prior behavior, so the change is a pure no-op there. This avoids relaunching the desktop app on Windows via a spawn that lacks the DETACHED_PROCESS + startup-grace handling launch_hermes_desktop uses (which could race the installer's exit). - Add a brief startup grace before exiting on the mac fast path, mirroring launch_hermes_desktop. - Log (instead of silently ignoring) failures to show the main window, and log when the "main" window can't be found, so a no-UI state is diagnosable. * fix(installer): add --reinstall escape hatch + keep spawn detached on Windows Address follow-up review: - Add a `--reinstall`/`--repair` flag that forces the installer UI even when Hermes is already installed, so a broken install can be repaired by re-running setup instead of the launcher fast path silently relaunching the (possibly bad) app. - Apply DETACHED_PROCESS on Windows in spawn_installed_desktop, mirroring launch_hermes_desktop, so the helper stays correct cross-platform even though its only caller is macOS-gated today. * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * test(installer): unit-test --reinstall/--repair force-setup parsing Extract the force-setup flag parsing into a unit-testable `force_setup_from_args` helper (mirrors `AppMode::from_args`) and add tests: - --reinstall and --repair are recognized - bare/unrelated args (incl. --update) do not force setup - the repair flags never affect Install<->Update mode selection --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…ncher (NousResearch#37516) * feat(installer): rename macOS installer to "Hermes" and make it a launcher The bootstrap installer was branded "Hermes Setup" and always re-ran the full install flow on every open — so the /Applications app said "Setup" and couldn't double as a way to relaunch Hermes (the real desktop app lives in ~/.hermes, not /Applications, with no Dock/Launchpad entry). Two changes, macOS-focused: 1. Rename the installer's user-visible name to "Hermes" (productName, window title, shortDescription, document title). Bundle id stays com.nousresearch.hermes.setup (distinct from the desktop app's com.nousresearch.hermes); the on-disk staged updater name (hermes-setup) is unchanged, so the desktop's update hand-off still resolves it. 2. Launcher fast path: on a bare ("Install") launch, if Hermes is already installed (bootstrap-complete marker + a built desktop app on disk), skip the installer UI entirely and relaunch the desktop app, then exit. First run still installs; Update mode and fresh/repair installs still show the UI. The window now starts hidden ("visible": false) and is revealed only when the UI is actually needed, so the launcher path never flashes a window. Net UX: one "Hermes" in /Applications you can pin to the Dock — first click installs, every later click opens the app instantly (same icon throughout, so the Dock stays seamless). Nothing pins to the Dock permanently; the app shows a normal Dock icon only while running. Windows naming is intentionally left as-is in this change (scope: macOS). * fix(installer): gate launcher fast path to macOS + log window-show failures Address review feedback: - Gate the already-installed launcher fast path to macOS (cfg!(target_os = "macos")). On Windows/Linux the installer keeps its prior behavior, so the change is a pure no-op there. This avoids relaunching the desktop app on Windows via a spawn that lacks the DETACHED_PROCESS + startup-grace handling launch_hermes_desktop uses (which could race the installer's exit). - Add a brief startup grace before exiting on the mac fast path, mirroring launch_hermes_desktop. - Log (instead of silently ignoring) failures to show the main window, and log when the "main" window can't be found, so a no-UI state is diagnosable. * fix(installer): add --reinstall escape hatch + keep spawn detached on Windows Address follow-up review: - Add a `--reinstall`/`--repair` flag that forces the installer UI even when Hermes is already installed, so a broken install can be repaired by re-running setup instead of the launcher fast path silently relaunching the (possibly bad) app. - Apply DETACHED_PROCESS on Windows in spawn_installed_desktop, mirroring launch_hermes_desktop, so the helper stays correct cross-platform even though its only caller is macOS-gated today. * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * test(installer): unit-test --reinstall/--repair force-setup parsing Extract the force-setup flag parsing into a unit-testable `force_setup_from_args` helper (mirrors `AppMode::from_args`) and add tests: - --reinstall and --repair are recognized - bare/unrelated args (incl. --update) do not force setup - the repair flags never affect Install<->Update mode selection --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Summary
macOS-focused polish to the bootstrap installer (
apps/bootstrap-installer).Before: the installer was branded "Hermes Setup", and re-opening it always re-ran the full install flow. Since the real desktop app (
Hermes) is built into~/.hermes(no/Applications/Launchpad/Dock entry), there was no clean way to relaunch it — and the/Applicationsapp confusingly said "Setup."This makes the
/Applicationsapp "Hermes" and turns it into a real launcher.Changes
productName, windowtitle,shortDescription(tauri.conf.json) + document<title>(index.html). Bundle id stayscom.nousresearch.hermes.setup(distinct from the desktop app'scom.nousresearch.hermes). The staged-updater filename (hermes-setup) is unchanged, so the desktop's--updatehand-off still resolves it.Install) launch, if Hermes is already installed (.hermes-bootstrap-completemarker + a built desktop app on disk), skip the installer UI and relaunch the desktop app, then exit. Gated to macOS (cfg!(target_os = "macos")) — pure no-op on Windows/Linux, which keep their existing behavior."visible": falseand is revealed only when the UI is actually needed.--reinstall/--repairforces the installer UI even when already installed, so a broken install can be repaired instead of the fast path relaunching the bad app.Behavior, precisely
/Applications/Hermesto the Dock; first click installs, every later click opens.)--reinstall/--repair→ shows the installer UI even if installed.--update) → shows progress UI, then relaunches (unchanged).Windows safety
Reviewer flagged that the fast-path spawn lacked the
DETACHED_PROCESSflag the existinglaunch_hermes_desktopuses. Resolved two ways: the fast path is macOS-gated, andspawn_installed_desktopnow appliesDETACHED_PROCESSon Windows so the helper stays correct if reused cross-platform later. Windows installer naming (Hermes-Setup.exe) is intentionally left unchanged.Notes
mainafter merge to ship these installer-binary changes.Test plan
npm run build+cargo checkpass..app: rename correct, fresh install shows window + renders UI, already-installed relaunches instantly (no window).win.show()logging,--reinstallescape hatch, WindowsDETACHED_PROCESS.