A local guild of adventurers · v0.2.50 GitHub

A local guild.
@mention the one you want.

Not another omniscient chat. Staff named seats. A channel is an open contract. A turn that ran tools is verified before it writes to MEMORY.md. Next move is npx @kevin5251984/guild web — opens http://127.0.0.1:7420.

Node ≥ 22.19 engines npx @kevin5251984/guild web one line http://127.0.0.1:7420 the hall MIT free

00 · 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.

01 · v0.2.50

What the hall can do tonight

This page is a four-language fixture. The product on :7420 is English chrome with five Chinese seat names — not a four-language app.

Branch a quest

Open a branch from a message. The child keeps the roster, Channel.md, and up to 20 messages. Close can merge MEMORY.md back to the parent.

/m away

Same loopback hall. Read, reply, stop, steer — over HTTP. Attachments, branches, and the trajectory panel stay on the desk.

OpenCode Free

Default model path with no API key. Those prompts go to opencode.ai. Switch provider in /settings.

Reasoning · speed

Effort only where the model supports it. Fast picks low, then minimal — not a second provider.

Waves, not a pile-on

@handle does not hire a seat. @quest / @channel / @all broadcast. Numbered lines share a wave; 完成後 / 最後 wait.

Local guards

Foreign Origin is refused. Host browse hides secret files. MCP HTTP shows env keys, values as ***.

02

The hall on disk

The hall on :7420. This tab is a fixture of the same idea.

03 · How a turn runs

One turn. One process.

@handle → chatReply → HarnessService.turn → runAgentLoop

No tool calls

That text is the answer. The loop stops.

Tool calls

gateTool → Promise.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 workspace_write. Opt in to full_access.

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

04 · What runs locally

Your disk. Your models.

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

  • One line. No clone.
  • The hall is loopback http://127.0.0.1:7420.
  • OpenCode Free if you have no key.
  • MIT. Your disk. Your models.

MIT · $0

Not a SaaS seat. Not a cloud workspace. A local guild.

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, gated to the workspace. Unset GUILD_SANDBOX = workspace_write.
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.
OriginForeign Origin is refused. Missing Origin is allowed. Not a login.
Host filesDenylist: oauth.json, models.json, mcp.json, commandcode.json, credential files. Home is still browsable.
MCP envHTTP shows keys; values are ***. The child still gets the real env.
ScheduleHost ticker (60s). cronjob tool. Per-job sheet at #s/<id> — pause, resume, test run.

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

05 · FAQ

Before you npx

Do I need an API key tonight?

No. OpenCode Free is the default path. Those prompts go to opencode.ai. Command Code is an optional subscription picker. Switch provider in /settings.

Does this tab talk to the hall?

No. Interactive preview — no model calls. Fixed replies. This tab does not talk to 127.0.0.1:7420.

Do I need to clone the repo?

No. Node ≥ 22.19 and npx @kevin5251984/guild web is enough. pnpm is only if you are reading the code.

What can run and write do?

Your shell, gated to the workspace. Unset GUILD_SANDBOX = workspace_write. Read SECURITY.md before you point this at a machine you care about.

Can I schedule a later hall turn?

Yes. Ask a seat, or open the sidebar sheet. Times read like speech — every 2h, in 30m, 0 9 * * * — and each job gets a sheet with pause, resume, and a test run that returns to that hall. A run cannot schedule another job.

What changed recently?

One guild master can open channels, create seats, and assign work, and stays off every roster. The hall eases open instead of snapping. Settings stays one roster, and Free stays a single row.

Free. Open source under the MIT license.