One command. Three clouds. Four LLM providers. Deploy the Hermes Agent to AWS, Azure, or GCP with a beautiful wizard-first CLI — zero plaintext secrets, zero manual infra wiring.
Hermes-Agent-Cloud/
│
├── cli/ # 🖥️ The CLI tool
│ ├── hermes-deploy # Main executable (bash, chmod +x)
│ ├── install.sh # One-line installer (detects macOS / Linux)
│ │
│ ├── lib/ # Shared bash libraries
│ │ ├── enums.sh # ⭐ All valid values + validation functions (extend here)
│ │ ├── ui.sh # gum wrappers — wizard, banners, spinners, post-deploy guide
│ │ ├── preflight.sh # Dependency checks (gum, terraform, jq, cloud CLIs)
│ │ ├── config.sh # ~/.hermes-agent-cloud/config key-value store
│ │ ├── aws.sh # AWS wizard + status/ssh/logs/secrets/destroy
│ │ ├── azure.sh # Azure wizard + status/ssh/logs/secrets/destroy
│ │ └── gcp.sh # GCP wizard + status/ssh/logs/secrets/destroy
│ │
│ ├── terraform/
│ │ ├── aws/ # EC2 + Security Group + IAM + SSM Parameter Store
│ │ │ ├── main.tf
│ │ │ ├── variables.tf
│ │ │ ├── outputs.tf
│ │ │ ├── security_group.tf
│ │ │ ├── iam.tf
│ │ │ └── ssm.tf
│ │ ├── azure/ # VM + VNet + NSG + Azure Key Vault + Managed Identity
│ │ │ ├── main.tf
│ │ │ ├── variables.tf
│ │ │ ├── outputs.tf
│ │ │ ├── network.tf
│ │ │ └── keyvault.tf
│ │ └── gcp/ # Compute Engine + Firewall + Secret Manager + Service Account
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ ├── outputs.tf
│ │ ├── firewall.tf
│ │ └── secretmanager.tf
│ │
│ ├── scripts/
│ │ ├── bootstrap.sh # VM user-data: installs Docker, Hermes, pulls secrets, sets up systemd
│ │ └── configure.sh # 7-point on-instance health check
│ │
│ ├── config/
│ │ └── hermes.yaml.tpl # Hermes Agent config template (rendered at deploy time)
│ │
│ ├── README.md # CLI-specific documentation
│ └── RELEASE-NOTE.md # Changelog
│
├── website/ # 🌐 Marketing website (Next.js 15)
│ ├── src/
│ │ ├── app/
│ │ │ ├── layout.tsx # Root layout — Geist fonts, metadata
│ │ │ ├── page.tsx # Page assembly — imports all sections
│ │ │ ├── globals.css # Design tokens, utility classes
│ │ │ └── error.tsx # Next.js error boundary
│ │ └── components/
│ │ ├── Navbar.tsx # Fixed top nav with anchor links
│ │ ├── Hero.tsx # Full-width hero + animated TerminalDemo
│ │ ├── TerminalDemo.tsx # Auto-replaying wizard terminal animation
│ │ ├── FeaturesOverview.tsx# 3 pillar cards
│ │ ├── CloudsSection.tsx # AWS / Azure / GCP detail cards
│ │ ├── ProvidersSection.tsx# 4 LLM provider cards
│ │ ├── FeatureGrid.tsx # 12-feature grid
│ │ ├── HowItWorks.tsx # 4-step numbered guide
│ │ ├── SecuritySection.tsx # Security guarantee cards
│ │ ├── InstallSection.tsx # curl one-liner + commands table
│ │ └── Footer.tsx # Brand, nav, license
│ ├── next.config.ts
│ ├── postcss.config.mjs
│ ├── tsconfig.json
│ └── package.json
│
├── .gitignore # Monorepo-wide ignores
└── README.md # This file
| Package | Language | Purpose |
|---|---|---|
cli/ |
Bash + Terraform | CLI that provisions Hermes Agent on cloud VMs |
website/ |
Next.js 15 / TypeScript | Marketing website |
curl -sSL https://raw.githubusercontent.com/unrealandychan/Hermes-Agent-Cloud/main/cli/install.sh | bashOr manually:
git clone https://github.com/unrealandychan/Hermes-Agent-Cloud
cd Hermes-Agent-Cloud/cli
./install.shhermes-agent-cloud # interactive wizard
hermes-agent-cloud deploy --cloud aws # flags mode
hermes-agent-cloud status --cloud azure
hermes-agent-cloud ssh --cloud gcp
hermes-agent-cloud logs --cloud aws
hermes-agent-cloud secrets --cloud azure
hermes-agent-cloud destroy --cloud awsRun multiple isolated Hermes Agent instances on the same machine — each with its own API keys, config, port, and systemd service.
- Separate work and personal profiles with different API keys
- Run different LLM providers side-by-side (e.g. OpenRouter vs Anthropic)
- Isolate projects that need different agent configurations
# Create a new profile (prompts for API keys)
hermes-agent-cloud profile create work
hermes-agent-cloud profile create personal
# List all profiles and their ports
hermes-agent-cloud profile list
# Switch the active profile
hermes-agent-cloud profile use work
# Show details of a profile
hermes-agent-cloud profile show work
# Remove a profile
hermes-agent-cloud profile remove workEach profile gets an automatically assigned port pair:
| Profile | Web Dashboard | API Gateway |
|---|---|---|
default |
9119 |
8080 |
| 1st extra | 9120 |
8081 |
| 2nd extra | 9121 |
8082 |
| … | … | … |
~/.hermes-profiles/
├── default/ # backward-compatible with v1.x
│ ├── .env # API keys (chmod 600)
│ └── config.yaml
├── work/
│ ├── .env
│ └── config.yaml
└── personal/
├── .env
└── config.yaml
Each profile runs as its own systemd service (hermes-default, hermes-work, hermes-personal), so they start independently on reboot.
Backward compatibility: Existing single-instance deployments continue to work unchanged — they are automatically treated as the
defaultprofile.
cd website
npm install
npm run dev # http://localhost:3000| Cloud | Compute | Secret Store | SSH Options |
|---|---|---|---|
| AWS | EC2 (Ubuntu 24.04) | SSM Parameter Store | Direct SSH · SSM Session Manager |
| Azure | VM Standard_D2s_v3 | Azure Key Vault | Direct SSH · az ssh extension |
| GCP | Compute Engine e2-standard-2 | Secret Manager | Direct SSH · gcloud compute ssh |
Hermes Agent ships with a built-in web dashboard (v1.0.2+) that provides a browser-based UI for managing and interacting with the agent.
| Endpoint | Port | Description |
|---|---|---|
| Web Dashboard | 9119 |
Browser UI — docs |
| API Gateway | 8080 |
REST/WebSocket API endpoint |
Both ports are restricted to your deployer IP at provision time. To access the dashboard after deployment:
http://<instance-ip>:9119
| Provider | Env Var | Notes |
|---|---|---|
| OpenRouter | OPENROUTER_API_KEY |
600+ models, recommended |
| OpenAI | OPENAI_API_KEY |
GPT-5, GPT-5.4, GPT-4.1, o3 |
| Anthropic | ANTHROPIC_API_KEY |
Claude 4.6 Sonnet, Claude 4.6 Haiku |
| Google Gemini | GEMINI_API_KEY |
Gemini 3.1 Flash / Pro, Gemini 2.5 Pro |
At least one provider required. Mixed-provider setups fully supported.
All valid option values live in a single file — cli/lib/enums.sh.
To add a new cloud region, instance type, or LLM provider, edit only that file.
- Fork the repo
- Create a feature branch (
git checkout -b feat/my-feature) - Commit your changes
- Open a Pull Request against
main
MIT © unrealandychan