Group chats → durable artifacts
🧪 Beta section
This is the least paved part of the workshop. Everything below works, but you'll be assembling it yourself rather than running an installer. Do the first three parts first.
The idea: a good group chat produces real knowledge — the recommendations, the arguments that settled something, the list everyone keeps re-asking for. Then it scrolls away. Your agent already has access to those chats through OpenClaw. Point it at them, and have it write the durable thing out to a wiki that doesn't scroll.
The pipeline:
group chat → OpenClaw agent reads it → extract candidate artifacts
↓
NoteStream (capture / working memory)
↓
wikihub (the durable, linkable artifact)
01 — Get the chat into reach
If you connected Telegram, WhatsApp, Slack, Signal, or Discord in part 1, your agent can already see those conversations. Group access is separate from DM access and has to be granted explicitly.
Find the IDs you need:
openclaw directory groups # list group IDs for a channel
openclaw logs --follow # your own numeric user ID shows up here
Then allowlist the group. For Telegram:
{
channels: {
telegram: {
groupPolicy: "allowlist",
groups: {
"-1001234567890": { requireMention: true },
},
},
},
}
requireMention: true means the agent only speaks when addressed — it still reads, which is what we want. An agent that chimes in unprompted gets removed from the group within a day.
🔒 Consent, seriously
Other people are in this chat. Tell them there's a bot in the room, keep the extraction private by default, and let them see the output before it goes anywhere public. The pattern below defaults to a private wiki for exactly this reason.
02 — Wire up NoteStream
NoteStream is the capture layer — where extracted candidates land before you decide they're worth keeping.
Create an API key in the app: Settings → API Keys. Store it somewhere your agent can read but the world can't:
mkdir -p ~/.config/notestream
printf '%s' 'YOUR_KEY' > ~/.config/notestream/api-key
chmod 600 ~/.config/notestream/api-key
The API is https://api.notestream.cloud with an X-API-Key header. The three calls you'll use:
KEY=$(cat ~/.config/notestream/api-key)
# search — returns note IDs + authors, not bodies
curl -s https://api.notestream.cloud/search \
-H "X-API-Key: $KEY" -H 'content-type: application/json' \
-d '{"ast":{"visibility":"all","tags":[{"hashtag":"workshop"}],"sortBy":"newest"},"page":1,"pageSize":100}'
# fetch a note body (ProseMirror JSON)
curl -s https://api.notestream.cloud/content/<id> -H "X-API-Key: $KEY"
# create a note
curl -s -X POST https://api.notestream.cloud/notes \
-H "X-API-Key: $KEY" -H 'content-type: application/json' \
-d '{"content":{"type":"doc","content":[...]}}'
⚠️ Two gotchas that will cost you an hour
- The docs say the tag filter key is
hashtags. The deployed server wantstags: [{"hashtag":"name"}], no#prefix.visibility: "my-world"combined with any text or tag filter returns a 500. Usevisibility: "all".- There is no NoteStream MCP endpoint yet —
api.notestream.cloud/mcp404s. Use the REST API from a skill, as above. (Ideaflow does have MCP — see connectors.)
➤ API reference: ai-docs.notestream.cloud
03 — Give the agent a schema, not just a prompt
This is the part people skip, and it's the part that makes the difference. "Summarize this chat" gives you a summary nobody reads twice. Naming the artifact types up front gives you something that accumulates.
Write an AGENTS.md next to the output that says what kinds of pages exist and what goes in each. A real one, from a wiki built this way:
raw/ — lightly cleaned source excerpts, by time window. Never overwrite.
wiki/ — LLM-generated pages. Framings, layers, themes, meta.
AGENTS.md — the schema (this file).
log.md — append-only ingestion record.
index.md — content catalog.
Then define the page types explicitly — e.g. framing, concept, person, decision, resource, open-question. The agent files each extraction into a type instead of writing prose.
Two rules that matter more than they look:
- Never overwrite
raw/. Re-runs must be able to disagree with earlier passes. log.mdis append-only. You need to know what has already been ingested, or every run re-extracts the same twenty things.
04 — The extraction prompt
Something in this shape, run against a window of messages:
Read these messages from (group, date range). Extract only things that are still true and still useful in a month. For each: the artifact type, a title, the claim in one sentence, the verbatim quote it came from, and who said it. Skip logistics, scheduling, reactions, and anything already in
log.md. If nothing qualifies, say so — do not pad.
"If nothing qualifies, say so" is doing real work there. Most chat windows genuinely contain nothing durable, and an agent that always produces five artifacts will invent five artifacts.
Good artifact types for a real group chat:
| Type | Example |
|---|---|
resource |
The tool three people independently recommended |
decision |
What the argument actually settled, and why |
person |
Who knows about what, per their own words |
open-question |
The thing that keeps coming back unresolved |
faq |
Whatever the newest member asks every time |
05 — Publish it
Push the result to wikihub — it's git-backed, so pages have history, and it has per-file access control. Start private.
pipx install wikihub-cli
wikihub signup --username you
wikihub new groupchat --title "Group Chat Knowledge"
echo "# Resources" | wikihub write you/groupchat/wiki/resources.md
Access control lives in .wikihub/acl (glob patterns, most specific wins, private by default):
* private
wiki/faq.md public
wikihub mcp-config prints the MCP JSON so your agent can read and write the wiki directly instead of shelling out.
A worked example
IdeaFlow Vision was built exactly this way — seeded from ~57 Slack messages tagged #explainingideaflow across 15 channels spanning 2022 to 2026, then grown with notes, talks, and transcripts. Read its AGENTS.md — the editorial stance section is the interesting bit: it says to prefer verbatim quotes over synthesis when the phrasing is distinctive, and to attribute co-workers by name when their framing sharpened the thinking.
That's the difference between a chat summary and an artifact. The summary flattens everyone into one voice. The artifact keeps the voices.
Back: Workshop index
Memory Workshop: jacobcole.ai/memory-workshop — every command here as a copy button.