On the same day the link to the new open repository for the Telegram for macOS client was shared with beta testers, the client's team began accepting third-party contributions to it. By October 25, 10:19 UTC, 81 pull requests from 19 authors had been submitted to TelegramMessenger/telegram-macos, with 30 of them merged into the main branch. Accepted changes reach the macOS beta in a few hours, one even in less than an hour. This applies to those on the Mac client's beta channel and developers who wish to improve the official client rather than create their own fork.

How Many Contributions Were Submitted and Accepted

A pull request is a proposed code change that the repository owner can merge into their branch or reject. The first arrived on October 23 at 14:18 UTC, and the first was merged at 17:45 UTC: this was #3, replacing the pirate flag with a diamond for collectible numbers in the country list. On October 23, 17 pull requests were submitted; on the 24th, 55; and in the first ten hours of the 25th, another 9.

As of October 25, 10:19 UTC:

StatusPull Requests
Merged30
Closed without merging14
Open37

The merged contributions came from 11 different authors, totaling 7,307 added lines and 1,089 deleted lines. All 30 were merged by a single account, macosswift. Its profile lists the name Telegram macOS, company Telegram, and website macos.telegram.org. Nine merged contributions from one author came from branches prefixed with codex/, which is how OpenAI's Codex agent names them by default.

Rules Introduced on the Second Day

On October 24 at 16:12 UTC, CONTRIBUTING.md and a pull request template appeared in the repository. Each pull request must now include four sections: the main change, the reason, "before" and "after" screenshots or videos in the same scenario, and a description of the verification. If there is no visible result, an explanation must be provided instead of screenshots, along with the verification output. For behavior changes, the macOS version and client build number must be specified. A pull request missing any section or without a marked verification confirmation is not ready for consideration.

The template began to be applied that same evening. From 17:58 to 18:09 UTC, four pull requests were closed with the REJECTED tag: there were no screenshots or videos under "before" and "after." From 19:31 to 19:36 UTC, the same remark was left on 11 more pull requests. These were not closed but requested to be supplemented, and two of them were merged that same evening.

Reasons for Rejection

Besides an empty template, contributions are closed on their merits, with an explanation in the comments:

  • #6, a flat sidebar and favorite folder tabs, changes the interface and product, and the team "does not plan to take such changes at the moment";
  • #13 showed the AI editor button from the 10th character, but by design, it appears after three lines. The input field also jumped by 30 points. The part concerning editing sent messages was deemed functional and merged separately in #22;
  • #53 manually edited only Russian strings, whereas client translations are done on translations.telegram.org for all languages simultaneously;
  • #23, local builds and app signing: the team promised to change build and signing settings themselves, and this contribution broke the CI build test;
  • #32 showed chats in folders that the user was not a member of, and #40 broke search. A screenshot and video of the breakage were left under it.

Under #14, it was initially noted that the code did not compile, and a request was made to check the build before submission. It was later merged. #75 with a floating tab bar was also returned with a remark: after several switches, the avatar diverged from the selection ring. The author fixed this at 07:39 UTC, and the contribution was merged at 08:09 UTC.

How Contributions Reach Beta

The macOS beta is released via update versions with the same note: "Bug fixes, minor improvements, and more." That third-party contributions have been included in a build is evident from its binary: strings from their code appear where they were not present before.

Build 13.1.0.283377 was released on October 24 at 21:27 UTC. It is the first to include the strings "Could not load message history" and "Message history pagination did not advance" from #20 (chat export errors are now shown for each chat instead of silently disappearing), "Failed to persist the custom application icon at %@" from #10 (app icon change), service names from #2 and #27 (notification settings), and from #16 (bot commands). These five contributions were merged between 15:50 and 18:45 UTC, meaning they reached beta in 2 hours 43 minutes to 5 hours 37 minutes.

Build 13.1.0.283380 was released on October 25 at 09:06 UTC, 57 minutes after #75 was merged. It introduced the names TabBarItemControl and SelectionGesture from the code of this contribution.

The team's own code has almost caught up with the beta. On October 23 at 17:04 UTC, the commit "Merge branch 'release' into master (13.1)" landed in the main branch, the build number in Info.plist increased from 283305 to 283357, and over a million lines were added. The beta by that hour was already 283368. The HTMLBubbles module, which renders messages in HTML and JavaScript in the beta, is still not in the open-source code, and two scripts in the repository verify that it has not been included.

What Has Already Been Merged

Pull RequestChanges
#2Notification settings as in Telegram for iOS: categories, exceptions, reactions
#27Story notifications and story settings section
#75Floating tab bar as in iOS, indicator can be dragged
#36"1 year" duration for automatic termination of inactive sessions
#31, #37"Remove from folder" option and deletion of folder avatar
#22AI editor when editing a sent message
#20Chat export errors are visible per chat
#34, #9Copying photos puts the image itself into the buffer, and messages are copied with the date
#29, #30Translation to regional interface language (e.g., pt-br) and input of letters with diacritics in polls, tasks, and contact notes

In #75, the author noted that the lens effect on the indicator, as seen in iOS, was not included in the contribution. In iOS, it is drawn by a closed UIKit component not available in the macOS SDK, and replicating it would require a custom Metal renderer.