— ChatHermes × Kimi K2 · Open Source v1.0.0

We built it
in the open.

Every line of the code that runs chathermes.com is in a public repository. 6,683 lines of TypeScript. 17 narration MP3s. 14 real tools. One SQLite file. No black box. Bring your own keys, your own server, your own brand.

— founder mode

Why give it away.

I'm shipping ChatHermes from Jakarta with my co-builder @supercryptolord — yes, that @kwkuh is me — competing with companies that have 100x more engineers. The only way we win is if you can read the code.

Closed source costs us trust we can't afford. Open source costs us nothing — the moat isn't the code, it's the operational cost of running it well at scale: pre-pooled LLM keys, verified email domain, Hetzner pool, monitoring, backups. That's what running it well costs to operate.

If you'd rather run it yourself: clone the repo, point it at your own keys, ship. We genuinely want you to. And if you build something cool with it, we'll link to you.

The license has teeth — see below — because we want adoption AND sustainability. The same playbook as Plausible, Discourse, Mautic. It works.

— inside the repo

156 files. Zero leaks.

Every feature on chathermes.com works under self-host. The only thing different is whose keys, whose servers, whose backups.

14 chat-time tools

Real APIs, no mockups. web_search (5-tier fallback), browse, github_repo, weather, news_search, wikipedia, save/recall_memory, telegram_send, run_js, fetch_url, generate_image (Replicate Flux), analyze_image (Gemini/GPT-4o), dispatch_subagent.

orchestrator/src/tools.ts · 414 lines
Private Agent infrastructure

Free users share a Bun OpenAI-compatible proxy on :19002. Paid users auto-provision dedicated Hetzner Cloud servers via cloud-init. Gated by default — admin clicks Provision per upgrade.

orchestrator/src/private_agent.ts · 380 lines
Vibe coding workspace

Type "build me a landing page for X". Code streams left, preview renders right. Multi-file fullstack. Publish to /p/<slug>. Per-plan project quotas.

web/src/app/dev/[id]/_vibe-workspace.tsx · 518 lines
Cinematic /introducing demo

17-chapter video-style walkthrough. edge-tts narration MP3s (en-GB-RyanNeural, free). Procedural Web Audio backsound (Cm7 pad + 75 BPM sub-pulse + FM bell pings). Self-record to WebM.

web/src/app/introducing/page.tsx · 1,200+ lines
Conversion-focused billing

Hero ("You're sharing. Your agent shouldn't be."), 3-card pricing with Pro emphasized, comparison table, FAQ, trust bar, invoice PDF download, Stripe Checkout + Customer Portal.

web/src/app/app/billing/page.tsx · 561 lines
Mobile super-app interface

Bottom tab bar (Chat / Build / Memory / Plan / More) + bottom-sheet drawer for secondary nav. Thumb-zone composer. Safe-area inset support.

web/src/app/app/_components/mobile-tab-bar.tsx · 280 lines
Required Attribution

Runtime guard refuses to start the orchestrator if _attribution.ts is tampered. X-Powered-By header on every response. Floating badge on /p/<slug> public previews.

orchestrator/src/_attribution.ts · 75 lines
Built-in PWA + status page + Cmd+K

Installable mobile-first web app. Public /status page with real-time service health. Global search across messages, memory, projects.

web/src/app/_components/* · varies
— ship it yourself

Three install paths.

01
recommended~5 min
Docker Compose

The path we recommend. One command, works on macOS / Linux / Windows / WSL. Single SQLite file persists in ./data/.

git clone https://github.com/ai-co-id/chathermes.git
cd chathermes
./bin/setup.sh           # interactive .env wizard (60s)
docker compose up -d
# → open http://localhost:7000
02
~90 sec
Hetzner one-click

If you already have a Hetzner Cloud token. Cloud-init bootstraps Bun + Docker + clones repo + writes .env + runs docker compose up. Server size and region are your choice.

curl -X POST https://your-self-host.com/api/deploy/hetzner \
  -H "Content-Type: application/json" \
  -d '{
    "token": "hcloud_...",
    "server_type": "cx22",
    "location": "nbg1",
    "llm_keys": { "nous": "..." }
  }'

# Returns: { ok: true, ip, url, ssh_command }
# Total: ~90 seconds to a fresh Hetzner Cloud server with HTTPS.
03
~10 min
Bun runtime

No Docker. Requires Bun ≥ 1.3 + Node ≥ 22 (for Next.js). Use this for fastest iteration in development.

# Orchestrator
cd orchestrator
bun install
bun run src/index.ts &

# Web (in another terminal)
cd web
bun install
bun run build
PORT=7000 ORCH_URL=http://127.0.0.1:7010 bun run start
— minimum viable .env
PUBLIC_BASE_URL=http://localhost:7000
SESSION_SECRET=$(openssl rand -hex 32)
NOUS_API_KEY=hf_...     # OR KIMI_API_KEY, OR ANTHROPIC_API_KEY, etc. Pick one.
Everything else is optional. Resend, Stripe, Hetzner, Replicate, Tavily, Brave — features degrade gracefully if absent. See full orchestrator/.env.example for all 30+ vars documented.
— honest split

Self-host vs cloud.

The code is identical. What changes is the operations.

Capability
Self-host
chathermes.com
LLM API keys
bring your own
pre-pooled
Hermes Agent native (:19002)
pip install nous-hermes-agent
pre-installed
Email
BYO Resend + DNS
verified domain
Stripe
BYO account + price IDs
live + monitored
Hetzner private agents
your token, your project
our managed pool
Auto-provision on upgrade
gated (admin clicks)
automatic
Backups
DIY (cron + rsync)
included, off-site
Updates
git pull
automatic
Status page / SLA
build it yourself
99.9% target
You operate
your infra, your keys, your boundary
we operate it for you
— license terms

AGPL-3.0 + Required Attribution.

— you can
  • Use commercially
  • Modify and redistribute
  • Sell hosting (with your own brand if re-branded)
  • Charge for support, customizations, deployments
  • Run on your own infrastructure forever
  • Audit every line of source
— you cannot
  • Strip the visible "Powered by ChatHermes" link
  • Remove the X-Powered-By: ChatHermes HTTP header
  • Use the name "ChatHermes" or our mascot for your fork
  • Modify _attribution.ts identifying constants
  • Bypass the runtime guard
  • Pretend to be us
— enforcement

The runtime guard in orchestrator/src/_attribution.ts checks that all required attribution constants are present at startup. If tampered, the orchestrator refuses to start.

The X-Powered-By header is set in middleware on everyHTTP response. The /p/<slug> public preview includes a floating "Made with ChatHermes" badge that's compiled into the served HTML. These aren't suggestions. They're the license.

Read full LICENSE.md
— trust through verification

Audit it yourself.

We ship a verify script. Run it after cloning to confirm the bundle is clean: zero credentials, zero PII, attribution intact.

bash bin/verify-bundle.sh
== verify-bundle ==
-- attribution layer --
  + _attribution.ts present
  + runtime guard present
-- credential scan (strict, real-key shape) --
  + zero real credentials matched
-- email/PII scan --
  + no team emails leaked
-- IP scan --
  + no production IPs leaked
-- env hygiene --
  + no real .env shipped
  + .env.example present
  + no production database shipped

  ALL CHECKS PASSED

Clone it.
Ship it.

6,683 lines of TypeScript waiting for you on GitHub. v1.0.0 tagged. Verify-bundle passes. Nothing held back.