Telegram github commits and releases
4.54K subscribers
601 files
20.3K links
Broadcast from the most important Telegram clients' repositories
Download Telegram
morethanwords/tweb/mastere95fe521 files, +5/-1
Keep personal account in paid-reaction send-as list

channels.getSendAs(for_paid_reactions=true) omits the personal account;
the client injects it as the default peer. But this.sendAsPeers — the
canonical pool every click handler rebuilds the menu from — was sliced
before that injection, so the personal account was missing from it. The
menu rendered correctly on first open (built from the local list), but
the first selection regenerated it from this.sendAsPeers and dropped the
personal account permanently. Save this.sendAsPeers after folding in the
current/default peer.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

morethanwords/tweb/master07f72889 files, +214/-51
Notify when another user posts a story

Add a local notification when a peer you follow posts a new story, mirroring the message-notification pipeline: the worker dispatches a notificationBuild task carrying a story payload (discriminated union) and the main thread builds and shows it. Respects the existing per-peer/global stories_muted setting, skips own/out/already-read stories, and covers the uncached-peer path so a peer's very first story still notifies.

Story notifications play no sound and don't bump the tab-title counter (noIncrement). Clicking opens the peer's stories at the first unread (matching Android and the avatar tap): in-page directly, on the service-worker/background-push path via a custom.story_id marker, and cross-account via a new 'story' hash param.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

#webk
🫡3
telegramdesktop/tdesktop/dev4943c419 files, +16/-38
Get rid of new Q_OS_LINUX

telegramdesktop/tdesktop/dev34470201 files, +3/-2
Make macOS packaged cache key more stable

telegramdesktop/tdesktop/dev22143a81 files, +15/-3
Per-week cache key for ccache on Linux action

telegramdesktop/tdesktop/dev734d7093 files, +32/-1
Allow to override ffmpeg thread count for debugging purposes

#tdesktop
🫡3
telegramdesktop/tdesktop/devd6f2e4c1 files, +2/-4
Simplify the use of new ffmpeg thread option

#tdesktop
🫡2
telegramdesktop/tdesktop/dev5e1a05f1 files, +1/-1
Fix crash when removing pinned chats during folder changes.

#tdesktop
🫡2
telegramdesktop/tdesktop/dev24ccd1c1 files, +6/-1
Fix crash when finishing the appearing text animation

textAppearCheckLine() runs synchronously from inside the width and
height animation tick callbacks (textAppearWidthCallback /
textAppearHeightCallback). Calling RemoveComponents(TextAppearing::Bit())
there destroys those very animations (and their Ui::Animations::Simple
data) while the animations manager is still iterating them, leading to a
use-after-free / null _data dereference in Simple::value().

Defer the component removal to the next main loop iteration so the
running tick can unwind first.

#tdesktop
🫡2
telegramdesktop/tdesktop/dev7f8c6901 files, +0/-1
Remove duplicate QT_NO_PRIVATE_MODULE_WARNING from root CMakeLists.txt

It now lives in cmake/external/qt/package.cmake

#tdesktop
🫡2
telegramdesktop/tdesktop/devdf268f34 files, +10/-10
Bump actions/cache from 5 to 6

Bumps [actions/cache](https://github.com/actions/cache) from 5 to 6.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/cache
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

#tdesktop
🫡2
telegramdesktop/tdesktop/dev12ce38f1 files, +25/-4
Fixed editing of selected caption in album to target its own media.

telegramdesktop/tdesktop/deva5142b95 files, +94/-34
Slightly improved filling of swipe-next-channel gesture.

telegramdesktop/tdesktop/dev76120b76 files, +186/-175
Replaced custom scroll processing in profile top bar with regular one.

telegramdesktop/tdesktop/deva4ed19f1 files, +21/-7
Extended regular scroll processing to stories section.

telegramdesktop/tdesktop/devffa63865 files, +137/-5
Cached peer list rows into opaque images while scrolling.

telegramdesktop/tdesktop/devfe8ca5a2 files, +34/-4
Added separate painting of peer badge emoji status to peer list.

telegramdesktop/tdesktop/dev1fb28f62 files, +14/-1
Added separate painting of peer list row emoji status to peer list.

telegramdesktop/tdesktop/dev89b4a782 files, +22/-1
Allowed emoji status animation over cached peer list rows.

telegramdesktop/tdesktop/dev3a901012 files, +45/-0
Added refresh of loaded userpics over cached peer list rows.

telegramdesktop/tdesktop/dev55b74843 files, +382/-113
Added media view video as system media controls source.

telegramdesktop/tdesktop/dev43b21103 files, +153/-1
Added metadata of media view video playback to system media controls.

telegramdesktop/tdesktop/dev40b3f623 files, +80/-7
Added swipe-back gesture to info profile section.

telegramdesktop/tdesktop/devf362c161 files, +2/-1
Fixed instant Cmd+Up/Down reply in sections with compose controls.

#tdesktop
🫡3
telegramdesktop/tdesktop/dev14909bc2 files, +6/-4
Fixed display of sticker-set and favorite actions for sending stickers.

telegramdesktop/tdesktop/dev85c94957 files, +184/-0
Added keyboard extension of message text selection to history sections.

#tdesktop
🫡2
morethanwords/tweb/master512d07d1 files, +25/-2
Fix stories hold-to-pause not resuming on release

SwipeHandler bound its global mouseup/touchend listeners to
this.element.ownerDocument at construction time. For a Solid JSX
element (cloned from a <template>), ownerDocument is the inert
about:blank template-contents document until the node is inserted
into the live DOM. The stories viewer constructs the SwipeHandler
before its <Portal> mounts the element, so the release listeners
were bound to a document that never receives real events: mousedown
(bound to the element directly) still paused on press, but mouseup
never reached reset()/onReset()/play(), so the story stayed paused.

Bind the gesture-end listener lazily in handleStart instead, when the
element is live and ownerDocument resolves to the real (main or
Document-PiP) document. Keeps the PiP fix from 9d58fe155 intact and
mirrors the lazy pattern already used in attachGrabListeners.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

morethanwords/tweb/masterbbd37823 files, +87/-79
Render topic profile avatar in the profile-avatars header

Forum and bot-forum topic profiles used a separate inline 'simple avatar'
(.profile-avatar.avatar-120 inside the MainSection, gated by has-simple-avatar).
Route them through the same PeerProfileAvatars header as regular chats with no
photo instead: PeerProfileAvatars.setPeer now takes a threadId, skips the photo
carousel/list-loader, and renders the topic icon as a single centered avatar-120
(no profile-avatars-avatar-fake duplicate, no scaled-down full photo).

- peerProfileAvatars: topic branch in setPeer; processItem renders avatar-120
with a 120px custom-emoji size for topics.
- peerProfile: always use the carousel path, passing the topic id; drop the
needSimpleAvatar concept and the in-section avatar.
- _profile.scss: .is-topic centers the fixed-size icon and keeps it unscaled
when the header collapses; removed the dead .has-simple-avatar rule.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

morethanwords/tweb/master12964462 files, +23/-25
Fix sponsored topbar plate not reserving chat padding-top

The sponsored/ad plate is the only floating plate with height: 'auto', so setFloating measures its offsetHeight. The measurement ran inside the count loop, before the wrapper's `hide` (display: none) class was toggled off — and a display:none ancestor zeroes descendants' offsetHeight. So exactly when the ad plate is the one flipping the visible-plate count 0 -> 1, it was measured at 0 and never reserved its padding-top, leaving it overlapping the chat. Compute the visible set and un-hide the wrapper before measuring.

Also clarify in updatePinnedFloatingHeight that a mid-scroll position is left anchored on purpose (matches iOS/Android: the plate slides over the content rather than shoving it down); behavior unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

#webk
🫡3
morethanwords/tweb/master96fb8c04 files, +227/-194
Fix intermittent SRP 2FA password rejection (unpadded A)

The client public value A = g^a mod p was serialized with its minimal
big-endian length instead of being zero-padded to 256 bytes. The server
normalizes A to 256 bytes before hashing u and M1, so whenever g^a mod p
had a leading zero byte (~1/256 of attempts) our M1 mismatched the
server's and a correct password was rejected at random; a retry (fresh
account.getPassword -> new a) usually succeeded. Pad A to 256 bytes
everywhere, exactly like tdlib's A_bn.to_binary(256).

While matching tdlib's PasswordManager::get_input_check_password:
- generate the ephemeral secret a from a fresh local CSPRNG instead of
the server-provided state.secure_random (which leaked the secret
exponent and was constant across the now-removed retry loop);
- add the validations that were commented-out stubs: verifyDhPrimeAndGenerator
(= check_config) for both the check and new-password paths, and the
srp_B range/length check (0 < B < p, 248 <= len <= 256).

Rewrite src/tests/srp.test.ts into a real suite: KDF vs an independent
Node-crypto reference, a client/server SRP round-trip x25, a forced
leading-zero-A regression (mutation-confirmed it fails on the unpadded
code), the isNew verifier path, and validation throws. Drop the stale
A/M1/srp_B fixtures and the dead src/mock/srp_original.ts.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

morethanwords/tweb/masterc6fb69c2 files, +1/-8
Align reply-quote poll icon inline instead of flexing the subtitle

The poll-option checkmark in the reply/pinned container now carries the
standard inline-icon classes (inline-icon inline-icon-left) so it aligns
with the quote text through the normal inline flow, dropping the bespoke
.with-icon flex wrapper on the subtitle.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

#webk
🫡3
morethanwords/tweb/master0aaab72300 files, +571/-562
Build

#webk
🫡2
morethanwords/tweb/mastera5c73271 files, +42/-19
Fix video streaming edge cases in service worker

- Fall back to the worker on any cache read error (incl. a bare cache
timeout that rejects with undefined) instead of throwing TypeError on
error.type and killing the range request
- Preload the file's last chunk at start (moov/bounds) instead of chunk 0
- Treat PRELOAD_SIZE as a read-ahead window from the current position
rather than an absolute end offset (read-ahead was dead past 20MB)
- Align the preload window start to the chunk grid so preloaded offsets
stay valid MTProto offsets
- Gate the second range part on overflow > 0 (a byte count was used as a
boolean, so a negative value forced a wasteful extra chunk fetch)
- Clamp limit to a server-valid minimum (4KB) to avoid LIMIT_INVALID on
tiny ranges; make SMALLEST_CHUNK_LIMIT a valid 4KB and use it
- Don't resurrect a destroyed stream from toggleStreamInUse(false); clamp
inUse at 0 to stop zombie streams leaking in the map
- Re-arm the idle debounce instead of destroying a stream still bound to
a live <video>
- Swallow rejections from best-effort cache writes and fire-and-forget
preloads to avoid unhandled rejections
- Use Math.clz32 in alignLimit to drop the Math.log FP rounding; remove
the unused Response-Time header

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

morethanwords/tweb/master99de4a82 files, +30/-4
Fix rich-text paste/serialization of newlines around blockquotes

Three related fixes in the contenteditable rich-text path:

- getRichValueWithCaret paste reconciliation: the re-insertion pass used a
drifting offset threshold (`offset > plainTextLength - lineIndex + 1`) that
was only correct for one line index, shifting/losing entities on multi-line
formatted pastes (e.g. a second line in bold). Use the splice index directly
and adjust entity length, not just offset, in both removal and insertion.

- Paste handler: strip messageEntityLinebreak before insertRichTextAsHTML.
wrapDraftText renders line breaks from the text itself; passing explicit
linebreak entities made wrapRichText slice the one before a blockquote,
dropping a \n on e.g. `text\n\nquote`. Stripping them aligns paste with the
edit/draft path (verified: no extra blank line, model preserves both \n).

- getRichElementValue: a multiline blockquote built from block children
(<br>/<div>, what Enter produces) lost its last character outside the quote,
because the entity length is only grown by text nodes while block-generated
\n bypass it. Track the last real-content offset and re-span the blockquote
up to it, excluding trailing block line breaks.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

#webk
🫡3
telegramdesktop/tdesktop/chrome_149.0.0.00830bf31 files, +1/-1
Update User-Agent for DNS to Chrome 149.0.0.0.

#tdesktop
🫡2
telegramdesktop/tdesktop/unused_styles_2026_071af2be21 files, +0/-8
Removed 4 unused style entries.

#tdesktop
🫡2
telegramdesktop/tdesktop/devaad218a1 files, +0/-8
Removed 4 unused style entries.

#tdesktop
🫡3
telegramdesktop/tdesktop/devcf661e51 files, +1/-1
Update User-Agent for DNS to Chrome 149.0.0.0.

#tdesktop
🫡3
telegramdesktop/tdesktop/dev3a528d82 files, +6/-3
Move -fuse-ld=lld to linker flags

telegramdesktop/tdesktop/dev6fcd6501 files, +0/-8
Remove cmake policy linking error workarounds

telegramdesktop/tdesktop/deva2d3b373 files, +3/-5
Restore cmake 3.25 as minimum version

telegramdesktop/tdesktop/devfa3948d1 files, +3/-5
Use theme change event from qApp

telegramdesktop/tdesktop/dev09459d11 files, +9/-8
CreateOfficialIcon -> CreateSupportIcon

That better fits the current meaning

telegramdesktop/tdesktop/dev84b0f731 files, +4/-0
Preserve window icon name on Wayland

#tdesktop
🫡3
telegramdesktop/tdesktop/devf1df2501 files, +1/-1
Update lib_ui.

#tdesktop
🫡3
morethanwords/tweb/master3acb5a43 files, +295/-0
Add run-build skill to list and serve past build snapshots

Lists the git "Build" commits (compiled app in public/) as a paginated,
date-sorted table, then serves any chosen snapshot locally by extracting
that commit's public/ tree via git archive — mirroring server.js and
leaving the working tree untouched.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

#webk
🫡2
Ajaxy/telegram-tt/masterf33f22a3 files, +4/-4
12.0.32

Ajaxy/telegram-tt/master360de4816 files, +188/-37
Support startGroup deep link for bots (#7050)

Ajaxy/telegram-tt/master8f8cc051 files, +12/-3
Modal: Autofocus title by default (#7068)

Ajaxy/telegram-tt/master24fab593 files, +43/-20
Surface Container: Fix background color (#7071)

Ajaxy/telegram-tt/master63b505e1 files, +4/-1
Profile: Improve closing on Esc logic for profiles (#7070)

Ajaxy/telegram-tt/mastere3318c02 files, +7/-0
Passcode: Fix button spacing in passcode settings (#7069)

Ajaxy/telegram-tt/masterdb6db815 files, +37/-23
Passcode: Persist shared state to fix theme flicker on unlock (#7066)

Co-authored-by: Dmitry Kabanov <153344039+dmitrykabanovdev@users.noreply.github.com>

Ajaxy/telegram-tt/master55557c26 files, +20/-11
Middle Header Panel: Fix styles (#7072)

Ajaxy/telegram-tt/master6a0d49f29 files, +587/-240
Middle Column: Redesign composer and chat panels mask (#7059)

Co-authored-by: Alexander Zinchuk <alx.zinchuk@gmail.com>

Ajaxy/telegram-tt/master3b3fde01 files, +19/-6
Mini Apps: Fix miniAppsCachedSize saving after fullscreen (#7074)

Ajaxy/telegram-tt/mastereb9f74688 files, +246/-246
[Build]

#webz
🫡2