{"id":51490216,"url":"https://github.com/askb/matrix-meetbot","last_synced_at":"2026-07-07T11:01:34.172Z","repository":{"id":367767562,"uuid":"1282124146","full_name":"askb/matrix-meetbot","owner":"askb","description":"POC: Matrix-native meeting bot (port of OpenDev IRC MeetBot) running live on a GitHub Actions runner","archived":false,"fork":false,"pushed_at":"2026-06-27T14:02:04.000Z","size":61,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-27T16:03:55.663Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/askb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-27T11:00:31.000Z","updated_at":"2026-06-27T14:02:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/askb/matrix-meetbot","commit_stats":null,"previous_names":["askb/matrix-meetbot"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/askb/matrix-meetbot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/askb%2Fmatrix-meetbot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/askb%2Fmatrix-meetbot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/askb%2Fmatrix-meetbot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/askb%2Fmatrix-meetbot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/askb","download_url":"https://codeload.github.com/askb/matrix-meetbot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/askb%2Fmatrix-meetbot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35225029,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-07T02:00:07.222Z","response_time":90,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-07-07T11:01:33.225Z","updated_at":"2026-07-07T11:01:34.162Z","avatar_url":"https://github.com/askb.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# matrix-meetbot (POC)\n\n\u003e ⚠️ **Unofficial personal proof-of-concept.** This is **not** an OpenDev project\n\u003e or service and is **not affiliated with, endorsed by, or connected to** OpenDev,\n\u003e OpenInfra, or `opendev.org`. It runs on a throwaway homeserver with **federation\n\u003e disabled** — it cannot reach or affect any real OpenDev Matrix room or IRC channel.\n\u003e It *ports* OpenDev's open-source `MeetBot` (BSD) purely as engineering attribution.\n\nA **Matrix-native meeting bot** that ports OpenDev's IRC `MeetBot` to Matrix,\ndesigned to run a **live proof-of-concept on a GitHub Actions runner**. It\nreuses OpenDev's battle-tested meeting **engine** (minute/log rendering) and adds\na fresh [`matrix-nio`](https://github.com/matrix-nio/matrix-nio) transport, so\nminutes land in the exact OpenDev layout (`meetings.opendev.org`-compatible) and\nthe command vocabulary is identical to the IRC bot.\n\n\u003e Status: **proof of concept.** The same bot code later migrates to OpenInfra/\n\u003e OpenDev's Matrix homeserver by changing only the homeserver URL + access token.\n\n## Why this design\n\nOpenDev's MeetBot already separates **meeting logic** (`ircmeeting/` — state\nmachine, item types, writers) from the **IRC transport**. This repo:\n\n- **Vendors** `ircmeeting` as [`meetbot/engine/`](meetbot/engine) (3-clause BSD,\n  unchanged logic) — so minute/log formatting is identical, for free.\n- **Adds** a small async transport that converts each Matrix `m.room.message`\n  into the engine's line input `Meeting.addline(nick, line, time_)`. The engine\n  parses the `#commands` itself, exactly as on IRC.\n\n```\nYou (Element) ─┐\nOpenDev team ──┼─► Matrix room ──► meetbot ──► OpenDev-format minutes (.html/.txt/.log.*)\n(Element)      ┘   (Synapse)        │  posts start/end + minute URLs back to the room\n```\n\n## Two ways to run\n\n### 1. Self-contained CI test (no accounts, no tunnel)\n[`.github/workflows/ci.yaml`](.github/workflows/ci.yaml) boots a **disposable\nSynapse** on the runner, registers throwaway accounts, starts the bot, replays a\nscripted meeting ([`tests/replay/sample-meeting.txt`](tests/replay/sample-meeting.txt)),\nand asserts the minutes/logs are produced. Runs on every push/PR. Plus pure unit\ntests over the engine and dispatch bridge.\n\n### 2. Live interactive demo (cloudflared tunnel)\n[`.github/workflows/live-demo.yaml`](.github/workflows/live-demo.yaml) (run it\nfrom the **Actions** tab) boots the disposable Synapse, exposes it via a public\n`*.trycloudflare.com` HTTPS tunnel, pre-creates demo accounts, starts the bot,\nand prints **join instructions** to the job summary. You and the OpenDev team:\n\n1. Open \u003chttps://app.element.io\u003e, set the homeserver to the printed tunnel URL.\n2. Register a throwaway account (open registration) or use a demo account\n   (`@alice:\u003chost\u003e` / `alice-pass`).\n3. Join `#\u003cmeeting_name\u003e:\u003chost\u003e` (or invite the bot to your own room — it\n   auto-joins).\n4. Run a real meeting; on `#endmeeting` the bot posts minute links and the files\n   are uploaded as a workflow artifact.\n\nEverything is destroyed when the job ends (max ~6h). **What lives on the runner\ncan't be reached from the internet without the tunnel** — that's why the demo\nuses cloudflared.\n\n## Commands (ported vocabulary)\n\nCore: `#startmeeting [name]`, `#endmeeting`, `#topic`, `#agreed`, `#accepted`,\n`#rejected`, `#info`, `#idea`, `#action`, `#help`, `#link`, `#nick`, `#chair`,\n`#unchair`, `#undo`, `#meetingname`, `#meetingtopic`, `#lurk`/`#unlurk`, `#save`.\nVoting: `#startvote`, `#vote`, `#showvote`, `#endvote`.\n\nAuthorization: anyone may `#startmeeting` and becomes the initial chair;\nchair-only commands check the sender's **MXID localpart** against the chair set.\n\n## Matrix-specific decisions (per the spec)\n\n- **No encryption** — meeting rooms are public/logged. Biggest simplification.\n- **Identity = MXID**, nick = MXID localpart (stable, no spaces, `#chair alice`\n  works). Display-name rendering is a future enhancement.\n- **Parse `event.body`** (plaintext); reply fallbacks stripped; `m.emote` → action.\n- **Edits/redactions/threads/reactions ignored** (MVP) — original event is\n  authoritative, matching IRC semantics.\n- **Restart resilience** — every accepted line is journaled to disk; an\n  interrupted meeting resumes on restart (replies suppressed during replay).\n\n## Run locally\n\n```bash\npython -m venv .venv \u0026\u0026 . .venv/bin/activate\npip install -r requirements.txt pytest\npython -m pytest tests/ -q          # unit + dispatch bridge tests\n\n# Full functional run against a real local Synapse (Docker required):\nexport SYNAPSE_SERVER_NAME=meetbot.local SERVER_NAME=meetbot.local\n./scripts/setup-synapse.sh\n./scripts/create-accounts.sh meetbot alice bob\neval \"$(BOT_USER=meetbot BOT_PASS=meetbot-pass python scripts/setup_room.py)\"\nMEETBOT_HOMESERVER=http://localhost:8008 MEETBOT_ROOMS=\"$ROOM_ID\" \\\n  MEETBOT_OUTPUT_DIR=$PWD/meetings python -u -m meetbot.main \u0026\nDRIVER_USER=alice DRIVER_PASS=alice-pass \\\n  TRANSCRIPT=$PWD/tests/replay/sample-meeting.txt python scripts/replay_client.py\nfind meetings -type f\ndocker rm -f synapse\n```\n\n## Configuration\n\nAll fields accept a `MEETBOT_*` env override (env wins over YAML). See\n[`config.example.yaml`](config.example.yaml).\n\n| Field | Env | Purpose |\n|-------|-----|---------|\n| `homeserver` | `MEETBOT_HOMESERVER` | Client-Server API base URL |\n| `user_id` | `MEETBOT_USER_ID` | Bot MXID |\n| `access_token` | `MEETBOT_ACCESS_TOKEN` | Long-lived token (secret) |\n| `rooms` | `MEETBOT_ROOMS` | Comma-separated rooms to join |\n| `output_dir` | `MEETBOT_OUTPUT_DIR` | Where minutes/logs are written |\n| `base_url` | `MEETBOT_BASE_URL` | Absolute URL prefix for minute links |\n| `state_dir` | `MEETBOT_STATE_DIR` | Restart journals |\n| `meeting_name` | `MEETBOT_MEETING_NAME` | Path slug |\n\n## Migration to OpenInfra/OpenDev\n\nThe bot is transport-clean. To move from the POC to production:\n\n1. Register a bot account on the OpenDev homeserver; store a long-lived token.\n2. Point `MEETBOT_HOMESERVER`/`MEETBOT_USER_ID`/`MEETBOT_ACCESS_TOKEN` at it.\n3. Mount the shared logs volume so minutes publish to `meetings.opendev.org`\n   (set `MEETBOT_BASE_URL` accordingly). The [`Dockerfile`](Dockerfile) mirrors\n   the matrix-eavesdrop image pattern for `system-config` wiring.\n\nNo code changes — only configuration.\n\n## License\n\n3-clause BSD. The vendored engine under `meetbot/engine/` is © 2009 Richard\nDarst and contributors (BSD); new transport code © 2026 Anil Belur (BSD). See\n[LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faskb%2Fmatrix-meetbot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faskb%2Fmatrix-meetbot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faskb%2Fmatrix-meetbot/lists"}