Forge is a builder community first. Follow nmg.labs on all four — tap each, give us a follow, then come back. The handbook unlocks once all four are done.
Tapping opens the profile in a new tab. Builders who don't genuinely follow may be removed from the cohort — you confirm on the next step.
Starter 1 (OpenClaw, the hands) + Starter 2 (Hermes, the brain) in one online qualifier. Set up your two-agent system on a 100% free stack, wire it through Slack, and let your agents build one small, real app. Ship it and you earn your guaranteed in-person seat at Forge 2 Edition 2 on Saturday 8 August 2026.
Online · solo~ a focused build, not a marathonFree models onlySubmit: GitHub repo + live URL
Forge 2 is about orchestrating a team of AI agents instead of typing every line yourself. This qualifier proves you can stand up that team and drive it. You will:
| Step | You are here | Then |
|---|---|---|
| This qualifier (online) | Set up OpenClaw + Hermes + Slack, ship the tiny Kanban, submit repo + URL. | Pass → guaranteed seat. |
| Forge 2 Edition 2 (in person, Sat 8 Aug 2026, NMG Gurugram) | The real multi-agent sprint — Hermes orchestrates OpenClaw to ship a real build in one day. | Top performers → Forge 3 + NMG offers. |
| Component | Tool | Role | Cost |
|---|---|---|---|
| Coding agent (hands) | OpenClaw — github.com/openclaw/openclaw | Writes/runs code, reports in chat | free / OSS |
| Orchestrator (brain) | Hermes Agent — NousResearch/hermes-agent | Plans, remembers, runs a skill, can run on a schedule | free / OSS |
| Comms (human-in-the-loop) | Slack (free workspace) | The channel you command agents from; everything visible | free |
| Models | Ollama (local) · Groq free · Google Gemini free | Power the agents | free tiers / local |
| Version control | GitHub (public repo) | Where the agents' code lands | free |
| Hosting | Vercel / Netlify (frontend) · Render/Railway free (API) | Your live URL | free tiers |
node -v · python --versionforge2-qualifier-<yourname>npm install -g openclaw@latest # needs Node 22.19+ (24 recommended)
openclaw onboard # guided wizard: gateway, workspace, channels
openclaw doctor # diagnose any config/channel problems
Config lives in openclaw.json. You apply changes with config "patches".
Create a Slack app first (see §05 for the full Slack steps and the exact bot scopes). Then:
openclaw plugins install @openclaw/slack
export SLACK_APP_TOKEN=xapp-... # app-level token, scope: connections:write
export SLACK_BOT_TOKEN=xoxb-... # bot user OAuth token
cat > slack.socket.patch.json5 <<'JSON5'
{ channels: { slack: {
enabled: true,
mode: "socket",
appToken: { source: "env", provider: "default", id: "SLACK_APP_TOKEN" },
botToken: { source: "env", provider: "default", id: "SLACK_BOT_TOKEN" },
} } }
JSON5
openclaw config patch --file ./slack.socket.patch.json5 --dry-run # preview
openclaw config patch --file ./slack.socket.patch.json5 # apply
openclaw gateway # run it
openclaw doctor reports no channel/config errors.openclaw gateway running, you @-mention the bot (or DM it) in your Slack channel and it replies.# Linux / macOS / WSL2
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
# Windows (PowerShell, native)
iex (irm https://hermes-agent.nousresearch.com/install.ps1)
source ~/.bashrc # or ~/.zshrc / restart shell
hermes setup # setup wizard
hermes model # choose a (free) model provider — see §06
hermes # start the agent (TUI)
Tell Hermes a fact in one message ("our repo is forge2-qualifier-priya, default branch main"). In a later session, ask it to recall that fact. Hermes ships persistent memory + cross-session search — confirm it remembers without you re-pasting.
SKILL.md)Create one reusable skill so a task type runs the same way every time. Minimal example committed to your repo at skills/status-report/SKILL.md:
---
name: status-report
description: Post a What I Did / What's Left / What Needs Your Call update to Slack.
---
When asked for a status update, gather: tasks completed, tasks remaining,
and any decision you need from the human. Reply in exactly three sections:
**What I Did** / **What's Left** / **What Needs Your Call**.
Use Hermes' built-in cron to fire at least once without a manual prompt (e.g. "every 10 minutes, post a one-line progress update to #sprint-main"). Capture proof it ran on its own.
hermes doctor is clean; hermes model shows a free provider selected.SKILL.md fires automatically for its task type.chat:write, channels:history, channels:read, app_mentions:read, im:history, users:read. (OpenClaw's Slack plugin lists more optional scopes — add them if it asks.)connections:write, generate, copy the xapp-....message.channels, app_mention.xoxb-...)./invite @YourBot into your channels.| Channel | Purpose |
|---|---|
#sprint-main | You talk to the brain (Hermes). Plans, decisions, status updates land here. |
#agent-coder | Hermes assigns coding tasks; OpenClaw works and reports here. |
#agent-log | Raw agent activity / autonomous-run output. Your audit trail. |
#sprint-main → Hermes posts a plan → Hermes hands a task to OpenClaw in #agent-coder → OpenClaw writes code, runs it, and reports What I Did / What's Left / What Needs Your Call → you approve or correct. No agent works in private DMs or off-channel.Run this round-trip — if all three succeed, your Slack wiring is correct:
export SLACK_BOT_TOKEN=xoxb-...
export CH=C0XXXXXXX # your channel ID (channel → View details → bottom)
# 1) token valid? -> {"ok":true,...,"user":"yourbot"}
curl -s -H "Authorization: Bearer $SLACK_BOT_TOKEN" https://slack.com/api/auth.test
# 2) can post? -> {"ok":true,"ts":"..."}
curl -s -X POST https://slack.com/api/chat.postMessage \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" -H "Content-Type: application/json" \
-d "{\"channel\":\"$CH\",\"text\":\"round-trip test ✅\"}"
# 3) can read? -> JSON containing your message
curl -s -H "Authorization: Bearer $SLACK_BOT_TOKEN" \
"https://slack.com/api/conversations.history?channel=$CH&limit=5"
not_in_channel → invite the bot. missing_scope → add the scope and reinstall the app. Save these outputs (screenshot) — they are good submission evidence.
All three speak the OpenAI Chat format, so any agent that accepts a base URL + key + model id can use them.
| Free option | Base URL | Model id | Notes |
|---|---|---|---|
| Ollama (local) | http://localhost:11434/v1 | qwen2.5-coder | Truly free, offline. ollama pull qwen2.5-coder. Key = any string. |
| Groq (free) | https://api.groq.com/openai/v1 | openai/gpt-oss-120b, llama-3.3-70b-versatile | Very fast. Key from console.groq.com. Free RPM/RPD limits apply. |
| Gemini (free) | https://generativelanguage.googleapis.com/v1beta/openai/ | gemini-2.5-flash | Big context. Key from aistudio.google.com. |
Recommended routing: Hermes (brain / planning) → a stronger model (Groq gpt-oss-120b or Gemini 2.5-flash); OpenClaw (hands / execution) → qwen2.5-coder on Ollama or Groq llama-3.3-70b. Be ready to say why you routed it that way — judges reward the reasoning.
# quick model sanity test (Groq example)
curl https://api.groq.com/openai/v1/chat/completions \
-H "Authorization: Bearer $GROQ_API_KEY" -H "Content-Type: application/json" \
-d '{"model":"openai/gpt-oss-120b","messages":[{"role":"user","content":"reply: ok"}]}'
This is the "real task" your two-agent system ships. Keep it small and working. You are the product owner: you describe it in #sprint-main, Hermes plans it, OpenClaw writes it, you review in chat.
#sprint-main1. "Plan a tiny Trello-style Kanban: Laravel API (SQLite) + React (Vite).
Entities: Board, List, Card, Tag, Member. Features: CRUD boards/lists/cards,
move card between lists, tags, assign member, due date. Post the plan +
task breakdown before writing any code."
2. (after you approve) "Assign task 1 to the coder. Have it scaffold the Laravel
API with migrations + models + routes, run the migration, and report back."
3. "Now the React board UI that lists boards and renders lists/cards."
4. "Add tags, member assignment, and due dates. Show me a status report."
Commit incrementally (not one giant commit). Your public GitHub repo must contain:
README.md — what the app does, which models you used and why, exact run instructions (how to start the API + UI locally), and your live URL.ARCHITECTURE.md — which agent does what (brain vs hands), your Slack channel scheme, and your model routing.agent-log.md — the unedited log of your agents working (paste the key chat exchanges: human task → plan → code → report). This is required.slack-export/ (or screenshots) — proof of the chat loop, the autonomous run, and the Slack round-trip test output.skills/<name>/SKILL.md — the reusable skill you wrote for Hermes.openclaw.json + Hermes config (with secrets removed) and a .env.example listing the env vars (never commit real tokens/keys)./backend (Laravel) + /frontend (React).evidence/walkthrough.mp4 (or a GIF): a 60 to 90 second screen-recording committed to the repo. No external video links..env.example with placeholder values. Leaked tokens = we ask you to rotate them and it hurts your "repo & docs" score./frontend, deploy. You get a public URL.Done (or want to lock in progress)? Submit right here — you can resubmit while the qualifier is open and we score your latest entry.
Prefer a standalone page? Open the submission form ↗
Every submission goes through a hybrid evaluation — automated analysis of your repo and evidence, combined with human review — scored out of 100. It rewards a clean, working two-agent setup and loop, not scale or flashiness.
| What we score | Weight | What "great" looks like |
|---|---|---|
| Agent setup correct | 18 | OpenClaw + Hermes both installed, configured, and demonstrably running on a free model. |
| Working chat loop | 22 | Human posts a goal → agent plans → codes → reports (What I Did / What's Left / What Needs Your Call) → you correct. Visible in Slack. |
| The Kanban app runs | 25 | Live URL (or clean local run) with the 5 required features working. |
| Memory + a skill | 12 | Hermes recalls a fact across sessions; your SKILL.md fires; one autonomous run. |
| Human-in-the-loop visibility | 10 | All agent activity in channels; nothing hidden; you can intervene. |
| Free stack | 5 | Ollama / Groq / Gemini only. No paid models. |
| Repo & docs | 8 | README, ARCHITECTURE, agent-log, incremental commits, no leaked secrets. |
Small bonus (up to +3) for working email alerts + card comments. To earn a seat you need a solid overall score and a genuinely working loop + running app — a polished repo with no working agents will not pass.
All of these speak the OpenAI chat format, so any agent that takes a base URL + key + model id can use them. Old Groq IDs (kimi-k2, old llama tags) are decommissioned — a tutorial that gives you one will fail with 400 model_decommissioned. Use the current IDs below.
| Provider | Base URL | Current model id(s) | Free? |
|---|---|---|---|
| Ollama (local) | http://localhost:11434/v1 | qwen2.5-coder | ✓ unlimited, offline |
| Groq | https://api.groq.com/openai/v1 | openai/gpt-oss-120b, openai/gpt-oss-20b | ✓ no card · low TPM |
| Google Gemini | https://generativelanguage.googleapis.com/v1beta/openai/ | gemini-2.5-flash | ✓ most generous |
| OpenRouter | https://openrouter.ai/api/v1 | any …:free model | ✓ 50/day (1000 after one-time $10) |
| Cerebras | https://api.cerebras.ai/v1 | gpt-oss-120b | ✓ ~1M tokens/day |
| Cloudflare Workers AI | …/accounts/<id>/ai/v1 | Llama / Qwen variants | ✓ 10k neurons/day |
openai/gpt-oss-120b or Gemini gemini-2.5-flash; OpenClaw (coding) → Ollama qwen2.5-coder (local, unlimited). Fallback ladder on 429: Groq → Gemini → OpenRouter :free → Cerebras → Ollama. Unsure what's live? list a provider's models with GET /v1/models.:free variant.| Symptom | Cause → Fix |
|---|---|
400 … model_decommissioned | Dead Groq id (kimi-k2, old llama). → Use openai/gpt-oss-120b or -20b. |
429 Too Many Requests | Free TPM/RPM hit (Groq's TPM is low for coding agents). → Lower max_tokens, add a few-second backoff, or switch to Gemini/Ollama (fallback ladder). |
401 invalid_api_key | Key wrong/expired or wrong provider. → Recreate the key; make sure it matches the base URL's provider. |
| model_not_found / 404 on chat | Typo/missing namespace or wrong base URL. → Groq ends /openai/v1, Ollama /v1, Gemini /v1beta/openai/. |
| "Groq free doesn't work at all" | Almost always a dead model id (above). Groq free works with no card — recreate a key at console.groq.com and use a current id. |
| Symptom | Cause → Fix |
|---|---|
| "model not found" / pull fails | → ollama pull qwen2.5-coder first; verify the tag with ollama list. |
| Laptop freezes / "killed" / OOM | Model too big for your RAM. → Smaller tag: 8 GB → :3b, 16 GB → :7b, 32 GB → :14b. Close other apps. |
| Painfully slow | Running on CPU (VRAM overflow). ollama ps shows CPU/GPU split — any CPU% = slow. → Smaller model or a free cloud API. |
connection refused on :11434 | Ollama isn't running. → Start the Ollama app / ollama serve. |
| OpenAI endpoint 404 | Dropped the /v1. → http://localhost:11434/v1; key = any non-empty string. |
| Agent "configured" but model never used | Watch Ollama's console while it answers — if nothing hits it, the agent fell back. See OpenClaw #7211 below. |
| Laptop is just too weak | Don't fight it. → Free cloud API (Groq gpt-oss-120b / Gemini gemini-2.5-flash), identical config. |
| Symptom | Cause → Fix |
|---|---|
| Install fails | Node too old. → Need Node 22.19+ (24 best): node -v, then npm install -g openclaw@latest. |
| Gateway won't start | → openclaw doctor and fix what it flags (config / port / channel). |
| Bot silent in Slack | Not invited or missing scope. → /invite @YourBot; add scopes; reinstall the app after any scope change. |
| Uses the wrong model (issue #7211) | Custom/local model silently ignored. → Confirm it shows in openclaw models list and watch your model server logs while it answers. |
| Symptom | Cause → Fix |
|---|---|
| Install path confusion (Windows) | Native = %LOCALAPPDATA%\hermes; WSL/Linux = ~/.hermes. → Use one; reload the shell after install. |
| "Memory doesn't work" | Memory is snapshotted at session start — new facts appear next session. → Verify recall across TWO sessions, not within one prompt. |
| SKILL.md never fires | Bad frontmatter / vague trigger. → Keep name/description frontmatter; make the trigger specific. |
| Cron / autonomous run never fires | Gateway must be running. → Start it; check ~/.hermes/cron/output/ for proof. |
| Symptom | Cause → Fix |
|---|---|
not_in_channel | → /invite @YourBot into the channel. |
missing_scope | Add the scope, then reinstall the app (scopes don't apply until reinstall). |
invalid_auth | Wrong token. xoxb- = bot (API calls); xapp- = app-level (Socket Mode, connections:write). Don't mix. |
| Works in DMs, not channels | Missing message.channels event + channels:history scope. → Add both, reinstall. |
| Socket disconnects / no events | Socket Mode off or app token missing. → Enable Socket Mode + app token with connections:write. |
| Symptom | Cause → Fix |
|---|---|
| Repo private when judged | Can't be scored = DQ. → Make it public before submitting; keep it public. |
| Leaked a token in the repo | → Remove it, use .env.example with placeholders, rotate the key. |
| Live URL dead when judged | → Redeploy (Vercel/Netlify), or put clear local-run steps + a video in the README. |
| "Works on my machine" but not in repo | Clone fresh into a new folder and run it before submitting — unpushed files can't be seen. |
Stuck during the window? Post in the Forge channel — mentors are around. For anything else:
Forge Captain: Ayush Gupta · labs@nmgdigital.com · response under 24h.