mautrix-telegram: Matrix and Telegram bridge setup and operation
A Matrix-Telegram puppeting bridge
At a glance
- What is it?
- mautrix-telegram is a Go bridge that connects Telegram accounts to Matrix through a Matrix appservice. It fits operators willing to manage authentication, bridge configuration, and an external service that keeps both protocols synchronized.
- Who is it for?
- Adopt mautrix-telegram if you need a self-hosted Go service that puppets Telegram users into Matrix and can operate the bridge's databases, media tooling, and Telegram authentication flow. Do not choose it if you need a configuration-free relay or have no capacity to troubleshoot protocol and service integration.
- Can I use it commercially?
- Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
- Is it still maintained?
- Yes. The repository last received commits 1 day ago.
- What is it written in?
- Mainly Go, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The account-puppeting scope of mautrix-telegram
mautrix-telegram addresses the gap between Telegram and Matrix, two messaging systems that do not share a common protocol or account model. The README describes the project specifically as a "Matrix-Telegram puppeting/relaybot bridge." That wording indicates two operating modes are part of the product's scope: a puppet represents a Telegram-controlled user identity within Matrix, while a relaybot arrangement is intended for bot-mediated message flow. The repository does not provide enough detail here to prescribe which mode fits every deployment.
The intended user is an operator, administrator, or organization running its own Matrix infrastructure. The project is not presented as a desktop client, a standalone Telegram API wrapper, or a general-purpose chat router. It is an infrastructure service whose value depends on another Matrix homeserver and on Telegram account access. That dependency makes deployment ownership important. An operator who only wants occasional message forwarding between platforms may find the puppeting model heavier than required.
The repository also points users to a roadmap for a general overview of supported behavior. That separation is useful because the README itself does not enumerate message types, media behavior, room features, or protocol edge cases. Prospective users need the roadmap and external setup documentation before treating the bridge as complete for a particular chat workflow. The project discussion also has two named support channels: the Matrix room `#telegram:maunium.net` and the Telegram chat `mautrix_telegram`. The latter is described as bridged to that Matrix room.
Go service structure behind the Matrix connection
The repository is primarily Go, with the module declared as `go.mau.fi/mautrix-telegram`. The `cmd/` and `pkg/` directories indicate the usual separation between the executable entry point and reusable packages, although the available files do not document each package's exact responsibility. The module depends on `maunium.net/go/mautrix`, which places the project within the mautrix bridge ecosystem, and on `github.com/gotd/tl`, a Go Telegram protocol library. These dependencies support the stated integration path more directly than the project's marketing description alone.
A Matrix appservice connection is part of the operational model. In an appservice deployment, the bridge registers itself with Matrix and gains permission to create or manage the namespaces assigned to it. The README does not show registration YAML, database schema, event handler names, or synchronization logic, so a more detailed event-by-event account would be guesswork. Based on the repository layout, the bridge likely separates executable setup from bridge logic, but the exact inbound and outbound paths should be confirmed in the linked documentation.
The dependency list also contains PostgreSQL support through `github.com/lib/pq`, SQLite through `github.com/mattn/go-sqlite3`, YAML parsing through `gopkg.in/yaml.v3`, and structured logging through `go.uber.org/zap` and `github.com/rs/zerolog`. These packages show the infrastructure concerns encoded by the service, but they do not establish whether a particular deployment must use PostgreSQL or SQLite. Media-related dependencies are also present, and the runtime image installs `ffmpeg`, `lottieconverter`, `jq`, `curl`, and `yq-go`. The presence of those binaries indicates that the distributed container is prepared for more than starting a minimal chat process.
Preparing authentication through the official documentation
The README does not provide a self-contained installation sequence. It directs users to docs.mau.fi, with separate pages for bridge setup, Docker setup, and Telegram authentication. The shortest defensible first-use path therefore begins at those documented procedures rather than inventing environment variables or startup flags.
For a container-oriented installation, use the Docker setup page linked from the README:
https://docs.mau.fi/bridges/general/docker-setup.html?bridge=telegramThe block is the exact documentation address, not an executable command. It should lead to the configuration required for the bridge image. The available repository confirms that the repository contains a `Dockerfile` and a `docker-run.sh`, but it does not show the required volume contents, appservice registration values, database settings, or first startup arguments. Consequently, this article cannot safely provide a complete `docker run` command.
After installing the bridge, follow the dedicated authentication page:
https://docs.mau.fi/bridges/go/telegram/authentication.htmlThat is the correct place to verify how a Telegram identity is authenticated and how the resulting account is associated with the bridge. Authentication is not equivalent to installation. A running process with no authenticated Telegram session will not establish the user relationship that a puppeted account needs.
For direct Go development, the repository includes `go.mod` and `build.sh`, but neither the README nor the listed file contents gives a confirmed build invocation. The module requires Go 1.26.0 and names toolchain go1.27.1, while `build.sh` is used by the Dockerfile. Those facts confirm the toolchain relationship, not the operator-facing command that should be typed.
Docker image contents and runtime dependencies
The Dockerfile uses a two-stage build. The builder starts from `golang:1-alpine3.24`, installs Git, certificates, build tools, `su-exec`, and `olm-dev`, copies the repository into `/build`, and runs `./build.sh`. The resulting `mautrix-telegram` executable and `docker-run.sh` are copied into the final image.
The runtime stage is based on `alpine:3.24`. It sets `UID=1337` and `GID=1337`, declares `/data` as a volume, and starts the service with `/docker-run.sh`:
VOLUME /data
CMD ["/docker-run.sh"]VOLUME /data
CMD ["/docker-run.sh"]The runtime image also installs `ffmpeg`, `su-exec`, `ca-certificates`, `olm`, `bash`, `jq`, `curl`, `yq-go`, and `lottieconverter`. That is a substantial operational footprint for a messaging bridge. It should be treated as part of the deployment contract rather than an incidental packaging detail, particularly when building restricted images or comparing host requirements with the supplied container.
The declared `/data` volume indicates persistent service data belongs outside the container layer, but the README excerpt does not enumerate its required contents. Operators should consult the linked setup documentation before mounting a host directory. The image's default user IDs also matter when directory ownership is managed outside Docker.
Feature coverage requires roadmap and release checks
The README keeps supported functionality out of its own feature list and points to `ROADMAP.md` for a general overview. That makes the roadmap the source to inspect before selecting the bridge for particular chats, but the available repository contents do not reproduce it. Claims about attachment formats, edits, reactions, replies, encrypted rooms, group behavior, or room administration would therefore be unsupported.
The release history provides a useful maintenance signal without proving compatibility. Listed versions include v0.2609.0 (v26.09), v0.2608.0 (v26.08), and v0.2607.0 (v26.07), published on 2026-09-16, 2026-08-16, and 2026-07-16 respectively. These are sequential release tags with a recognizable monthly pattern, but the README does not define the versioning policy or guarantee that every month produces a release.
The repository is not archived, and its last push was on 2026-10-16. That supports describing recent development activity, while still leaving ordinary upgrade work unresolved. Operators must review `CHANGELOG.md` and release notes for migration requirements rather than assuming that replacing a binary is sufficient. Go toolchain requirements, database libraries, authentication state, and integration with a changing Matrix homeserver can all introduce operational dependencies.
A second limitation is documentation separation. The README is an entry point, not the full manual. Setup, Docker operation, and authentication each live at external URLs. The roadmap and documentation need to be kept available during evaluation, otherwise the repository alone does not provide enough information to estimate feature coverage or plan a complete deployment.
AGPL-3.0 obligations in a hosted bridge deployment
The repository is licensed under AGPL-3.0, with a separate `LICENSE.exceptions` file also present. The presence of exceptions may affect particular uses, but the available content does not state which components or scenarios they cover. The license text should be reviewed directly before distributing or operating a modified deployment.
The AGPL family is relevant to networked software use, so administrators should pay particular attention to source-code obligations when they modify the bridge and make it available over a network. This is not legal advice, and the repository excerpt does not summarize the license conditions. The correct source is the repository's `LICENSE` and `LICENSE.exceptions`, together with the exact version of the code being deployed.
The use of mautrix ecosystem modules and other Go dependencies also does not mean every dependency carries the same license. A source or binary license inventory may therefore be needed for redistribution or compliance review. The repository layout supports that review because license files and source packages are present, but it does not replace one.
Upgrade cost has two visible components. Operationally, the service includes a Go application, databases, authentication state, media tools, and a required relationship with Matrix infrastructure. Administratively, deployments need to track release notes, configuration changes, and applicable license terms. The available repository provides the files needed to begin those checks, but it does not promise zero-downtime upgrades or automatic migration behavior.
mautrix-telegram versus a simpler message relay
A simple message relay typically accepts events from one side, transforms selected fields, and forwards them to the other side. Its identity model may be centralized around the relay rather than around separate user-controlled puppets. mautrix-telegram is explicitly positioned as a puppeting and relaybot bridge, and its dependency on `maunium.net/go/mautrix` places it in a Matrix appservice framework.
That architecture makes mautrix-telegram more appropriate when Matrix should represent Telegram accounts as managed identities within homeserver namespaces. A simpler relay may be easier to reason about when the only requirement is one-way notification delivery or limited two-way forwarding. The repository excerpt does not expose mautrix-telegram's complete configuration surface, so it cannot support a claim that it is simpler than every alternative.
The trade-off is operational specificity. mautrix-telegram offers a clear solution for connecting the two ecosystems, but it also requires authentication, persistent data, runtime utilities, and coordination with a Matrix homeserver. A generic integration that merely posts through webhooks would have a smaller identity model, but it would not be the same puppeting design. Choose based on identity semantics and required protocol behavior, not simply on the word "bridge."
The first technical review should therefore compare expected Matrix identity namespaces, Telegram authentication needs, room features listed in `ROADMAP.md`, and the deployment steps in the linked documentation. If those align, the project's focused architecture is a reason to continue evaluating it.
Editorial conclusion
Adopt mautrix-telegram if you need a self-hosted Go service that puppets Telegram users into Matrix and can operate the bridge's databases, media tooling, and Telegram authentication flow. Do not choose it if you need a configuration-free relay or have no capacity to troubleshoot protocol and service integration. Verify first that the documented setup procedure fits your Matrix homeserver and that the authentication requirements match your intended Telegram accounts. The repository is not archived, its last push was on 2026-10-16, and the listed release series follows monthly versioned updates.
Frequently asked questions
How do I set up mautrix-telegram with Docker?
The README links to the Docker setup documentation at `https://docs.mau.fi/bridges/general/docker-setup.html?bridge=telegram`. The repository includes a `Dockerfile`, and the image declares `/data` as a volume and starts `/docker-run.sh`.
How do I authenticate a Telegram account in mautrix-telegram?
The README directs users to `https://docs.mau.fi/bridges/go/telegram/authentication.html` for authentication. The repository excerpt does not include the authentication commands or configuration.
What should I check before upgrading mautrix-telegram?
Review `CHANGELOG.md` and the relevant release notes for migration requirements. The repository currently lists monthly versions including v0.2609.0, v0.2608.0, and v0.2607.0, but the README does not promise automatic or downtime-free upgrades.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/mautrix-telegram)Was this useful?