telega.el: a Telegram client that lives inside GNU Emacs
GNU Emacs telegram client (unofficial)
At a glance
- What is it?
- telega.el is an unofficial Telegram client for GNU Emacs, built on the TDLib client library and split between an Emacs Lisp front end and a small native server, with the features official clients have plus a set that only make sense inside Emacs, expressive chat filtering, message squashing, Emacs Stories and an advertisement filter. It suits an Emacs user who wants their chat in the editor, and the parts that are awkward in an editor are documented honestly in the readme.
- Who is it for?
- Adopt telega.el if you live in Emacs and want your Telegram chats in the same place as your code, because the filtering, the sorting and the Emacs integration are better than anything the official clients offer. Do not adopt it if voice and video chat matter to you, since full support for those is the one major feature the README says is missing.
- Can I use it commercially?
- Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
- Is it still maintained?
- Yes. The repository last received commits 4 days ago.
- What is it written in?
- Mainly Emacs Lisp, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 21, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What the project is
telega.el is a full featured unofficial client for the Telegram platform, written for GNU Emacs, and the README describes the scope plainly. It implements most of the features the official Telegram clients have, and the only major feature it lacks is full support for voice and video chats.
That single sentence is the honest summary of a project like this, and it is worth reading the rest of the readme in that light. The readme also says the package is actively developed, and that for that reason some features are not implemented, or are present just as a skeleton for future implementation, while the core parts are mature enough that it is possible to use telega.el for basic chat.
So this is a client you can live in for text, and a client that is incomplete for calls. That is a reasonable trade for a particular kind of user, and it is stated up front rather than discovered later.
The project is written in Emacs Lisp, it is licensed under the GNU GPL version 3, and the last push to the repository was on 2026-10-13. The recent releases are 0.8.0 from December 2021, which added support for TDLib 1.8.0, 0.7.15 from January 2021 and 0.7.9 from the same month. The current release lives on a branch named for the version, and the README notes that it is compatible with the latest TDLib major release.
There is a detailed manual, and a Telegram group for discussing the development, with the readme asking people to file issues as exceptionally helpful.
Two halves: the Emacs Lisp client and the native server
The repository layout shows the architecture, and it is the part of the design you have to understand before you install anything.
There is a large set of Emacs Lisp files, each named for a concern, with a core module, a root module, and then modules for chat, media, stickers, emoji, messages, sorting, filtering, folders, topics, inline previews, rich text, notifications, user information, completions, communities, web pages, voice notes, and the TDLib binding itself with a separate file for the event stream that comes back from it. There is also a server directory, a docs directory, a contrib directory, and a design.txt.
The server directory is the native half. The project ships a small server binary that speaks to TDLib and exposes a local interface that the Lisp side talks to. That is the standard shape for a native library in an Emacs package, and the Makefile shows it being built as a separate target alongside the byte compilation of the Lisp sources.
The Makefile is where the developer workflow is spelled out. There is a target for building the server and one for installing it, a reinstall target that cleans and reinstalls it, a target that byte compiles the Lisp files, and a compile target that does the whole package. There are separate test targets for the Lisp side, which run the test suite in batch mode with a clean Emacs, and for the server, which runs the server's own tests. There is a target that updates the recorded TDLib version, and one that builds the documentation.
The splitting of the code by feature, one file per concern, is unusual for an Emacs package of this size and is worth noticing, because it is how a project stays maintainable while covering a large surface.
The features that only make sense in Emacs
The list of unique features is short and every item on it is an argument for using a text editor as a chat client.
There is expressive ibuffer-like filtering of chats, which is the idea of a chat client borrowed wholesale from the most flexible buffer interface in Emacs. There is powerful sorting of chats, and a custom order for chats, so some chats can be pinned to the top and others to the bottom. There is client side filtering of messages, so a noisy channel can be tamed without leaving the client. There is a diff view for message edits, so you can see what a person actually changed. There is a minor mode for squashing messages, which is the operation of collapsing consecutive messages from the same author. There is Emacs Stories, which is a way of sharing your Emacs experience with other Emacs users inside the client. And there is an AdBlock feature that blocks advertisement messages in Telegram channels.
Read together, these say what the project is for. A Telegram client for people who already live in a text editor, where the chat list behaves like a buffer, where consecutive messages collapse the way you want them to, and where the noise can be filtered on the client rather than muted on the server.
The AdBlock feature is the one that needs a sentence of context, because Telegram channels carry advertisements as ordinary messages. Filtering them client side is the only way to do it without losing the channel, and it is a feature that an official client has no reason to build.
The installation answer that is really a manual
The readme's question and answer section is the most useful part of the document, because almost every entry describes a way in which Emacs and Telegram images do not get along.
The first is a missing file error on install, and the answer is that telega.el depends on the visual-fill-column package, which is available from MELPA. That is a hard dependency and the error message is the one you will see.
Then there is the image problem, which is a short version question with a long version answer. If you use Emacs 26.3 or older you need your Emacs configured with SVG and ImageMagick support, with SVG provided by the librsvg library and ImageMagick by the libmagickcore and libmagickwand development libraries. If you use Emacs 27.1 or later, the ImageMagick support was deprecated because it posed a significant security issue, and telega now relies on the in-built and faster image transforms for those versions.
So the behaviour of the client, including whether stickers are shown, depends on which Emacs you have and how it was built. The sticker answer is the same story plus the webp package, and the missing glyph answer is to install the fonts-symbola package or the freefont and unifont packages on GNU Guix, with a fontset line to add.
The last of these is the subtle one, and it is about width rather than about images. If a character has the full width of several ordinary characters you can tweak the char-width-table, and the readme shows a helper function that installs custom widths for a specific symbol, with a note that a custom variable holds the widths if you want to change them yourself.
Proxies, tracking and the rest of the configuration
Two more of the readme answers are worth reading because they show how much of the client is configurable.
Proxy support is a custom variable, telega-proxies, holding a list of proxy descriptions with a server, a port, an enable flag and a type. The example shows SOCKS5 proxies with a username and a password, and one of them is enabled and the other is not, and the readme points at the variable documentation for the full range of proxy types.
(setq telega-proxies
(list
'(:server "1.2.3.4" :port 8080 :enable :false
:type (:@type "proxyTypeSocks5"
:username "rkn" :password "jopa"))
'(:server "2.3.4.5" :port 8088 :enable t
:type (:@type "proxyTypeSocks5"
:username "rkn" :password "jopa"))
))The second is the tracking feature, which answers whether there is something like the erc tracking of chat activity. There is, and it is enabled by setting telega-use-tracking-for to a non-nil value. The important detail is that tracking is done only for opened chats, meaning chats that have a corresponding chat buffer, and the value you set is a chat filter, so tracking is scoped by the same filter mechanism as everything else.
That design is Emacs native. The tracking is not a server side feature, it is the client noticing which chat buffers you have open, which is exactly the information a buffer oriented interface gives you for free.
Packaging, funding and the shape of the project
The distribution channels are broad for an Emacs package, and they are all listed in the badge row at the top.
There is MELPA and MELPA Stable, and a package in GNU Guix. The project is on Open Collective with a backers list, there is a Telegram chat, a continuous integration badge and a Docker image build workflow for the server, and the readme lists a donation page for TON, USDT and Bitcoin, with the note that donating makes you a patron forever and gets you telega cat ears if you wish.
The last detail is the kind of thing that says a lot about a project, and so is the fact that the development happens in a Telegram group rather than only in the issue tracker.
So the practical summary of the project. It is a serious client, split across an Emacs Lisp front end and a native TDLib server, with the parts of a Telegram client that suit a text editor done properly and the parts that need a graphical interface, meaning voice and video, left out. The documentation is the readme and the manual, and the readme is unusually candid about the places where Emacs is the wrong tool, which is exactly what you need to know before you spend an evening setting it up.
And the versions tell you the maintenance story. The last tagged release is from December 2021, the code is being pushed to the repository in October 2026, and the release branch is the one that matches the current TDLib. That is a project that moves, where the tags and the branch have diverged, so you should follow the branch the readme points at rather than the latest tag.
Editorial conclusion
Adopt telega.el if you live in Emacs and want your Telegram chats in the same place as your code, because the filtering, the sorting and the Emacs integration are better than anything the official clients offer. Do not adopt it if voice and video chat matter to you, since full support for those is the one major feature the README says is missing. Before you install, read the readme answers on images and fonts, because the behaviour of stickers, emoji and full width characters depends on which Emacs version you have and on which image libraries it was built against.
Frequently asked questions
What is telega.el?
It is a full featured unofficial Telegram client for GNU Emacs, written in Emacs Lisp and built on the TDLib client library. It implements most of the features of the official clients, and the one major feature it lacks is full support for voice and video chats.
What does telega.el need to be installed?
The visual-fill-column package, which is available from MELPA. Without it the installation fails with a cannot open load file error for that file, and the readme asks you to install it first.
Does telega.el support proxies?
Yes, through the telega-proxies custom variable, which holds a list of proxy descriptions with a server, a port, an enable flag and a type, including SOCKS5 with credentials. The readme points at the variable documentation for the full range of proxy types.
How do I fix missing glyphs or wrong character widths in telega.el?
For missing glyphs, install the fonts-symbola package or the freefont and unifont packages on GNU Guix. For width problems, where a character occupies several ordinary columns, tweak the char-width-table, using the helper the readme shows and the width custom variable, and the readme notes this is partly an upstream issue.
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/zevlg-telega-el)