Open Source · MIT

The Story of Hermes Desktop

How a terminal-based AI agent evolved into a full native desktop application — from first commit to today, told through the people and decisions that shaped it.

~3 monthsDevelopment timeline
70+Contributors
15,000+Commits to desktop
0.17.0Current version
Milestone
Feature
Fix / Polish
0

The CLI Era

Jul 2025Apr 2026

Hermes begins as a CLI tool

Teknium · July 22, 2025

The first commit to the Hermes Agent repository. Pure Python + CLI — no GUI, no desktop. A terminal-based AI agent with tool calling, session management, and a messaging gateway (Telegram, Discord, Feishu).

PythonCLIGateway

First Web Dashboard

Late 2025

The hermes dashboard command arrives — a React + Vite web UI that connects to the Python backend via WebSocket. This is the precursor to the desktop app.

ReactViteWebSocket
1

Birth of the Desktop

May 1, 2026May 30, 2026

First Electron commit

Brooklyn Nicholson · May 1

The first commit to apps/desktop/. A structured chat app in Electron with a three-panel layout (sidebar + chat + right rail). 558 lines of main process code. No installer, no update system — just the shell.

ElectronReact 19nanostore
2

First Class Citizen

May 31, 2026

Massive merge into main

brooklyn! · May 31

The desktop app is merged into the Hermes main branch, becoming a first-class component alongside the CLI and Gateway. This single PR dwarfs everything else in scale — bringing cross-platform installers, self-update, onboarding, remote backend, NSIS installer with winget auto-dependency provisioning, and electron-builder integration. The version label: 0.0.2.

Cross-platformSelf-updateOnboardingWindows

WSL2 support via remote mode

brooklyn! · May 31

Adds HERMES_DESKTOP_REMOTE_URL and HERMES_DESKTOP_REMOTE_TOKEN — run the Hermes backend inside WSL2, render the Electron GUI on native Windows. The motivating use case that drove the remote connection architecture.

WSL2Remote

First-launch installer

brooklyn! · May 31

A staged bootstrap process: detect Python/Git, clone repo, create venv, install deps. On Windows, the NSIS installer detects missing dependencies and auto-installs them via winget. On macOS/Linux, a shell-based fallback runs the same stages.

InstallerwingetNSIS
3

Platform Expansion

June 2026

tui_gateway — dedicated backend protocol

June 2026

The tui_gateway/ Python package emerges — a dedicated WebSocket server for the desktop and TUI modes. No longer sharing the dashboard's backend, the desktop gets its own message protocol, project tree scanning, git probing, and event publishing.

WebSocketPythonArchitecture

macOS self-update goes live

brooklyn! · June 6

The desktop can now update itself on macOS: hermes update pulls latest code, npm run pack rebuilds the .app, a swap script dittos the fresh bundle over the running copy, and the app relaunches. The in-app update cycle is complete.

Self-updatemacOS

xterm.js + node-pty integration

June 2026

The desktop gets a real embedded terminal using @xterm/xterm + WebGL rendering accelerator, backed by node-pty native bindings. Users can run shell commands directly inside the desktop window — the same terminal I read from with read_terminal.

xterm.jsnode-ptyTerminal

Session windows — multi-chat side by side

brooklyn! · June 2026

Each chat can be popped out into its own OS window — perfect for monitoring subagent executions while continuing your main conversation. Background throttling explicitly disabled so streaming output keeps painting in unfocused windows.

Multi-windowSubagents

Floating pet overlay

Brooklyn Nicholson · June 23

A transparent, always-on-top pet window that follows the Hermes mascot. The pet spins up its own tiny Electron surface (win=overlay) with no gateway connection — just a React component mounting a pet renderer.

PetOverlayElectron

Simplified Chinese support

Brooklyn Nicholson · June 2026

Full i18n framework with Simplified Chinese (zh-Hans) as the first non-English locale. The I18nProvider wraps the entire React tree.

i18nzh-Hans

No more flashing console windows

emozilla, brooklyn!, Gille

A series of fixes to prevent background spawns from popping cmd windows on Windows. The terminal pop-up problem plagued the desktop for weeks — resolved through careful windowsHide options and process creation flags.

WindowsTerminal

Windows installer goes stable

June 2026

Electron-builder-created NSIS installers, afterPack hooks to stamp executables with the Hermes identity, AppUserModelID for proper notifications. The Windows desktop experience catches up to macOS.

WindowsInstaller
4

UI Renaissance

July 2026

Capabilities page unifies Skills/Tools/MCP

brooklyn! · July 3

A complete redesign of the settings surface. Skills hub, tool management, and MCP server configuration all converge into a single Capabilities tab — with master-detail layout, real-time status probes, and React Query-backed data fetching.

UIMCPSkills

@nous-research/ui extracted as shared package

Brooklyn Nicholson · July 3

The desktop's component library is extracted into @nous-research/ui, shared between the desktop, web dashboard, and TUI apps. This formalizes the design system that was previously copy-pasted between projects.

Design Systemnpm workspaces

OAuth-first provider setup

brooklyn! · July 3

The onboarding overlay gets a full OAuth flow — sign in with Nous Portal, Anthropic, or OpenAI Codex via PKCE/device-code. API key entry is demoted to a fallback link. The very first paint of the app is now the welcome card, not a blank chat shell.

OAuthOnboarding

File:// origin + Tahoe window controls

brooklyn!, emozilla · July 2026

Two macOS-specific issues: the packaged Electron app loads from file://, which the WebSocket origin guard rejected (fixed by trusting non-web origins on loopback binds). macOS Tahoe (macOS 26) moved the traffic light buttons, breaking window layout — fixed by reading the native overlay width at runtime.

macOSWebSocket

Pricing display + free/paid tier gating

brooklyn! · July 3

The model picker now shows per-model $/Mtok pricing, free/paid tier badges, and disables paid models for free Nous accounts — mirroring the CLI's hermes model experience.

ModelsPricing

CI removed — manual releases

brooklyn! · July 2026

The automated desktop release pipeline is removed in favor of manual builds + uploads per platform. Installers are published to GitHub Releases by hand; the website points at them via environment variables. The project reaches a steady-state maintenance rhythm.

ReleaseCI

Where It Stands Today

July 29, 2026

A multi-platform native desktop app

macOS · Windows · Linux

Hermes Desktop is an Electron app with React 19, Tailwind CSS v4, embedded xterm.js terminal, pet overlay, multi-window support, i18n, self-update, OAuth onboarding, and the full agent toolset accessible through a native GUI. It runs the same Python backend as the CLI, sharing config, sessions, skills, and memory — all in a single ~/.hermes/ home.

~7,700 lines main.cjs42 electron modules100+ React components70+ contributors

Key Contributors

Extracted from 15,000+ git commits to apps/desktop/

Brooklyn Nicholson Teknium emozilla ethernet derek2000139 xxxigm srojk34 Gille Carl Cornna Cossackx kshitij sprmn24 liuhao1024 Chris Wesley Brad Hallett Ben Barclay Harish Kukreja Jeffrey Quesnelle Sahibzada Allahyar Brian Pasquini Andrew Fiebert Vladyslav Kovalchuk Mani Saint-Victor, MD Jim Liu 宝玉 +49 more

All data sourced from github.com/NousResearch/hermes-agent · MIT License

Written with the Hermes Agent itself — reading its own git history to tell its own story.