A local guild of adventurers

A local bench of bots.
@mention the one you want.

Not another omniscient chat. Staff people with names. A channel is an open contract. Need Node ≥ 22.19. Next move is npx @kevin5251984/guild web — opens http://127.0.0.1:7420, not a star. Checkout with pnpm is the alternative.

Try the hall SECURITY.md
A local guild. @mention one adventurer.
Live hall on :7420 — this page is a fixture of the same idea.

Try the hall

Five seats. One @handle.

Click @pm — only PM answers. Click @rd — a different seat. Edit Voice, ask PM again — same person, different voice.

#demo · a channel has a job
Unchanged. Ask @pm, then change Voice, then ask again.

How the harness works

One turn. One process.

@handle → chatReply → HarnessService.turn → runAgentLoop

No tool calls

That text is the answer. The loop stops.

Tool calls

gateToolPromise.all → append results → ask again. Bounded. At the bound it asks for a final answer.

steer reaches the model next round as <user_steer>. Stop aborts the turn AbortSignal. Skill catalog is a name + summary; the body loads only when the model calls skill.

Guild borrowed one Hermes shape for the browser snapshot — never the live Chrome profile. The turn loop is Guild’s own. Not a Codex app-server harness. Not an OS jail. Default sandbox is full_access.

Files: packages/daemon/src/harness.ts · generate.ts · tools.ts · browser.ts.

What runs locally

Your disk. Your models.

Node ≥ 22.19. One line, no clone. The hall is http://127.0.0.1:7420.

npx
npx @kevin5251984/guild web
# http://127.0.0.1:7420

# checkout instead — pnpm 10.x
pnpm i
pnpm test
pnpm dev
LimitFact
run / writeYour shell. Unset GUILD_SANDBOX = full_access.
MCPHost Claude / Cursor / Codex stdio is live with no import step.
BrowserSnapshots last_used Chrome into ~/.guild/browser-profile/chrome. Set GUILD_BROWSER_REAL_PROFILE=0 for empty.

Read SECURITY.md before you point this at a machine you care about.