Telegram github commits and releases
4.55K subscribers
601 files
20.3K links
Broadcast from the most important Telegram clients' repositories
Download Telegram
telegramdesktop/tdesktop/public-canary12682e61 files, +4/-2
[ai] Reconcile only the groups the run selected

telegramdesktop/tdesktop/public-canary51ac1a61 files, +7/-2
Fixed abort scheduling TTL with a wrong system clock.

The interval was computed from two int32 timestamps, so a wrapped or
stale unixtime::now() - which is what the OS correcting a badly wrong
clock produces - overflowed it negative, and base::Timer aborts on that.

telegramdesktop/tdesktop/public-canaryfa863632 files, +59/-28
Fixed stale last message after a topic switch.

The reply fields decide topicRootId(), so setReplyFields() can move an
item to another topic. History::itemRemoved() later notifies only the
current topic(), leaving the old one holding a raw pointer to an item it
would never hear about again.

Also stop publishing item data changes from inside createComponents():
notifying about an item that new HistoryItem() has not finished building
lets a listener re-enter and reach it half-constructed.

telegramdesktop/tdesktop/public-canary61be1b51 files, +1/-1
Fixed crash showing a popup menu destroyed inside show().

telegramdesktop/tdesktop/public-canary5efbf503 files, +15/-2
Reset palette icon copies through their own palette.

telegramdesktop/tdesktop/public-canaryd0b86c62 files, +2/-2
Update Qt patches to guard windows destroyed mid-event.

telegramdesktop/tdesktop/public-canary9959fd71 files, +14/-3
Fixed assertion editing a deleted proxy into a duplicate.

replaceItemWith() removed the edited row from the settings list without
restoring it first, so doing that to a row already marked deleted - which
is not in that list at all - failed the Assert. Its sibling
replaceItemValue() has restored first all along.

_list is also a vector, so erasing the edited item shifts everything
after it and left the iterator for the duplicate naming a different item
- or one past the end when the duplicate was last. Read its id and
deleted flag before the erase; everything after it works by id anyway.

#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary499b1bb2 files, +30/-6
Fixed stack overflow typing a date with an IME.

Same cycle the phone field fix closed: putNext() ends in setFocus(), and
on Windows a focus change with an open IME composition makes
QWindowsInputContext::reset() re-send the commit to the field we came
from, whose correctValue() fires putNext() again. Focus the next field
asynchronously, the way Ui::TimeInput already breaks this exact loop - a
re-entrancy flag would instead swallow a chained overflow digit, since
correctValue() can hand one straight on to the field after next.

telegramdesktop/tdesktop/public-canarye1b410e1 files, +6/-0
Fixed crash painting an info layer with no content.

parentResized() can move the content out into a MoveMemento and only
queue hideSpecialLayer(), and LayerStackWidget renders the layer
synchronously through Ui::Shadow::grab() during transitions, so
paintEvent could run in the same window showFinished() was guarded for.

telegramdesktop/tdesktop/public-canaryf827ef81 files, +7/-1
Fixed crash in the media viewer with no monitors left.

telegramdesktop/tdesktop/public-canaryf0125561 files, +11/-3
Fixed huge allocation blurring a video preview.

The frame was blurred at full resolution and only then scaled down to the
preview width, which both allocates by the source pixel count and washes
the blur out in proportion to how much is scaled away - a 4K video got a
noticeably sharper preview than a small one.

telegramdesktop/tdesktop/public-canary1a5921f1 files, +7/-1
Don't leak a background subscription per font family tap.

telegramdesktop/tdesktop/public-canary07d30961 files, +1/-1
Don't abort on E_OUTOFMEMORY building media controls.

telegramdesktop/tdesktop/public-canary7d5492e1 files, +45/-26
Fixed acting on the wrong sticker in a mixed set.

Hit testing yields an index into _elements, which skips the premium
stickers an account that cannot get premium must not see, while preview,
sending, the context menu, deletion and reordering all looked that index
up in _pack - which keeps them. With one skipped sticker before a visible
one, clicking a sticker sent a different one.

Everything driven by a visible position now reads _elements, and the
reorder translates both positions through the documents so the full pack
and the server still get the position in the whole set.

telegramdesktop/tdesktop/public-canary7caa13c1 files, +1/-1
Fixed reentrancy destroying the last menu separator.

#tdesktop
🫡3
telegramdesktop/tdesktop/public-canaryf1f07db1 files, +1/-1
Guard the other popup menu show paths as well.

telegramdesktop/tdesktop/public-canaryb3e85dc2 files, +41/-2
Fixed resetting icons that outlived their owner.

ChatStyle::value() hands its result to the caller, so the icons it makes
are not ours to keep in _ownedIcons: the lifetime overload's icons die
with the caller - a section's corner buttons, for instance, while the
session style lives on - and the by-value overload's live in a local.
A later palette change then reset through freed pointers.

Track only what the lifetime overload creates, and drop it again when
that lifetime ends.

telegramdesktop/tdesktop/public-canary4f3da4d1 files, +7/-0
Fixed stale last message after a service edition.

createServiceFromMtp() rebuilds the data topicRootId() reads, so a
service edition can move the item to another topic - and the old one was
left holding a raw pointer History::itemRemoved() would never tell it
about. The sublist beside it was already handled this way.

telegramdesktop/tdesktop/public-canary7e4e39d1 files, +5/-3
Don't hide a download another entry still owns.

detach() reported the item removed even when another downloaded entry
still held it, so the downloads list dropped a row that was still backed
by a file until the view was rebuilt.

telegramdesktop/tdesktop/public-canary98807cc1 files, +1/-1
Don't call through a null WinRT stream reference factory.

telegramdesktop/tdesktop/public-canary2ad89e62 files, +2/-2
Update Qt patches, narrower guard and a wider cocoa one.

telegramdesktop/tdesktop/public-canaryeda64ab1 files, +38/-13
Fixed huge allocation cropping a panorama thumbnail.

Expanding to the box before cropping avoids deep copying a 12000x9000
photo, but it blows up the other way on an extreme aspect ratio: a
2560x26 panorama expands to about 35000x360, where cropping first cost
almost nothing. Both orders scale by the same factor, so take whichever
intermediate is smaller.

telegramdesktop/tdesktop/public-canary9f47cda1 files, +4/-1
Fixed one more crash when the last monitor is removed.

#tdesktop
🫡3
telegramdesktop/tdesktop/public-canaryccfb5b32 files, +21/-1
Give up clearing a history after enough failed retries.

Re-requesting the dialog entry until the last message is known has no
bound, so an entry that keeps coming back unknown - offline, or a flood
wait - spun requests forever and the clear never finished.

telegramdesktop/tdesktop/public-canary367052b4 files, +7/-0
Add public keys for canary channel.

telegramdesktop/tdesktop/public-canary570c4789 files, +1279/-0
Add v2 update verification core and build channels

telegramdesktop/tdesktop/public-canaryebc783a3 files, +672/-0
Support v2 channel packing in the Packer

telegramdesktop/tdesktop/public-canary72a32c47 files, +662/-141
Verify, fetch and install v2 updates in the client

telegramdesktop/tdesktop/public-canary1c3da592 files, +9/-1
Show canary version and skip changelogs on canary

telegramdesktop/tdesktop/public-canary8823c562 files, +821/-0
Add focused tests for v2 update verification

telegramdesktop/tdesktop/public-canary86bf3a81 files, +862/-0
Add canary build and publish workflow

telegramdesktop/tdesktop/public-canaryaf2d7d91 files, +186/-163
Build one canary lane per repository in CI

telegramdesktop/tdesktop/public-canary2ee95493 files, +31/-13
Use readable v2 update file names

telegramdesktop/tdesktop/public-canary2363f184 files, +117/-8
Use new update names and pinned Bot API image in CI

telegramdesktop/tdesktop/public-canary81bb9f43 files, +108/-62
Ship per-arch mac updates with a universal installer

#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary18006031 files, +70/-28
Publish portable archives as canary first installs

telegramdesktop/tdesktop/public-canary430ae6d1 files, +5/-4
Drop the bundled d3d compiler from canary builds

telegramdesktop/tdesktop/public-canarye240f443 files, +41/-4
Embed external and local signatures in one packer pass

telegramdesktop/tdesktop/public-canaryb7cc9752 files, +82/-3
Add a v2 update switch to the release build scripts

telegramdesktop/tdesktop/public-canary64256c51 files, +29/-1
Read the pinned metadata through the local Bot API

telegramdesktop/tdesktop/public-canary98a224c3 files, +25/-1
Support v2 updates in the updater and deploy scripts

telegramdesktop/tdesktop/public-canary183a2c623 files, +872/-216
Harden canary builds running.

telegramdesktop/tdesktop/public-canarye3802ea4 files, +20/-10
Fix build for Release.

telegramdesktop/tdesktop/public-canaryedb6eea2 files, +68/-21
Try to fix signing.

telegramdesktop/tdesktop/public-canary5e2e4e01 files, +77/-5
Improve caching.

telegramdesktop/tdesktop/public-canary9a8e58b1 files, +17/-5
Try to fix signing again.

telegramdesktop/tdesktop/public-canary6ed644210 files, +598/-311
New names, separate publishing.

telegramdesktop/tdesktop/public-canary27a87777 files, +255/-6
Fix translocated launch on macOS.

#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary86649fa4 files, +32/-14
Improve version display for canary.

telegramdesktop/tdesktop/public-canaryd53ae211 files, +141/-40
Split macOS canary build into per-arch jobs.

telegramdesktop/tdesktop/public-canary1f347047 files, +198/-3
Add an in-title CANARY/PRIVATE marking.

telegramdesktop/tdesktop/public-canary083f5df6 files, +42/-24
Rename canary branches.

telegramdesktop/tdesktop/public-canary588628f1 files, +3/-0
Fixed per-arch build picking universal crashpad handler.

telegramdesktop/tdesktop/public-canarya8938701 files, +11/-4
Keep TelegramForcePortable in portable archives.

telegramdesktop/tdesktop/public-canary45de1831 files, +11/-11
Allow CANARY_ALLOW_UNSIGNED in public lane too.

telegramdesktop/tdesktop/public-canary48e55561 files, +38/-3
Try workaround clone problems.

telegramdesktop/tdesktop/public-canaryb5896f21 files, +25/-19
Fix build with GCC.

telegramdesktop/tdesktop/public-canary4ddbb382 files, +36/-19
Fix public publishing.

telegramdesktop/tdesktop/public-canary145ddf71 files, +6/-6
Keep canary artifacts for seven days

telegramdesktop/tdesktop/public-canaryb0dc6e11 files, +29/-1
Fixed missing ATL breaking breakpad build in canary Windows job.

telegramdesktop/tdesktop/public-canaryccfadeb1 files, +50/-20
Install ATL for the pinned Windows toolset

#tdesktop
🫡3
telegramdesktop/tdesktop/public-canarye4a8e0b1 files, +10/-1
Fallback to v1 update unpacking.

telegramdesktop/tdesktop/public-canary3a105533 files, +26/-7
[ai] Refuse implausible test watchdog values

Task: 2026/08/23/refuse-implausible-test-watchdog-values

telegramdesktop/tdesktop/public-canaryb441b833 files, +0/-0
Delete unused account_check icon rasters

Task: 2026/08/18/delete-orphaned-account-check-icon

telegramdesktop/tdesktop/public-canary329910a2 files, +11/-2
Correct shared media index writes and viewer counts

Task: 2026/08/18/repair-shared-media-index-and-count-bookkeeping

telegramdesktop/tdesktop/public-canaryef9be271 files, +16/-3
Re-index a sent message only when its thread moves

Task: 2026/08/18/repair-shared-media-index-and-count-bookkeeping

telegramdesktop/tdesktop/public-canary99ad2712 files, +60/-6
Derive the pinned bar's topic root from the thread

Task: 2026/08/19/align-replies-thread-shared-media-attribution

telegramdesktop/tdesktop/public-canary206edab2 files, +1/-1
Pair the uploaded media edit's shared media removal

Task: 2026/08/19/pair-media-edit-removal-with-index-add

telegramdesktop/tdesktop/public-canary4f10eb61 files, +20/-5
Drop a sent message from the shared media lists it left

Task: 2026/08/19/match-sent-message-removal-to-written-mask

telegramdesktop/tdesktop/public-canaryf1e7b581 files, +3/-3
Don't keep a media reference across rich page changes

Task: 2026/08/19/refetch-saved-media-after-rich-page-changes

telegramdesktop/tdesktop/public-canary0b9f3f95 files, +30/-13
Don't lower shared media counts for unindexed messages

Task: 2026/08/20/stop-unmatched-removal-lowering-shared-media-counts

telegramdesktop/tdesktop/public-canarye4dc19f7 files, +40/-56
Tie stored pinned index writes to the pinned flag

Task: 2026/08/19/unify-pinned-index-writers

#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary411085f2 files, +52/-1
Write the pinned thread index only in forum peers

Task: 2026/08/20/stop-orphaning-general-id-shared-media-lists

telegramdesktop/tdesktop/public-canary4023d1a2 files, +5/-2
Give a saved sublist its own pinned message list

Task: 2026/08/19/make-saved-sublist-pinned-bar-read-one-list

telegramdesktop/tdesktop/public-canary3ec95b81 files, +6/-0
Retire shared media of a deleted topic with no object

Task: 2026/08/20/retire-forum-media-lists-without-topic-objects

telegramdesktop/tdesktop/public-canary30876f25 files, +31/-0
Retire all topic shared media when a forum is destroyed

Task: 2026/08/20/retire-stranded-forum-media-keys-on-forum-teardown

telegramdesktop/tdesktop/public-canary2b9fb291 files, +6/-4
Guard the live-topic media unload against a zero root

Task: 2026/08/20/guard-live-topic-unload-against-zero-root

telegramdesktop/tdesktop/public-canarye3891161 files, +6/-4
Guard the forum teardown media unload against a zero root

Task: 2026/08/20/guard-forum-teardown-unload-against-zero-root

telegramdesktop/tdesktop/public-canary8cde4e42 files, +4/-4
Resolve the self peer sublist in the shared resolver

Task: 2026/08/20/resolve-self-peer-sublist-in-shared-resolver

telegramdesktop/tdesktop/public-canary5dada732 files, +0/-2
Drop the write-only monoforum id from top controls

Task: 2026/08/20/retire-write-only-top-controls-monoforum-peer-id

telegramdesktop/tdesktop/public-canaryfee73061 files, +1/-1
Read the inbox when a sublist has no parent chat

Task: 2026/08/20/restore-read-inbox-on-parentless-sublist-send

telegramdesktop/tdesktop/public-canaryf5b5f841 files, +2/-8
Use the shared sublist resolver in the player panel

Task: 2026/08/20/collapse-player-panel-sublist-onto-shared-resolver

#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary2c095b04 files, +35/-0
Request pinned messages when a pin is not loaded

Task: 2026/08/20/reach-unloaded-pin-on-complete-pinned-slice

telegramdesktop/tdesktop/public-canary7fc04c36 files, +21/-10
Open a saved sublist's own shared media page

Task: 2026/08/20/open-saved-sublist-own-info-media-page

telegramdesktop/tdesktop/public-canary3188a109 files, +63/-43
Align sublist media count, query and window keys

Task: 2026/08/21/align-sublist-media-count-query-and-window-keys

telegramdesktop/tdesktop/public-canary0fb9de24 files, +55/-3
Keep Info pages on their topic or sublist

Task: 2026/08/21/preserve-info-thread-identity-and-lifetime

telegramdesktop/tdesktop/public-canarydfa728f1 files, +12/-10
Tear down Info after a sublist is destroyed

Task: 2026/08/21/preserve-info-thread-identity-and-lifetime

telegramdesktop/tdesktop/public-canary5af73231 files, +14/-12
Clear Info immediately when its sublist dies

Task: 2026/08/21/preserve-info-thread-identity-and-lifetime

telegramdesktop/tdesktop/public-canary48fc35a1 files, +9/-13
Always drop an Info wrap when its sublist dies

Task: 2026/08/21/preserve-info-thread-identity-and-lifetime

telegramdesktop/tdesktop/public-canary7c87f536 files, +90/-34
Reach unloaded pins on thread keys and updates

Task: 2026/08/21/reach-unloaded-pins-across-thread-and-update-paths

telegramdesktop/tdesktop/public-canary8ca5c103 files, +11/-4
Rebind Info wrap teardown when a sublist is replaced

Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist

telegramdesktop/tdesktop/public-canary2f3b1b22 files, +14/-10
Tear down Layer Info instantly when its sublist dies

Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist

telegramdesktop/tdesktop/public-canary298f4c82 files, +17/-14
Queue Info wrap teardown off sublist destroyed()

Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist

#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary4f6a48f3 files, +19/-21
Hide Layer Info before its sublist is erased

Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist

telegramdesktop/tdesktop/public-canary1aaeee42 files, +15/-18
Preserve teardown stream across Info wrap removal

Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist

telegramdesktop/tdesktop/public-canary055522e1 files, +0/-1
Remove stale Info teardown implementation note

Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist

telegramdesktop/tdesktop/public-canarydea7ba51 files, +3/-2
Keep saved sublists alive through item teardown

Task: 2026/08/21/finish-info-wrap-sublist-teardown-past-item-destroy

telegramdesktop/tdesktop/public-canary28d924b4 files, +39/-20
Align sublist media counts, windows and titles

Task: 2026/08/21/align-sublist-media-count-window-and-title

telegramdesktop/tdesktop/public-canary5f1bf031 files, +7/-5
Show the new window tooltip only on entries that have one

Task: 2026/08/23/verify-saved-sublist-media-surfaces-and-gate-tooltip

telegramdesktop/tdesktop/public-canary0cb4b754 files, +90/-67
Unify sublist media window ids and persisted titles

Task: 2026/08/23/unify-sublist-separate-id-and-window-naming-rulings

telegramdesktop/tdesktop/public-canary7f9844b1 files, +2/-2
Limit media topic context to forum chats

telegramdesktop/tdesktop/public-canary1a70cff1 files, +1/-1
Removed stale comment about swscale destination format caching.

telegramdesktop/tdesktop/public-canary963f8bb1 files, +5/-0
Restricted transcode temp directory permissions to user.

Related commit: 0807483acc.

telegramdesktop/tdesktop/public-canarydae8e522 files, +26/-6
Extracted video editor layer showing to shared helper.

#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary74503d91 files, +26/-10
Extracted shared video encoder setup from H264 encoder.

telegramdesktop/tdesktop/public-canarycb897b22 files, +7/-3
Added VP9 encoder and webm muxer to ffmpeg build configs.

telegramdesktop/tdesktop/public-canary46be7b32 files, +150/-20
Added webm sticker output mode to video encoder.

telegramdesktop/tdesktop/public-canary181a39f7 files, +332/-69
Added adapting video stickers into custom emoji.

Related commit: 9895e5bb89.

#tdesktop
🫡4🤨1
morethanwords/tweb/masteref41b29183 files, +7649/-4673
Migrate legacy rows to Solid RowTsx

#webk
🫡4
telegramdesktop/tdesktop/dev70f4f421 files, +1/-1
Fixed crash constructing a raced shared Lottie state.

A shared provider is destroyed by the first render() that fails, on the
renderer thread, while SharedState is constructed on a crl::async one -
so _shared could go away between valid() and construct(). Tolerate that
instead of asserting, and treat a missing cover as a failed animation:
the metadata copied at load time no longer describes such a state, and
frameForPaint() would have asserted on its null frame later on.

telegramdesktop/tdesktop/dev50efdbc1 files, +8/-1
Guard enlarging a group call video with no monitors.

videoEndpointLargeValue() fires on data, not on user input, so it can
reach enlargeVideo() during the interval when the last monitor is gone
and QWidget::screen() is nullptr.

telegramdesktop/tdesktop/dev8bcbab71 files, +5/-1
Show the moved service message in its new topic.

The half beside applyItemRemoved() was missing: the edited item left the
old topic but was never offered to the new one, so its preview and order
in the topic list stayed stale until a reload.

telegramdesktop/tdesktop/dev23b6c1b1 files, +1/-1
Destroy a removed menu item before its action.

An item reads action() while it is being torn down, so removeAction()
deleting the action first left it pointing at freed memory for the whole
widget destructor. clearActions() and clearLastSeparator() already do it
in this order.

telegramdesktop/tdesktop/dev97328051 files, +1/-1
Don't clear metadata through a null display updater.

init() registers the ButtonPressed handler before it fills in the display
updater, so an E_OUTOFMEMORY in between leaves the token set and the
updater null - and the destructor takes exactly that branch, calling
ClearAll() on a null projected interface at process exit.

telegramdesktop/tdesktop/dev7f653512 files, +12/-4
Destroy the info controller with its content widgets.

createMemento() freed the Controller while _content lived on, and the
content widgets hold it by a raw pointer: MainWidget::showHistory takes
the memento, runs a whole HistoryWidget::showHistory - which reaches
itemVisibilitiesUpdated() and the still-subscribed media list - and only
then destroys the section. The nulling was never a lifetime requirement,
just the "memento already taken" flag showInternal() reads, so make that
a flag and let the controller die with the widget after _content.

telegramdesktop/tdesktop/dev40237901 files, +1/-1
Update lib_ui.

#tdesktop
🫡3
telegramdesktop/tdesktop/devba23d841 files, +3/-1
Fixed nosound flag dropping animated attribute from sent GIFs.

Regression was introduced in fe7e967258.

telegramdesktop/tdesktop/dev3fe51641 files, +7/-4
Added mp4 conversion for quicktime videos sent as GIFs.

Related commit: fe7e967258.

telegramdesktop/tdesktop/dev049b4ad2 files, +6/-0
Added getter of automatic clear time to emoji statuses.

telegramdesktop/tdesktop/dev26612168 files, +137/-0
Added emoji status actions to custom emoji context menu.

#tdesktop
🫡4🤝1
UnigramDev/Unigram/developf902c668 files, +52/-1
Toast when adding/removing from a folder

UnigramDev/Unigram/develop40f235a4 files, +68/-11
Add a solution for the Win32 flavour

UnigramDev/Unigram/develop9b3d4286 files, +28/-6
Windows Hello support in Win32 project

UnigramDev/Unigram/develope12bb7f1 files, +0/-1
Don't clear passcode from session closed handler

UnigramDev/Unigram/developb82f6cf15 files, +2046/-1868
Reorganize extensions

UnigramDev/Unigram/develop708a7381 files, +31/-2
Fix parsing spaces in html paste

UnigramDev/Unigram/develop5182e585 files, +1/-96
Remove dead code from the extension helpers

UnigramDev/Unigram/developbd846e94 files, +46/-108
Collapse duplicated extension overloads

UnigramDev/Unigram/develop0d6bfb01 files, +123/-33
Reset pooled spans and bound the text element pool

UnigramDev/Unigram/develop1278bc51 files, +127/-75
Fix search collection asking for more items forever

UnigramDev/Unigram/develop1a078d057 files, +1413/-284
Replace Rg.DiffUtils with an in-tree diff reader

UnigramDev/Unigram/develope9498991 files, +35/-0
Hash the stowed origin trace into the crash group

UnigramDev/Unigram/develop88c5aa52 files, +16/-1
Fix null ref

UnigramDev/Unigram/develop99bb3f164 files, +428/-549
Merge MvxObservableCollection into DiffObservableCollection

UnigramDev/Unigram/developd6ecdaa2 files, +3/-11
Remove ToTimestampMilliseconds

#unigram
UnigramDev/Unigram/streaming-download-buttons6736c6e3 files, +73/-0
Track the files a reader is streaming

UnigramDev/Unigram/streaming-download-buttonsbb7a50313 files, +181/-138
Hide a download that only feeds a reader from the file buttons

#unigram
UnigramDev/Unigram/streaming-download-buttonsf8a67593 files, +73/-0
Track the files a reader is streaming

UnigramDev/Unigram/streaming-download-buttons278c0a113 files, +181/-138
Hide a download that only feeds a reader from the file buttons

#unigram
UnigramDev/Unigram/incremental-loading-terminatesb21d1331 files, +14/-7
Stop the reaction list asking for more items forever

#unigram
UnigramDev/Unigram/video-chat-aliases-itemssource5d2aea81 files, +5/-1
Pass the projected sender vector to VideoChatAliasesPopup

#unigram
morethanwords/tweb/master882c48a1 files, +10/-0
Fix stale forum avatar unread badge

morethanwords/tweb/mastere934b903 files, +4/-5
Remove ripple from archive and community rows

morethanwords/tweb/master8f6b3809 files, +152/-61
Show forum membership actions

morethanwords/tweb/master119c8273 files, +65/-83
Align chat actions plate with translation layout

morethanwords/tweb/master1cb8bb89 files, +513/-203
Use thread separators instead of topic chips

morethanwords/tweb/master1d0e37311 files, +218/-64
Pinned message plate: thread-scoped everywhere, no flicker

Opening a forum topic flashed the plate with the channel-wide pin: the initial
hint came from `fullPeer.pinned_msg_id` while the plate's own list is fetched
with `threadId`, so a topic with no pins revealed the plate and hid it again
one task later (and shifted `--pinned-floating-height` with it).

topbar: seed the hint only when there is no threadId; key the staged setup by
peer + thread (on mobile one chat instance is reused across peer changes, so
peerId alone kept the previous topic's plate); pass threadId into the pinned
tab and its title counter; drop the eagerly created throwaway plate
pinnedMessage: clear pinnedMid/pinnedIndex when the list resolves to empty, so
no phantom hint is saved into ChatSavedPosition and re-flashed next open

Pinning while sitting at the end of the chat kept the previous pin with a
bumped counter: the `peer_pinned_messages` anchor was unconditional. Anchor
only while the user is actually walking the pin list (locked /
waitForScrollBottom) and not already at the end of the history.

Rest of the review of the plate:
- forum: unpin-all / hide are thread-scoped too (top_msg_id, thread-keyed
hiddenPinnedMessages, thread-filtered local pFlags.pinned sweep), and both
pin events carry threadId so a change in one topic no longer resets the
plate of every other open topic
- chat: isPinnedMessagesNeeded() dropped the stale `|| isForum`, which put a
plate inside a forum's own pinned-messages tab (and scheduled, and search)
- getPinnedMessage remembers an empty list; testMid mirrors setCorrectIndex's
no-pins guard, so a jump-to-message in a chat without pins stops refetching
- _setPinnedMessage takes a render seq so an older run can't commit over a
newer pin; destroy() cancels the debounce, throttle and leaving-button
timers; the stale dataset.mid is cleared when nothing is pinned
- getCurrentIndexPromise is reset before the trailing testMid/setCorrectIndex
so a fetch they start isn't orphaned
- followPinnedMessage falls back to mids[0] when pinnedMaxMid isn't known yet,
instead of wrapping onto the oldest pin
- setCorrectIndex returns for static (Discussion) plates instead of doing an
elementFromPoint reflow on every throttled scroll

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

#webk
🫡3
morethanwords/tweb/mastercc42eb71 files, +8/-7
Let the link preview be dismissed back to the reply plate

Quoting a message and then typing a link left the plate stuck on the web page:
neither Escape, nor the cross, nor "Remove preview" could get rid of it.

setTopInfo({type: 'webpage'}) only repaints the plate - helperType stays
'reply' - so onHelperCancel restores the previous helper by calling
helperFunc(). But willSendWebPage was dropped only AFTER that call, and
setTopInfo bails out early on `willSendWebPage && type === 'reply'`, so the
reply was never repainted: the plate kept showing a preview that was already
gone from the state. setCurrentHover got an undefined element along the way,
which also killed the hover menu holding "Remove preview" - hence "stuck".

Drop willSendWebPage before restoring the helper; lastUrl / noWebPage are
still restored afterwards, since setTopInfo's clearHelper resets them.

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

morethanwords/tweb/masterf30c2423 files, +151/-26
Offer Reopen Topic in the chat actions plate

A closed forum topic gave a manager no way back: the input stayed writable
(canSendToPeer lets canManageTopic through) but reopening was buried in the
chat-list context menu. tdesktop puts a TopicReopenBar right in the bar stack
that already carries the peer-settings actions, so the same plate carries it
here.

dialogsStorage.canReopenTopic(peerId, threadId) composes the two halves of
tdesktop's state - the topic is closed, and we may manage it - into one sync
read, so the UI asks once instead of fetching the topic and then asking about
rights.

actions plate:
- the peer-settings actions and the reopen action are now independent halves
recombined by applyButtons(), which decides the visible list (reopen first)
and the hidden state synchronously - the peer-change path keeps committing
in one go, no flicker
- the close button renders only for the peer-settings half: tdesktop's reopen
bar has no cross, and hidePeerSettingsBar would be meaningless there.
Dismissing now clears only that half, so a still-closed topic keeps its
button
- a lone button with no close beside it spans the plate (is-single) instead of
sitting in the centred pill width that reserves an end slot for the cross
- state follows the topic live: dialogs_multiupdate carries the closed flag
(it arrives as a messageActionTopicEdit service message) and chat_update
covers rights changing under us, which is what tdesktop watches
adminRightsValue for
- gated to ChatType.Chat with a thread on a chat peer, so it can't surface in
the pinned/discussion/saved views

The topic check joins the existing acked getPeerSettings call, and it answers
from worker cache, so the chat-open batch stays uncached-round-trip free.

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

#webk
🫡3