← Coverage hub REPS WITH FRIENDS Β· DOCUMENTS v1.1.0

21 β€” Beeper & Matrix Investigation: Multi-Platform Chat Bridge for RWF

Date: 2026-08-31 Β· Author: ops agent Β· Status: research complete, recommendation inside Trigger: Founder installed Beeper on superlocal ("we have now installed the app Beeper"). Question: How does Beeper connect to different chat interfaces, and could RWF use it (or the stack beneath it) to reach group chats on many platforms with ONE bot core?


TL;DR


1. What's actually installed on superlocal (read-only inspection)

ItemFinding
Install~/Applications/Beeper.AppImage (AppImage, launcher ~/.local/share/applications/beeper.desktop, "All chats, one app β€” with local Desktop API + MCP")
Config/data~/.config/BeeperTexts/ (new "Beeper Texts" architecture β€” no legacy ~/.config/Beeper)
Account@alexeib:beeper.com on https://matrix.beeper.com/ (from account.db, read-only) β€” a genuine Matrix identity with local olm/megolm E2E keys (crypto_* tables)
Local DBsaccount.db = embedded Matrix client SDK store (sync, rooms, E2E, per-bridge state). index.db = message index (threads/participants/messages/reactions/FTS). As of 2026-08-29: 3 threads, 11 participants, 0 messages, no networks connected yet β€” freshly installed.
Backend endpoints it talks toapp-manifest-production.json: matrix.beeper.com, roomserv.beeper.com, sygnal.beeper.com (push), ai-services.beeper.com, and per-user bridge clusters https://{username}.users.{clusterId}.bridges.beeper.com
Local APIBeeper Connect (log-verified): WebSocket at /v1/ws, REST GET /v1/info, /v1/spec, /v1/chats, and POST /v0/mcp β€” a built-in MCP server

So the local picture is: a Matrix-first client with an embedded SDK, plus a localhost agent API on top.


2. Beeper's model (2026) β€” how it reaches other chats

                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                        β”‚            BEEPER DESKTOP/PHONE            β”‚
                        β”‚                                            β”‚
   founder's human ───▢ β”‚  unified inbox UI (all networks, one app)  β”‚
                        β”‚                                            β”‚
                        β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
                        β”‚  β”‚ MODE A: On-Device Connections (new)  β”‚  β”‚
                        β”‚  β”‚ WhatsApp/Telegram/Signal/... proto-  β”‚  β”‚
                        β”‚  β”‚ col sessions run INSIDE the app.     β”‚  β”‚
                        β”‚  β”‚ Messages never touch Beeper servers. β”‚  │──▢ WhatsApp
                        β”‚  β”‚ E2E preserved where network allows.  β”‚  │──▢ Telegram
                        β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  │──▢ Signal, ...
                        β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
                        β”‚  β”‚ MODE B: Beeper Cloud bridges (older) β”‚  β”‚
                        β”‚  β”‚ per-user bridge clusters run on      β”‚  β”‚
                        β”‚  β”‚ {user}.users.{id}.bridges.beeper.com β”‚  β”‚
                        β”‚  β”‚ zero-access-encrypted history        β”‚  β”‚
                        β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
                        β”‚                                            β”‚
                        β”‚  embedded Matrix SDK ⇄ matrix.beeper.com   β”‚
                        β”‚  (Beeper account = Matrix account)         β”‚
                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                           β”‚ localhost (Beeper Connect)
                                           β–Ό
                        REST /v1/*  Β·  WS /v1/ws  Β·  MCP POST /v0/mcp
                                 (agents / SDKs: JS, Python, Go, PHP)

Key facts (from beeper.com FAQ + developers.beeper.com, fetched 2026-08-31):

How a bridge actually authenticates to each network

A Matrix bridge logs into the remote network with a session of the bridge operator's own account (for on-device mode: the app holds that session locally):

NetworkSession mechanismToS postureGroup-chat quality
WhatsAppQR-pair as a linked device of a personal account (whatsmeow)Unofficial client β€” ToS-grey; ban risk low but real; NOT for business scaleExcellent (existing groups bridgeable)
TelegramEither official Bot API in groups (sanctioned) or personal MTProto sessionBot API: clean; MTProto: greyBot API: good (needs admin/privacy-mode off); MTProto: full
SignalLinked-device session (signal-cli style)Grey (no official bot API)Good (GV2 groups)
Discord / SlackOfficial bot tokens / OAuthCleanGood (channels, threads)
Meta (FB/IG)Unofficial sessionGreyVariable
iMessagemacOS-only (BlueBubbles-class)Apple-hostile historyGood on Mac
Google Messages/VoicePhone-paired sessionGreyAdequate

The WhatsApp row is the load-bearing caveat for RWF: bridged WhatsApp = personal-account automation. Fine for founder + friends dogfooding; wrong foundation for paying strangers (that's what the WhatsApp Business Cloud API is for β€” already our stated production plan in apps/bot-whatsapp/hub-client.ts).


3. Where RWF is today (baseline)

                 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                 β”‚      @rwf/bot-core           β”‚
                 β”‚ CommandBus Β· MatchStore Β·    β”‚
                 β”‚ cards Β· digest Β· AI hooks    β”‚
                 β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚               β”‚
             Slack transport      ChatTransport interface
             (Bolt Socket Mode,   (apps/bot-whatsapp/hub-client.ts)
              official)                       β”‚
                     β”‚            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                     β”‚            β”‚ TODAY: QalarcHubClient  β”‚
                     β–Ό            β”‚ β†’ Qalarc Hub :8769      β”‚
               Slack workspace    β”‚   (owns ONE Signal +    β”‚
                                  β”‚    WhatsApp session)    β”‚
                                  β”‚   β†’ founder's phone     β”‚
                                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                               β”‚ planned
                                               β–Ό
                                  WhatsApp Business Cloud API
                                  (official, per-convo pricing)

Properties: one bot core, N hand-written transports; each new platform = new bot code + new session management; Signal has no official API; WhatsApp on a personal session is already ToS-grey today via the Hub.


4. The three options for RWF

Option A β€” Bot via Beeper Desktop API (MCP / localhost REST)

@rwf/bot-core (or qalcode agent) ──HTTP──▢ Beeper Connect (localhost)
                                              β”‚
                                     whatever the founder has
                                     connected in Beeper Desktop
                                              β”‚
                        WhatsApp Β· Telegram Β· Signal Β· Discord Β· Slack Β·
                        Messenger Β· LinkedIn Β· X Β· Google Messages Β· ...

Option B β€” RWF bot as a Matrix user on beeper.com (+ managed / bbctl bridges)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   Matrix    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ @rwf:beeper β”‚ ⇄ rooms ⇄  β”‚ matrix.beeper.com      β”‚
β”‚  .com       β”‚            β”‚ (their homeserver)     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β–²  bot-core as Matrix client    β”‚ per-user bridge clusters
       β”‚  (one room per battle)        β–Ό
  founder uses ANY        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  Matrix client / Beeper  β”‚ bridges: WhatsApp Β· Telegram β”‚
  as the human UI         β”‚ Signal Β· Discord Β· Slack ... β”‚
                         β”‚ (Beeper-managed, or bbctl    β”‚
                         β”‚  self-hosted on our metal)   β”‚
                         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Option C β€” Fully self-hosted Matrix (our homeserver + mautrix bridges)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ @rwf:rwf.   β”‚ ⇄ appservice / client API               β”‚
β”‚  qalarc.com β”‚        β”‚ OUR homeserver                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β”‚ Synapse (ref) Β· Tuwunel Β·       β”‚
       β–²               β”‚ Continuwuity (Rust; conduwuit   β”‚
       β”‚ bot-core      β”‚ is now OBSOLETE)                β”‚
       β”‚               β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  same human story             β”‚ mautrix bridgev2 stack
                               β–Ό (docker/systemd, ours to run)
                    whatsapp Β· telegram Β· signal Β· slack Β· discord

5. Comparison

DimensionA: Desktop APIB: Beeper-hosted MatrixC: Self-hosted MatrixToday: per-platform bots
Time to first messagehours–days1–2 weeks2–4 weeksβœ… already live (WA/Slack)
Monthly cost$0$0–10$0–10$0 (Hub) + Cloud API later
New-platform costfounder clicks "connect"add a bridgedeploy a bridgewrite a new bot
Group-chat reachfounder's own groupsbridged groups, all platformsbridged groups, all platformsper-platform, manual
WhatsApp ToS riskpersonal (grey)personal (grey)personal (grey)personal via Hub (grey today)
Compliance path for scaleβœ—partialpartialβœ“ Cloud API planned
Blast radius if it breaksfounder's desktopBeeper infraour infraper-bot
One bot core for everythingβœ— (it's a transport)βœ“βœ“βœ— (N transports, shared core)
Human can use same network nativelyβœ“ Beeperβœ“ Beeper/Elementβœ“ any Matrix clientn/a

6. Recommendation

Adopt Matrix as RWF's canonical bot transport layer β€” incrementally, on Beeper's rails first, our rails later.

  1. This week (Option A, dogfood): add a BeeperDesktopTransport implements ChatTransport (and/or an MCP tool for agents) that talks to Beeper Connect on localhost. Instant multi-platform reach for founder-scale tests. Keep the Qalarc Hub for Signal/WhatsApp production dogfood β€” don't rip out what works. Tag agent traffic source:"ai" per house convention. Rate-limit sends (their warning is explicit).
  2. Next milestone (Option B): stand up the bot as a Matrix user (@rwf:beeper.com or a second account), one Matrix room per battle, bridges as transports. bot-core stops caring which platform a group chat lives on. Use bbctl self-hosting for the noisy/bridge-heavy networks so they run on our metal, free.
  3. Production (keep the plan): WhatsApp Business Cloud API for customer traffic; Telegram via official Bot API; Slack stays on Bolt. Bridges (self-hosted or Beeper) are for founder/friends/community groups, not paying strangers.
  4. Later (Option C): self-host a homeserver (Tuwunel or Continuwuity β€” conduwuit is obsolete; Synapse if we want reference-grade) only when we need rooms for users, federation, or Beeper-independence. Don't pay that ops tax before it buys something.

Why this shape: our codebase already abstracts transports (ChatTransport); Matrix is the only model where "add platform" β‰ˆ "connect bridge" instead of "write a bot," and Beeper gives us the whole bridge stack, managed or self-hosted, open source, for free β€” while we keep the official-API path for scale.


7. Minimal pilot (concrete)

Goal: a real RWF battle update lands in a real non-WhatsApp group chat with zero new servers.

  1. Founder connects 1–2 networks in Beeper Desktop (e.g. Telegram + one group).
  2. Agent side: GET /v1/chats β†’ find the group; POST /v1/messages/send-equivalent via the Desktop API (or just use the MCP server) β†’ post "Sunday Showdown is LIVE β€” log your reps" + a card image.
  3. Read replies through /v1/chats polling or the WS endpoint; feed into the existing CommandBus.
  4. Success criteria: message delivered + rendered in the native app; reply read back; no account warnings; end-to-end < 5 s.
  5. Explicit non-goals: no customer traffic, no volume, no automation of strangers' chats.

Risk notes: personal-account rate limits; keep Beeper Desktop running (autostart exists); if a network balks, fall back to Hub/official APIs for that platform.


Appendix β€” evidence & sources