Synaplan
开源 AI 软件平台,面向企业:自托管 AI 代理,符合 GDPR 的聊天机器人小部件,RAG 知识库,WhatsApp 与 Outlook AI,MCP,多模型路由。支持 Docker、Kubernetes 或在 Germ 托管。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证A shared, git-backed event workspace for teams working a conference from Claude: a remote MCP server on Cloudflare (Artifacts, D1, R2).
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗A team working a conference gets one shared workspace in Claude (Desktop, web, mobile) or Codex. It covers prep before, contacts, notes and slides during, and follow-ups after. You talk to it in plain words: "who is this?", "log this person", "who have we met from Schneider?", "write up these slides".
First used for real at the 7x24 Exchange Fall Conference 2026 (San Antonio, Oct 25–28), with Edviro Energy.
A conference is days of conversations that matter, and most of them get lost. Badges get photographed and forgotten. Notes are split across four phones. Two teammates meet the same person and neither knows. Slides are photographed and never read again. By the time anyone opens the CRM, the week is a blur.
event-hog keeps what the team learns while they're still in the room. It does that without asking anyone to fill in a form, or to stop talking to the person in front of them.
Before the event
prep/: who's in the room, why they matter, which sessions count, and
how the team splits up. new_event starts the workspace and offers this
next (the event-prep skill).speakers/. It checks their
social accounts first, then coverage, quotes, and video
(augment-speakers-panelists).During the event
Contacts__Met.csv stays current.[gaps] to fill in. After you log something, it fills them
in from your notes, in the company's voice or your own. It never invents
what was said (parallel-content-generation-starters).capture-slides).event_brief, recent_activity, and the
daily-brief prompt answer "who did we meet today, by whom, and which
priority targets has nobody found yet?".After the event
recreate-slides-in-brand). If you don't have a
DESIGN.md yet, it drafts one from your company's site
(maintain-design-system).On the deployment we run, that's eventhog.cc.
On your own, open the Worker's home page (https://<your worker>/). Press
Copy this prompt. The prompt carries a personal connector link (a random key made in
the browser) and tells the person's agent how to add it: Cursor and Claude
Code and Codex add it themselves; Claude and ChatGPT apps walk the person
through Settings, Connectors. Then the agent calls get_started, which asks:
It finds (or starts, with new_event) the event's workspace, works out from
the dates whether they're before, during or after it, and returns
that phase's playbook:
conference-attendee-export), save it
(save_attendees), research and rank who's worth finding
(prioritize-attendees, enrich_people, save_targets), and show the
shortlist.log_contact), "who should I find next?" (targets), and the slide
camera page.draft-follow-up-emails); and
Origami for sending at scale.A key the server hasn't seen becomes a new member (the members table in
D1) on its first call. Keys in the PEOPLE secret keep working and win over
the table. There's no org management yet: everyone on a deployment shares
one workspace and one database.
Every way produces the same workspace (see
kit/templates/event/): prep/, speakers/,
contacts/ (one file per person), notes/, slides/, drafts/,
flash-cards/, and Contacts__Met.csv at the root. Start simple and add
connectors when the team needs them. The files carry over.
One person, Claude, and the kit's skills. Claude writes the workspace as files in its own sandbox and hands it back as a zip. The zip holds semi-structured markdown with frontmatter and the CSV. There's nothing to deploy and nothing stored anywhere but your chat and your downloads.
Good for trying it out, or for one person at a small event. The catch is that it's single player. Teammates can't see each other's contacts until someone merges the zips.
Deploy this server (one Cloudflare Worker) and give each teammate their own connector link. The workspace becomes a git repo on Cloudflare Artifacts that the whole team writes to at once. Every contact, note and slide write is a commit by the person who made it, so you get history, credit and undo.
Two more pieces come with the server:
Add a CRM connector next to event-hog in the same chat, and contacts can go on to your CRM. Each one is proposed first and created only after a person approves.
export_hubspot_csv writes an import file, and
Contacts__Met.csv is always current.context-v/specs/Pick-a-CRM-and-Go.md.See COLLABORATE.md: how to fork, what to review first, and the rules for keeping real event data out of the repo.
Three layers, each with one job (the full reasoning is in
context-v/decisions/2026-10-25_Three-Layers-and-an-Agnostic-CRM-for-Event-Hog.md):
| Layer | What | Job |
|---|---|---|
| Cloudflare Artifacts | One git repo per event (event-hog/<yyyy-mm-slug>), plus event-hog-kit | The shared, human-readable record: prep, contacts, notes, slides, drafts. Git history gives attribution and undo |
D1 agnostic-crm | SQLite, bound as CRM | A structured model of people, organizations, event series and instances, observations, interactions, affiliations and nested locations. Rebuildable from the files |
| The client's CRM | HubSpot today | A projection: contacts are proposed, approved, then created through the person's own HubSpot connector |
Plus an R2 bucket, event-hog-media, for images and PDFs, served at
/media/<key>. Repos hold text and the image's URL, never image bytes.
On every tool call the Worker clones the event repo into memory (isomorphic-git), changes files, commits as the caller, and pushes. If a teammate's push lands first, it retries from a fresh clone (up to 5 times). Writes add files or append to them, so a retry never clobbers anything.
| Path | What |
|---|---|
GET / | The landing page: copy the connect prompt with a personal link |
POST /mcp/<key> | The MCP endpoint (JSON-RPC over HTTP). The key identifies the person. Opened in a browser, it explains itself instead |
GET /media/<key> | Public files from the bucket. HTML is served with a CSP sandbox: no scripts, no forms |
/capture/<token> | A person's camera page for slide photos. The token is derived from their key |
PUT /upload/<ticket> | A one-time, 15-minute upload link minted by upload_link |
kit/skills/ and kit/templates/ are
bundled into the Worker at build time (scripts/bundle-kit.mjs writes
src/kit.generated.ts; wrangler's build command runs it). So the skills
the server serves (list_skills, get_skill) and the template a new event
starts from (new_event) ship with every deploy and are versioned with the
code, with no git clone per call. This follows Cloudflare's Agent Skills
pattern: bundled skills first, then optional remote sources that are skipped
if they fail to load. Here the optional source is the CRM deployment's brain
repo (BRAIN_NAMESPACE/SKILLS_REPO).
What's written at runtime stays in the event-hog-kit Artifacts repo:
per-deployment and per-person settings (config/skills.json, served by
get_config, written by set_my_research_tools) and brand design systems
(brand/<name>/DESIGN.md).
Kit skills: conference-attendee-export, prioritize-attendees,
augment-speakers-panelists, parallel-content-generation-starters,
capture-slides, recreate-slides-in-brand, maintain-design-system,
draft-follow-up-emails.
Getting started and prep: get_started (first time), save_my_profile,
save_attendees, enrich_people, save_targets, targets.
enrich_people looks roster entries (name and company) up through
context.dev's People Enrich with the deployment's
key, so nobody connecting needs an account: current title and employer,
LinkedIn, sometimes a work email, and a match band (confirmed at score 70+,
unconfirmed at 40 to 69). Every answer, misses included, is cached in the
enrichments table, so the team never pays twice for one person. A match
costs 20 credits and a miss is free (the free tier is 1,000 credits a month).
Without the key, or out of credits, it tells the agent to use web search.
Next steps: what_can_i_do lists what the person can say right now, for
before, during or after the event. Most tools also end their result with a
"Next:" line of follow-on offers, and the server asks the agent to close each
reply with two or three of them, so nobody has to know the tool list.
Workspace: event_brief, list_events, new_event,
whoami, list_files, read_file, search, recent_activity,
append_to_file, add_note.
Contacts and CRM: log_contact (appends to an existing contact matched by
email, then name and company), contacts_csv, query_crm, relate_orgs,
define_location, link_location, who_is_in, crm_queue,
mark_crm_synced, export_hubspot_csv.
crm_queue and export_hubspot_csv cover everyone the team met at the event
by default. met_by narrows them to the contacts certain people met
(["me"], or ["me", "Michael"]), matched against who logged each
touchpoint; a name that fits two people is rejected rather than guessed.
owner: "me" makes the caller the CRM owner of every contact instead of
whoever first logged them.
Conversations go too: crm_queue lists every touchpoint not yet in HubSpot
for the agent to log as a completed meeting on the contact (owned by whoever
had the conversation, titled "Met at ", with where and the notes), and
every open follow-up as a task. mark_touchpoints_synced records the meeting
and task IDs in crm_links, so nothing is logged twice, and a touchpoint
added after the contact was synced still shows up next time. The CSV export
carries contacts only.
Skills: list_skills, get_skill, get_config, set_my_research_tools,
save_speaker_profile.
Slides and files: slide_capture_link, upload_link, slides,
view_slide, save_slide_notes, add_field_note.
Brand: get_design_system, extract_brand, save_design_system,
save_recreated_slide.
Starters: save_flash_cards, flash_cards, save_draft,
add_to_draft, drafts.
This is the line to check in review. Some behavior is enforced in code;
some is an instruction to the model (the server's instructions and the
skills), which a model can fail to follow.
Enforced in code:
PEOPLE maps key → name and email).mark_crm_synced records whatever HubSpot ID it's given. It does not
check HubSpot.<script> or lack a credit
line. The credit check is loose: the words "source", "adapted from" or
"via" anywhere in the text pass it. All HTML under /media/ is served
sandboxed.Asked of the model, not enforced:
On your own Cloudflare account, your data never reaches us. On the deployment we run, DATA-POLICY.md applies: stored so your team can use it, never looked at or used commercially.
…/mcp/<key> acts as
that person. There is no sign-in yet. Treat the URL like a password. Keys
are stored as written, in the PEOPLE secret or the members table./media/ is public. Anyone with a file's URL can open it. Keys the server writes
include random parts, so its URLs can't be guessed, but don't put anything there you
wouldn't share by link.config/skills.json is served to every connector user. Settings only,
never credentials.npx wrangler dev fails locally: src/index.ts exports plain constants
(DIR, CONTACTS_CSV), which the local runtime treats as handlers.
Production accepts them.hubspot_status, crm_queue, export_hubspot_csv) only knows HubSpot.event-prep isn't in kit/ yet. It lives in
lossless-agent-skills,
and it was written for our Twenty CRM. get_started's "before" playbook
covers the attendee side (conference-attendee-export,
prioritize-attendees); agenda and sponsor research still need it.upload_link from Claude's
sandbox, which also needs the Claude org admin to allow this Worker's host
for code execution.You need a Cloudflare account with Artifacts, D1 and R2.
npm install
npx wrangler d1 create agnostic-crm # put its id in wrangler.jsonc
npx wrangler r2 bucket create event-hog-media
npx wrangler d1 migrations apply agnostic-crm --remote
<...> values in wrangler.jsonc, including PUBLIC_URL.event-hog-kit repo in your Artifacts namespace for runtime
settings: copy kit/config/skills.example.json to config/skills.json
and fill it in. (Skills and the event template are bundled; they don't
need pushing.)npx wrangler secret put PEOPLE, a JSON
map of connector key → { "name", "email", "emails"?, "crm_email"? }
(keys from openssl rand -hex 24). Without it, everyone joins from the
landing page.npx wrangler secret put CONTEXT_DEV_API_KEY (a key from the
context.dev dashboard) to
turn on enrich_people.npx wrangler deploy (the build step bundles kit/).https://<your worker>/ to copy the connect prompt.Keep a deployment's real values (D1 id, URL) in its own
wrangler.<name>.jsonc, which git ignores, and deploy with
npx wrangler deploy -c wrangler.<name>.jsonc.
seeds/ has the 7x24 Exchange Fall 2026 instance as an example seed.
npm run check # tsc --noEmit
Commit messages follow the Lossless git conventions.
Apache-2.0. See LICENSE. Keep NOTICE in any copy or fork: it credits The Lossless Group.