This is a submission for the Hermes Agent Challenge
Live app: https://devbrief-tau.vercel.app
Repo: github.com/sundayonah/devbrief
Hermes health: devbrief-hermes.onrender.com/health
Setup guide: How I connected Hermes to Next.js
What I Built
DevBrief turns GitHub activity into human-readable standups, PR changelogs, or work logs. Any visitor can sign in with GitHub OAuth, pick a repo, set a time range and branch, filter PRs and authors, choose a tone (casual / formal / concise), and hit Generate.
The Next.js app does not call OpenRouter directly. It fetches commits, PRs, and issues from GitHub, then calls Hermes Agent’s OpenAI-compatible API (POST /v1/chat/completions) on a long-running gateway. Hermes runs the agent loop (skills, tools, server-side model config) and returns the final brief.
Architecture:
Users → DevBrief (Vercel)
↓ POST /api/summary → lib/hermes.ts
Hermes gateway (Docker on Render)
↓ model: openrouter/owl-alpha
OpenRouter (API key only on Hermes — not on Vercel)
Demo
Try it:
- Open devbrief-tau.vercel.app
- Connect GitHub → select a repo → choose output mode and tone → Generate
- Confirm Hermes is up: https://devbrief-hermes.onrender.com/health
Code
Repository: github.com/sundayonah/devbrief
| Piece | Location |
|---|---|
| Hermes client |
lib/hermes.ts → HERMES_ENDPOINT + POST /v1/chat/completions
|
| Summary API | app/api/summary/route.ts |
| Standup skill | hermes-skills/standup-writer.md |
| Hermes Docker image | docker/hermes/Dockerfile |
| Production model config |
docker/hermes/config.yaml (openrouter/owl-alpha, max_tokens: 2048) |
| Deploy guide | docs/DEPLOYMENT.md |
My Tech Stack
| Layer | Technology |
|---|---|
| Frontend | Next.js 14 (App Router), TypeScript, Tailwind CSS |
| Auth & GitHub | NextAuth.js, Octokit, GitHub OAuth |
| AI agent |
Hermes Agent — hermes gateway run + API server |
| Model |
openrouter/owl-alpha via OpenRouter (on Hermes host only) |
| App hosting | Vercel |
| Agent hosting | Docker on Render |
How I Used Hermes Agent
Hermes is not a chatbot wrapper here — the gateway is the brain for every generation.
| Hermes capability | How DevBrief uses it |
|---|---|
| API server |
API_SERVER_ENABLED=true; Next.js calls /v1/chat/completions server-side (no browser CORS) |
| Gateway |
hermes gateway run in Docker on Render — not inside Vercel serverless |
| Skills |
standup-writer.md copied to /root/.hermes/skills/ in the image |
| Server model config |
docker/hermes/config.yaml sets model.default: openrouter/owl-alpha (request model field is not what drives inference) |
| OpenRouter |
OPENROUTER_API_KEY on Render only — not in Vercel env |
| Auth |
API_SERVER_KEY on Render ↔ HERMES_API_KEY on Vercel |
| Cron / messaging |
hermes schedule documented as a next step in the UI; Slack/Telegram delivery disabled in current deploy |
Request flow:
POST /api/summary
→ GitHub API (user OAuth token)
→ generateBrief() in lib/hermes.ts
→ Hermes POST /v1/chat/completions
→ standup / PR changelog / work log
→ UI (copy, edit, history)
The long setup story (WSL PATH, duplicate .env keys, 127.0.0.1 vs localhost, OpenRouter 402, baking config.yaml for Render) is in the tutorial post.
What I learned
-
Start the gateway, hit
/health, then/v1/chat/completionsbefore wiring the app. -
Hermes reads
~/.hermes/config.yamlfor the real model — env vars and JSONmodelalone were not enough on Render until we shippeddocker/hermes/config.yaml. - Split hosting: serverless Next.js + long-running Hermes elsewhere is the right pattern for this challenge.
Thanks for reading — try the live demo and leave a comment if you hit snags with Hermes on Render or Vercel.

Top comments (0)