Per-bridge review checklist

Research notes. Engineering's reading of the Signal and Telegram terms. Not legal advice and not a policy.

RESEARCH NOTES, NOT LEGAL ADVICE. Engineering's reading of public terms and documentation on 30 September 2026, to give counsel a head start. Quotes and paraphrases are from the linked pages as fetched that day; terms change, so re-read the source before relying on any line. Nothing here is a conclusion that a bridge may lawfully or contractually be offered.

Our bridge policy: before launch, each bridge gets a current terms-of-service review, account-registration analysis, abuse controls, credential and session security review, and commercial-hosting review. Our roadmap puts "Bridge terms review and validation" in January-February 2027, before Gate 2.

Checklist (one copy per bridge, per review)

#ItemOwnerStatus
1Terms of service review: current consumer terms and developer/API terms of the remote service read in full; clauses on third-party clients, automation, commercial use, resale, data use listed with quotes; counsel's opinion recordedCounsel + engResearch notes below; counsel not started
2Account-registration analysis: do we create, register or verify remote accounts? Can the bridge register accounts? What makes a remote service treat an account as suspicious?EngNotes below
3Abuse controls: how we prevent our service being used for spam or automation against the remote network, and how we respond to a reportEng + opsImplemented in config, runbook drafted
4Credential and session security: what the bridge stores, where, encrypted how, who can reach it, how the subscriber sees and revokes itEngNotes below; disk encryption open
5Commercial-hosting review: software licences (AGPL) and obligations when offering the bridge as a paid network service; precedent; trademark use in product namingCounsel + engNotes below
6User-facing disclosure: onboarding and privacy policy say plainly that bridged chats are not end-to-end encrypted through our serverProductDraft in privacy-policy-DRAFT.md
7Kill switch: we can disable one bridge for everyone within an hour (stop the container, notify subscribers) if a remote service objectsOpsdocker compose stop mautrix-<bridge>; runbook entry needed
8Re-review trigger: re-run items 1, 2 and 5 on any remote terms change, any mautrix major release, and yearlyOwner of bridge policyNot scheduled

Signal (mautrix-signal)

Software: mautrix-signal v26.09 (dock.mau.dev/mautrix/signal:v0.2609.0), Go bridgev2, AGPL-3.0, uses libsignal (AGPL-3.0). Docs: https://docs.mau.fi/bridges/go/signal/ ; source: https://github.com/mautrix/signal

1. Terms (https://signal.org/legal/, "Terms of Service", effective date shown on the page: 25 May 2018)

2. Account registration

3. Abuse controls (implemented)

4. Credentials and sessions

5. Commercial hosting

Telegram (mautrix-telegram)

Software: mautrix-telegram v26.09 (dock.mau.dev/mautrix/telegram:v0.2609.0), now a Go bridgev2 bridge (the Python bridge is legacy), AGPL-3.0. Docs: https://docs.mau.fi/bridges/go/telegram/ ; source: https://github.com/mautrix/telegram

1. Terms

Telegram has separate API terms (for developers) and user terms.

API terms (https://core.telegram.org/api/terms), as fetched:

User terms (https://telegram.org/tos): prohibit spam and scams; breaches can lead to temporary or permanent bans. Separate bot terms exist.

How our configuration responds (for counsel to assess):

API-terms pointOur setting or plan
Own API IDTELEGRAM_API_ID/TELEGRAM_API_HASH from our own my.telegram.org application; one application for the service
Actions only with the user's knowledgeThe subscriber logs in themselves; no automated sending; relay off
Self-destructing contentDisappearing messages: bridgev2 tracks timers (disappearing_message table) and removes them on Matrix end to end; view-once media not bridged (disable_view_once: true); retention further limits server copies
Read and typing statusesBridged both ways by default in bridgev2; never suppress them
No AI trainingWe do not; add to our terms
Transparency and namingOnboarding must say "uses the Telegram API"; never "Telegram" in the product name; device shown as "Shoal Messages (hosted bridge)"

2. Account registration

3. Abuse controls

As for Signal (permissions, relay off, closed registration), plus: network.sync.create_limit and lazy member sync keep the bridge from mass-fetching data; member_list.max_initial_sync: 0. Open: consider rate limits on bridge-initiated new chats.

4. Credentials and sessions

5. Commercial hosting

Shared components

ComponentLicenceNote for commercial hosting
SynapseAGPL-3.0 (Element relicensed Synapse from Apache-2.0 in 2023) current termsNetwork use: publish source of any modifications
mautrix-go (bridgev2)MPL-2.0 (LICENSE in mautrix/go, checked 2026-09-30)Linked into both bridges
ntfyApache-2.0 and GPLv2 dual licence (LICENSE, LICENSE.GPLv2 in binwiederhier/ntfy)
CaddyApache-2.0
PostgreSQLPostgreSQL licence

Decisions needed before launch

  1. Counsel's opinion on Signal's "sell, rent, or charge for our Services" clause as applied to a paid hosted bridge. If negative, options are: offer the Signal bridge only for self-hosting, make it a free add-on outside the subscription [LEGAL], or drop it.
  2. Counsel's opinion on Telegram API terms compliance of a server-side client shared by many users, and on disappearing-message handling.
  3. Whether to publish the AGPL source links in-app, on the website, or both.
  4. VPS disk encryption decision.
  5. Who owns re-review (checklist item 8), and the calendar for it.

Source: services/privacy/bridge-review.md in the Shipwright repository; paths and ADR numbers in the text refer to it.