TGX-Android/Telegram-X/main • 4d6207e • 2 files, +45/-20
Fix `0 months` in `MessageGiftedPremium` and `MessagePremiumGiftCode`
TGX-Android/Telegram-X/main • e901659 • 1 files, +2/-1
Fix clipped buttons on calls screen
TGX-Android/Telegram-X/main • b8ee9ae • 2 files, +12/-3
Fix `MessageManagedBotCreated`
TGX-Android/Telegram-X/main • f43724a • 6 files, +59/-11
Fix strings in gifts
TGX-Android/Telegram-X/main • 6c4dc94 • 2 files, +12/-0
Support `PREMIUM_SUB_ACTIVE_UNTIL_` error
TGX-Android/Telegram-X/main • ca18047 • 1 files, +7/-4
Display unpinned message in `Recent Actions`
TGX-Android/Telegram-X/main • bf67092 • 2 files, +2/-1
Optimize scrolling comments
TGX-Android/Telegram-X/main • 0d3ddc1 • 1 files, +1/-1
Version bump to `1806`
#tgxandroid
Fix `0 months` in `MessageGiftedPremium` and `MessagePremiumGiftCode`
TGX-Android/Telegram-X/main • e901659 • 1 files, +2/-1
Fix clipped buttons on calls screen
TGX-Android/Telegram-X/main • b8ee9ae • 2 files, +12/-3
Fix `MessageManagedBotCreated`
TGX-Android/Telegram-X/main • f43724a • 6 files, +59/-11
Fix strings in gifts
TGX-Android/Telegram-X/main • 6c4dc94 • 2 files, +12/-0
Support `PREMIUM_SUB_ACTIVE_UNTIL_` error
TGX-Android/Telegram-X/main • ca18047 • 1 files, +7/-4
Display unpinned message in `Recent Actions`
TGX-Android/Telegram-X/main • bf67092 • 2 files, +2/-1
Optimize scrolling comments
TGX-Android/Telegram-X/main • 0d3ddc1 • 1 files, +1/-1
Version bump to `1806`
#tgxandroid
🫡3
telegramdesktop/tdesktop/dev • 2804e77 • 3 files, +524/-27
Added ability to select text in marquee label.
telegramdesktop/tdesktop/dev • 4251092 • 2 files, +14/-1
Added stop of marquee label scrolling for inactive window.
telegramdesktop/tdesktop/dev • 1b906a3 • 2 files, +39/-0
Added selection clearing on click outside marquee label.
telegramdesktop/tdesktop/dev • 4f8cd5d • 2 files, +2/-2
Update submodules.
telegramdesktop/tdesktop/dev • baef81d • 8 files, +46/-13
Fix admin log section.
#tdesktop
Added ability to select text in marquee label.
telegramdesktop/tdesktop/dev • 4251092 • 2 files, +14/-1
Added stop of marquee label scrolling for inactive window.
telegramdesktop/tdesktop/dev • 1b906a3 • 2 files, +39/-0
Added selection clearing on click outside marquee label.
telegramdesktop/tdesktop/dev • 4f8cd5d • 2 files, +2/-2
Update submodules.
telegramdesktop/tdesktop/dev • baef81d • 8 files, +46/-13
Fix admin log section.
#tdesktop
🫡3
New telegramdesktop/tdesktop release:
- Show who reacted preview next to the cursor.
- Improve restoring of opened windows and chats on relaunch.
- Don't hide content from screenshots while the app is passcode-locked.
- Fix saving of words with the system spellchecker.
- Fix sorting of unmuted unread chats in folders.
- Fix quote staying above the field after sending a message.
- Fix some WEB proxies not working on Windows.
- Warn about possible risks when adding a WEB proxy.
- Crash fixes.
#tdesktop
v7.1.2 (stable)- Show who reacted preview next to the cursor.
- Improve restoring of opened windows and chats on relaunch.
- Don't hide content from screenshots while the app is passcode-locked.
- Fix saving of words with the system spellchecker.
- Fix sorting of unmuted unread chats in folders.
- Fix quote staying above the field after sending a message.
- Fix some WEB proxies not working on Windows.
- Warn about possible risks when adding a WEB proxy.
- Crash fixes.
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • 9f9e3f7 • 1 files, +2/-2
Fix build with Qt 5.
telegramdesktop/tdesktop/dev • 3772337 • 6 files, +27/-15
Version 7.1.2.
- Show who reacted preview next to the cursor.
- Improve restoring of opened windows and chats on relaunch.
- Don't hide content from screenshots while the app
is passcode-locked.
- Fix saving of words with the system spellchecker.
- Fix sorting of unmuted unread chats in folders.
- Fix quote staying above the field after sending a message.
- Fix some WEB proxies not working on Windows.
- Warn about possible risks when adding a WEB proxy.
- Crash fixes.
#tdesktop
Fix build with Qt 5.
telegramdesktop/tdesktop/dev • 3772337 • 6 files, +27/-15
Version 7.1.2.
- Show who reacted preview next to the cursor.
- Improve restoring of opened windows and chats on relaunch.
- Don't hide content from screenshots while the app
is passcode-locked.
- Fix saving of words with the system spellchecker.
- Fix sorting of unmuted unread chats in folders.
- Fix quote staying above the field after sending a message.
- Fix some WEB proxies not working on Windows.
- Warn about possible risks when adding a WEB proxy.
- Crash fixes.
#tdesktop
🫡3
Assets for release
• Source code (tar.gz, full)
• Windows on ARM: Portable
• Windows 64 bit: Portable
• Windows 32 bit: Portable
• Windows on ARM: Installer
• Windows 64 bit: Installer
• macOS 10.13+: Installer
• Windows 32 bit: Installer
• Linux 64 bit: Binary
#tdesktop
v7.1.2 of telegramdesktop/tdesktop:• Source code (tar.gz, full)
• Windows on ARM: Portable
• Windows 64 bit: Portable
• Windows 32 bit: Portable
• Windows on ARM: Installer
• Windows 64 bit: Installer
• macOS 10.13+: Installer
• Windows 32 bit: Installer
• Linux 64 bit: Binary
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • d33839d • 3 files, +0/-0
Delete unused account_check icon rasters
Task: 2026/08/18/delete-orphaned-account-check-icon
telegramdesktop/tdesktop/public-canary • fa5df57 • 2 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-canary • 96cc309 • 1 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-canary • 77449fe • 2 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-canary • 22129a7 • 2 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-canary • aa88215 • 1 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-canary • 4e4eab3 • 1 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-canary • 38cd539 • 5 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-canary • 06488a9 • 7 files, +40/-56
Tie stored pinned index writes to the pinned flag
Task: 2026/08/19/unify-pinned-index-writers
telegramdesktop/tdesktop/public-canary • 12cc6d0 • 2 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-canary • a7ea40e • 2 files, +5/-2
Give a saved sublist its own pinned message list
Task: 2026/08/19/make-saved-sublist-pinned-bar-read-one-list
#tdesktop
Delete unused account_check icon rasters
Task: 2026/08/18/delete-orphaned-account-check-icon
telegramdesktop/tdesktop/public-canary • fa5df57 • 2 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-canary • 96cc309 • 1 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-canary • 77449fe • 2 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-canary • 22129a7 • 2 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-canary • aa88215 • 1 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-canary • 4e4eab3 • 1 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-canary • 38cd539 • 5 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-canary • 06488a9 • 7 files, +40/-56
Tie stored pinned index writes to the pinned flag
Task: 2026/08/19/unify-pinned-index-writers
telegramdesktop/tdesktop/public-canary • 12cc6d0 • 2 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-canary • a7ea40e • 2 files, +5/-2
Give a saved sublist its own pinned message list
Task: 2026/08/19/make-saved-sublist-pinned-bar-read-one-list
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • 5cc1b1d • 1 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-canary • 2c3422a • 5 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-canary • 5a81401 • 1 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-canary • 5f8c63f • 1 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-canary • 3b96e2e • 2 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-canary • e430baf • 2 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-canary • f26b514 • 1 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-canary • 4304658 • 1 files, +2/-8
Use the shared sublist resolver in the player panel
Task: 2026/08/20/collapse-player-panel-sublist-onto-shared-resolver
telegramdesktop/tdesktop/public-canary • c83c888 • 4 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-canary • 334fbd8 • 6 files, +21/-10
Open a saved sublist's own shared media page
Task: 2026/08/20/open-saved-sublist-own-info-media-page
#tdesktop
Retire shared media of a deleted topic with no object
Task: 2026/08/20/retire-forum-media-lists-without-topic-objects
telegramdesktop/tdesktop/public-canary • 2c3422a • 5 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-canary • 5a81401 • 1 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-canary • 5f8c63f • 1 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-canary • 3b96e2e • 2 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-canary • e430baf • 2 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-canary • f26b514 • 1 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-canary • 4304658 • 1 files, +2/-8
Use the shared sublist resolver in the player panel
Task: 2026/08/20/collapse-player-panel-sublist-onto-shared-resolver
telegramdesktop/tdesktop/public-canary • c83c888 • 4 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-canary • 334fbd8 • 6 files, +21/-10
Open a saved sublist's own shared media page
Task: 2026/08/20/open-saved-sublist-own-info-media-page
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • 0bd680a • 9 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-canary • 7328cbe • 4 files, +55/-3
Keep Info pages on their topic or sublist
Task: 2026/08/21/preserve-info-thread-identity-and-lifetime
telegramdesktop/tdesktop/public-canary • f9a8011 • 1 files, +12/-10
Tear down Info after a sublist is destroyed
Task: 2026/08/21/preserve-info-thread-identity-and-lifetime
telegramdesktop/tdesktop/public-canary • 1d37f55 • 1 files, +14/-12
Clear Info immediately when its sublist dies
Task: 2026/08/21/preserve-info-thread-identity-and-lifetime
telegramdesktop/tdesktop/public-canary • 7354250 • 1 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-canary • 1982904 • 6 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-canary • dd6e444 • 3 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-canary • b8e8154 • 2 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-canary • 6078ca8 • 2 files, +17/-14
Queue Info wrap teardown off sublist destroyed()
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
telegramdesktop/tdesktop/public-canary • d46d78b • 3 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-canary • 735e453 • 2 files, +15/-18
Preserve teardown stream across Info wrap removal
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
#tdesktop
Align sublist media count, query and window keys
Task: 2026/08/21/align-sublist-media-count-query-and-window-keys
telegramdesktop/tdesktop/public-canary • 7328cbe • 4 files, +55/-3
Keep Info pages on their topic or sublist
Task: 2026/08/21/preserve-info-thread-identity-and-lifetime
telegramdesktop/tdesktop/public-canary • f9a8011 • 1 files, +12/-10
Tear down Info after a sublist is destroyed
Task: 2026/08/21/preserve-info-thread-identity-and-lifetime
telegramdesktop/tdesktop/public-canary • 1d37f55 • 1 files, +14/-12
Clear Info immediately when its sublist dies
Task: 2026/08/21/preserve-info-thread-identity-and-lifetime
telegramdesktop/tdesktop/public-canary • 7354250 • 1 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-canary • 1982904 • 6 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-canary • dd6e444 • 3 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-canary • b8e8154 • 2 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-canary • 6078ca8 • 2 files, +17/-14
Queue Info wrap teardown off sublist destroyed()
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
telegramdesktop/tdesktop/public-canary • d46d78b • 3 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-canary • 735e453 • 2 files, +15/-18
Preserve teardown stream across Info wrap removal
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • e6f76c2 • 1 files, +0/-1
Remove stale Info teardown implementation note
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
telegramdesktop/tdesktop/public-canary • c0483ec • 1 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-canary • ead9ecb • 4 files, +39/-20
Align sublist media counts, windows and titles
Task: 2026/08/21/align-sublist-media-count-window-and-title
telegramdesktop/tdesktop/public-canary • 2ba1369 • 1 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-canary • 09246a6 • 4 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-canary • 9132e63 • 3 files, +26/-7
[ai] Refuse implausible test watchdog values
Task: 2026/08/23/refuse-implausible-test-watchdog-values
telegramdesktop/tdesktop/public-canary • daa4d1d • 1 files, +2/-2
Limit media topic context to forum chats
telegramdesktop/tdesktop/public-canary • 4051044 • 4 files, +7/-0
Add public keys for canary channel.
telegramdesktop/tdesktop/public-canary • 2ffa98f • 9 files, +1279/-0
Add v2 update verification core and build channels
telegramdesktop/tdesktop/public-canary • df97103 • 3 files, +672/-0
Support v2 channel packing in the Packer
telegramdesktop/tdesktop/public-canary • b5addae • 7 files, +662/-141
Verify, fetch and install v2 updates in the client
telegramdesktop/tdesktop/public-canary • 5f51959 • 2 files, +9/-1
Show canary version and skip changelogs on canary
#tdesktop
Remove stale Info teardown implementation note
Task: 2026/08/21/resubscribe-info-wrap-teardown-on-replaced-sublist
telegramdesktop/tdesktop/public-canary • c0483ec • 1 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-canary • ead9ecb • 4 files, +39/-20
Align sublist media counts, windows and titles
Task: 2026/08/21/align-sublist-media-count-window-and-title
telegramdesktop/tdesktop/public-canary • 2ba1369 • 1 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-canary • 09246a6 • 4 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-canary • 9132e63 • 3 files, +26/-7
[ai] Refuse implausible test watchdog values
Task: 2026/08/23/refuse-implausible-test-watchdog-values
telegramdesktop/tdesktop/public-canary • daa4d1d • 1 files, +2/-2
Limit media topic context to forum chats
telegramdesktop/tdesktop/public-canary • 4051044 • 4 files, +7/-0
Add public keys for canary channel.
telegramdesktop/tdesktop/public-canary • 2ffa98f • 9 files, +1279/-0
Add v2 update verification core and build channels
telegramdesktop/tdesktop/public-canary • df97103 • 3 files, +672/-0
Support v2 channel packing in the Packer
telegramdesktop/tdesktop/public-canary • b5addae • 7 files, +662/-141
Verify, fetch and install v2 updates in the client
telegramdesktop/tdesktop/public-canary • 5f51959 • 2 files, +9/-1
Show canary version and skip changelogs on canary
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • fa45227 • 2 files, +821/-0
Add focused tests for v2 update verification
telegramdesktop/tdesktop/public-canary • b1bcf90 • 1 files, +862/-0
Add canary build and publish workflow
telegramdesktop/tdesktop/public-canary • 0c2c351 • 1 files, +186/-163
Build one canary lane per repository in CI
telegramdesktop/tdesktop/public-canary • 726fcf8 • 3 files, +31/-13
Use readable v2 update file names
telegramdesktop/tdesktop/public-canary • ad60192 • 4 files, +117/-8
Use new update names and pinned Bot API image in CI
telegramdesktop/tdesktop/public-canary • 23287bd • 3 files, +108/-62
Ship per-arch mac updates with a universal installer
telegramdesktop/tdesktop/public-canary • 6181c83 • 1 files, +70/-28
Publish portable archives as canary first installs
telegramdesktop/tdesktop/public-canary • 26e8509 • 1 files, +5/-4
Drop the bundled d3d compiler from canary builds
telegramdesktop/tdesktop/public-canary • 6bd9508 • 3 files, +41/-4
Embed external and local signatures in one packer pass
telegramdesktop/tdesktop/public-canary • 10b552c • 2 files, +82/-3
Add a v2 update switch to the release build scripts
telegramdesktop/tdesktop/public-canary • ec35045 • 1 files, +29/-1
Read the pinned metadata through the local Bot API
telegramdesktop/tdesktop/public-canary • a7be4f6 • 3 files, +25/-1
Support v2 updates in the updater and deploy scripts
telegramdesktop/tdesktop/public-canary • c7bebf3 • 23 files, +872/-216
Harden canary builds running.
#tdesktop
Add focused tests for v2 update verification
telegramdesktop/tdesktop/public-canary • b1bcf90 • 1 files, +862/-0
Add canary build and publish workflow
telegramdesktop/tdesktop/public-canary • 0c2c351 • 1 files, +186/-163
Build one canary lane per repository in CI
telegramdesktop/tdesktop/public-canary • 726fcf8 • 3 files, +31/-13
Use readable v2 update file names
telegramdesktop/tdesktop/public-canary • ad60192 • 4 files, +117/-8
Use new update names and pinned Bot API image in CI
telegramdesktop/tdesktop/public-canary • 23287bd • 3 files, +108/-62
Ship per-arch mac updates with a universal installer
telegramdesktop/tdesktop/public-canary • 6181c83 • 1 files, +70/-28
Publish portable archives as canary first installs
telegramdesktop/tdesktop/public-canary • 26e8509 • 1 files, +5/-4
Drop the bundled d3d compiler from canary builds
telegramdesktop/tdesktop/public-canary • 6bd9508 • 3 files, +41/-4
Embed external and local signatures in one packer pass
telegramdesktop/tdesktop/public-canary • 10b552c • 2 files, +82/-3
Add a v2 update switch to the release build scripts
telegramdesktop/tdesktop/public-canary • ec35045 • 1 files, +29/-1
Read the pinned metadata through the local Bot API
telegramdesktop/tdesktop/public-canary • a7be4f6 • 3 files, +25/-1
Support v2 updates in the updater and deploy scripts
telegramdesktop/tdesktop/public-canary • c7bebf3 • 23 files, +872/-216
Harden canary builds running.
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • fd5fe9a • 4 files, +20/-10
Fix build for Release.
telegramdesktop/tdesktop/public-canary • 15f2bd6 • 2 files, +68/-21
Try to fix signing.
telegramdesktop/tdesktop/public-canary • 8c74afe • 1 files, +77/-5
Improve caching.
telegramdesktop/tdesktop/public-canary • 69b6ab5 • 1 files, +17/-5
Try to fix signing again.
telegramdesktop/tdesktop/public-canary • 2078eec • 10 files, +598/-311
New names, separate publishing.
telegramdesktop/tdesktop/public-canary • a460e66 • 7 files, +255/-6
Fix translocated launch on macOS.
telegramdesktop/tdesktop/public-canary • 1fc6430 • 4 files, +32/-14
Improve version display for canary.
telegramdesktop/tdesktop/public-canary • 417b0fa • 1 files, +141/-40
Split macOS canary build into per-arch jobs.
telegramdesktop/tdesktop/public-canary • 08bf1b2 • 7 files, +198/-3
Add an in-title CANARY/PRIVATE marking.
telegramdesktop/tdesktop/public-canary • 0eee269 • 6 files, +42/-24
Rename canary branches.
telegramdesktop/tdesktop/public-canary • 2c1217f • 1 files, +3/-0
Fixed per-arch build picking universal crashpad handler.
telegramdesktop/tdesktop/public-canary • 61f8464 • 1 files, +11/-4
Keep TelegramForcePortable in portable archives.
telegramdesktop/tdesktop/public-canary • 6f655bb • 1 files, +11/-11
Allow CANARY_ALLOW_UNSIGNED in public lane too.
#tdesktop
Fix build for Release.
telegramdesktop/tdesktop/public-canary • 15f2bd6 • 2 files, +68/-21
Try to fix signing.
telegramdesktop/tdesktop/public-canary • 8c74afe • 1 files, +77/-5
Improve caching.
telegramdesktop/tdesktop/public-canary • 69b6ab5 • 1 files, +17/-5
Try to fix signing again.
telegramdesktop/tdesktop/public-canary • 2078eec • 10 files, +598/-311
New names, separate publishing.
telegramdesktop/tdesktop/public-canary • a460e66 • 7 files, +255/-6
Fix translocated launch on macOS.
telegramdesktop/tdesktop/public-canary • 1fc6430 • 4 files, +32/-14
Improve version display for canary.
telegramdesktop/tdesktop/public-canary • 417b0fa • 1 files, +141/-40
Split macOS canary build into per-arch jobs.
telegramdesktop/tdesktop/public-canary • 08bf1b2 • 7 files, +198/-3
Add an in-title CANARY/PRIVATE marking.
telegramdesktop/tdesktop/public-canary • 0eee269 • 6 files, +42/-24
Rename canary branches.
telegramdesktop/tdesktop/public-canary • 2c1217f • 1 files, +3/-0
Fixed per-arch build picking universal crashpad handler.
telegramdesktop/tdesktop/public-canary • 61f8464 • 1 files, +11/-4
Keep TelegramForcePortable in portable archives.
telegramdesktop/tdesktop/public-canary • 6f655bb • 1 files, +11/-11
Allow CANARY_ALLOW_UNSIGNED in public lane too.
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • 835582c • 1 files, +38/-3
Try workaround clone problems.
telegramdesktop/tdesktop/public-canary • ee67730 • 1 files, +25/-19
Fix build with GCC.
telegramdesktop/tdesktop/public-canary • 88c10ec • 2 files, +36/-19
Fix public publishing.
telegramdesktop/tdesktop/public-canary • 2df2857 • 1 files, +1/-1
Removed stale comment about swscale destination format caching.
telegramdesktop/tdesktop/public-canary • c62c974 • 1 files, +5/-0
Restricted transcode temp directory permissions to user.
Related commit: 0807483acc.
telegramdesktop/tdesktop/public-canary • 058e308 • 2 files, +26/-6
Extracted video editor layer showing to shared helper.
telegramdesktop/tdesktop/public-canary • ef9a562 • 1 files, +26/-10
Extracted shared video encoder setup from H264 encoder.
telegramdesktop/tdesktop/public-canary • 7181050 • 2 files, +7/-3
Added VP9 encoder and webm muxer to ffmpeg build configs.
telegramdesktop/tdesktop/public-canary • bb74f57 • 2 files, +150/-20
Added webm sticker output mode to video encoder.
telegramdesktop/tdesktop/public-canary • 0396884 • 7 files, +332/-69
Added adapting video stickers into custom emoji.
Related commit: 9895e5bb89.
telegramdesktop/tdesktop/public-canary • 51bbbf9 • 1 files, +6/-6
Keep canary artifacts for seven days
#tdesktop
Try workaround clone problems.
telegramdesktop/tdesktop/public-canary • ee67730 • 1 files, +25/-19
Fix build with GCC.
telegramdesktop/tdesktop/public-canary • 88c10ec • 2 files, +36/-19
Fix public publishing.
telegramdesktop/tdesktop/public-canary • 2df2857 • 1 files, +1/-1
Removed stale comment about swscale destination format caching.
telegramdesktop/tdesktop/public-canary • c62c974 • 1 files, +5/-0
Restricted transcode temp directory permissions to user.
Related commit: 0807483acc.
telegramdesktop/tdesktop/public-canary • 058e308 • 2 files, +26/-6
Extracted video editor layer showing to shared helper.
telegramdesktop/tdesktop/public-canary • ef9a562 • 1 files, +26/-10
Extracted shared video encoder setup from H264 encoder.
telegramdesktop/tdesktop/public-canary • 7181050 • 2 files, +7/-3
Added VP9 encoder and webm muxer to ffmpeg build configs.
telegramdesktop/tdesktop/public-canary • bb74f57 • 2 files, +150/-20
Added webm sticker output mode to video encoder.
telegramdesktop/tdesktop/public-canary • 0396884 • 7 files, +332/-69
Added adapting video stickers into custom emoji.
Related commit: 9895e5bb89.
telegramdesktop/tdesktop/public-canary • 51bbbf9 • 1 files, +6/-6
Keep canary artifacts for seven days
#tdesktop
🫡3
telegramdesktop/tdesktop/public-canary • ad80ea0 • 4 files, +247/-106
Moved out corner status from view gif to separated module.
telegramdesktop/tdesktop/public-canary • a6711d5 • 5 files, +169/-71
Moved out video message seek ring from view gif to separated module.
telegramdesktop/tdesktop/public-canary • 654e168 • 5 files, +205/-46
Added seek ring with handle to paused video messages.
telegramdesktop/tdesktop/public-canary • e8c7b4d • 4 files, +101/-15
Added frame preview while seeking in video messages.
telegramdesktop/tdesktop/public-canary • a1ef6db • 8 files, +1143/-14
[iv-editor] Added slash menu with list of insertable blocks.
telegramdesktop/tdesktop/public-canary • 90ca5b3 • 2 files, +24/-1
[iv-editor] Added caret restore after inline button and formula edit.
Related commits: 3cb72867d6, 6b970dfee9.
telegramdesktop/tdesktop/public-canary • d2427e8 • 2 files, +68/-5
[iv-editor] Added restore of trimmed spaces on inline field commit.
Related commit: 4ddd36665b.
telegramdesktop/tdesktop/public-canary • 533144c • 1 files, +1/-1
Fixed macOS libraries prune dropping pkg-config files for FFmpeg build.
#tdesktop
Moved out corner status from view gif to separated module.
telegramdesktop/tdesktop/public-canary • a6711d5 • 5 files, +169/-71
Moved out video message seek ring from view gif to separated module.
telegramdesktop/tdesktop/public-canary • 654e168 • 5 files, +205/-46
Added seek ring with handle to paused video messages.
telegramdesktop/tdesktop/public-canary • e8c7b4d • 4 files, +101/-15
Added frame preview while seeking in video messages.
telegramdesktop/tdesktop/public-canary • a1ef6db • 8 files, +1143/-14
[iv-editor] Added slash menu with list of insertable blocks.
telegramdesktop/tdesktop/public-canary • 90ca5b3 • 2 files, +24/-1
[iv-editor] Added caret restore after inline button and formula edit.
Related commits: 3cb72867d6, 6b970dfee9.
telegramdesktop/tdesktop/public-canary • d2427e8 • 2 files, +68/-5
[iv-editor] Added restore of trimmed spaces on inline field commit.
Related commit: 4ddd36665b.
telegramdesktop/tdesktop/public-canary • 533144c • 1 files, +1/-1
Fixed macOS libraries prune dropping pkg-config files for FFmpeg build.
#tdesktop
🫡3
UnigramDev/Unigram/scroll-anchoring • bc2b6b8 • 8 files, +465/-168
Anchor the message list per mutation instead of a global scroll mode
#unigram
Anchor the message list per mutation instead of a global scroll mode
#unigram
UnigramDev/Unigram/develop • 25eb8e1 • 1 files, +5/-5
Gate paste as formatted text behind Ctrl+Shift+V
UnigramDev/Unigram/develop • fd67a47 • 1 files, +1/-1
Fix theme glitch when opening search
UnigramDev/Unigram/develop • aeb5c55 • 1 files, +2/-5
Fix mouse over in send files popup
UnigramDev/Unigram/develop • c3bd993 • 1 files, +2/-2
Hide "delete for both" if chat is empty
UnigramDev/Unigram/develop • 3be2d33 • 1 files, +3/-3
Pass zero instead of original size
UnigramDev/Unigram/develop • d593017 • 1 files, +2/-1
Give a solid background to WindowPresenter
UnigramDev/Unigram/develop • fd98e5f • 24 files, +42/-72
Code cleanup and fix build on .NET Native
UnigramDev/Unigram/develop • f04652a • 4 files, +34/-5
Add some asserts to beta
UnigramDev/Unigram/develop • 15a1668 • 1 files, +1/-1
Bump version to 12.10
UnigramDev/Unigram/develop • ea15e76 • 32 files, +51/-38
TEMP: trace LoadMoreItemsAsync
UnigramDev/Unigram/develop • c3106b5 • 1 files, +21/-2
Make .NET 10 debug builds faster
UnigramDev/Unigram/develop • 1ea02a2 • 1 files, +27/-0
Forcefully include missing PDBs
UnigramDev/Unigram/develop • 8ce2e09 • 1 files, +102/-17
Add store builds support to .ps1
UnigramDev/Unigram/develop • e05117f • 1 files, +7/-0
Add flag to enable instrumentation
#unigram
Gate paste as formatted text behind Ctrl+Shift+V
UnigramDev/Unigram/develop • fd67a47 • 1 files, +1/-1
Fix theme glitch when opening search
UnigramDev/Unigram/develop • aeb5c55 • 1 files, +2/-5
Fix mouse over in send files popup
UnigramDev/Unigram/develop • c3bd993 • 1 files, +2/-2
Hide "delete for both" if chat is empty
UnigramDev/Unigram/develop • 3be2d33 • 1 files, +3/-3
Pass zero instead of original size
UnigramDev/Unigram/develop • d593017 • 1 files, +2/-1
Give a solid background to WindowPresenter
UnigramDev/Unigram/develop • fd98e5f • 24 files, +42/-72
Code cleanup and fix build on .NET Native
UnigramDev/Unigram/develop • f04652a • 4 files, +34/-5
Add some asserts to beta
UnigramDev/Unigram/develop • 15a1668 • 1 files, +1/-1
Bump version to 12.10
UnigramDev/Unigram/develop • ea15e76 • 32 files, +51/-38
TEMP: trace LoadMoreItemsAsync
UnigramDev/Unigram/develop • c3106b5 • 1 files, +21/-2
Make .NET 10 debug builds faster
UnigramDev/Unigram/develop • 1ea02a2 • 1 files, +27/-0
Forcefully include missing PDBs
UnigramDev/Unigram/develop • 8ce2e09 • 1 files, +102/-17
Add store builds support to .ps1
UnigramDev/Unigram/develop • e05117f • 1 files, +7/-0
Add flag to enable instrumentation
#unigram
DrKLO/Telegram/master • 3c0c32c • 300 files, +0/-241508
remove third_party libs
DrKLO/Telegram/master • 4f25852 • 5 files, +10/-2
add third_party libs as submodules
#android
remove third_party libs
DrKLO/Telegram/master • 4f25852 • 5 files, +10/-2
add third_party libs as submodules
#android
🫡3
telegramdesktop/tdesktop/public-canary • c77db40 • 2 files, +54/-0
Added cache of participant ban state to chat participants API.
telegramdesktop/tdesktop/public-canary • aba9242 • 2 files, +53/-0
Added ban and unban of monoforum peer to sublist menus.
telegramdesktop/tdesktop/public-canary • 5005a0c • 3 files, +25/-0
[thanos] Fixed lost collapse animation on delete in new chat view.
telegramdesktop/tdesktop/public-canary • 100460b • 1 files, +21/-0
[thanos] Moved collapse gaps with content in history view list widget.
telegramdesktop/tdesktop/public-canary • cb8e320 • 1 files, +3/-0
[thanos] Added scroll pin after list resize during collapse.
telegramdesktop/tdesktop/public-canary • e93fe9e • 1 files, +1/-1
[thanos] Replaced direct scroll with syntetic one during collapse.
telegramdesktop/tdesktop/public-canary • f29c9b6 • 3 files, +8/-1
[thanos] Fixed lost collapse for all but first of deleted messages.
telegramdesktop/tdesktop/public-canary • 6c5e79a • 4 files, +75/-43
[thanos] Replaced assumed collapse gap height with measured one.
telegramdesktop/tdesktop/public-canary • cc37468 • 1 files, +20/-1
Fixed rich paste toast offering editor for plain text lists.
Related commit: 98591aa959.
telegramdesktop/tdesktop/public-canary • f6bc1ef • 1 files, +29/-0
Fixed missing ATL breaking breakpad build in canary Windows job.
#tdesktop
Added cache of participant ban state to chat participants API.
telegramdesktop/tdesktop/public-canary • aba9242 • 2 files, +53/-0
Added ban and unban of monoforum peer to sublist menus.
telegramdesktop/tdesktop/public-canary • 5005a0c • 3 files, +25/-0
[thanos] Fixed lost collapse animation on delete in new chat view.
telegramdesktop/tdesktop/public-canary • 100460b • 1 files, +21/-0
[thanos] Moved collapse gaps with content in history view list widget.
telegramdesktop/tdesktop/public-canary • cb8e320 • 1 files, +3/-0
[thanos] Added scroll pin after list resize during collapse.
telegramdesktop/tdesktop/public-canary • e93fe9e • 1 files, +1/-1
[thanos] Replaced direct scroll with syntetic one during collapse.
telegramdesktop/tdesktop/public-canary • f29c9b6 • 3 files, +8/-1
[thanos] Fixed lost collapse for all but first of deleted messages.
telegramdesktop/tdesktop/public-canary • 6c5e79a • 4 files, +75/-43
[thanos] Replaced assumed collapse gap height with measured one.
telegramdesktop/tdesktop/public-canary • cc37468 • 1 files, +20/-1
Fixed rich paste toast offering editor for plain text lists.
Related commit: 98591aa959.
telegramdesktop/tdesktop/public-canary • f6bc1ef • 1 files, +29/-0
Fixed missing ATL breaking breakpad build in canary Windows job.
#tdesktop
🫡3
🫡3
morethanwords/tweb/master • b6d3b05 • 10 files, +281/-15
Support chat-specific hashtag and cashtag search
morethanwords/tweb/master • 293cb45 • 8 files, +233/-9
Stop a stalled spoiler renderer from bricking a chat
A chat with a media spoiler in it could become permanently impossible to open:
the container went active but the topbar and input kept their `hide` class, the
bubbles stayed in a detached `chatInner`, and nothing was logged anywhere.
The chain started at the shader fetch. `DotRendererCore.shaderTexts[url] ??= fetch(url)`
memoized the request forever, so once it stalled every later attempt inherited the
same dead promise; `init()` memoized its failure the same way. The worker only posts
`media-inited` after `init()` resolves, so `DotRenderer.mediaWorkerReady` — a static
deferred, with `mediaInited` latched true and no retry — stayed pending for the rest
of the session. `wrapMediaSpoiler` awaits it, so that bubble's render promise never
settled, and `processBatch`'s `Promise.all(...).catch(noop)` waited on it forever:
`.catch` covers a rejection, never an answer that simply does not arrive. Behind it
queued `performHistoryResult` and then `Chat.setPeerPromise`, and `setPeer`'s early
return on a pending `setPeerPromise` turned every retry into a silent no-op.
Bound each step so no single stuck promise can latch permanently:
* never memoize a failed shader fetch or a failed `init()`, and give the fetch a
timeout, so the next spoiler retries instead of inheriting a dead promise
* give up on the worker's `*-inited` answer after a deadline: resolve the deferred
(the spoiler degrades to its blurred thumbnail, which still covers the media) and
unlatch `*Inited` so the next spoiler re-sends the init
* bound `wrapMediaSpoiler`'s wait on the dot canvas — it is decoration on top of an
already-covering thumbnail and must never hold up the message batch
* bound the batch's media `Promise.all`; the bubbles are already built, so at worst
some media finishes loading after mount instead of before it
* expire the in-flight peer-change dedupe, so an abandoned change stops swallowing
every attempt to reopen the chat
Also fixes a null deref in `replaceSharedMediaTab`, which threw on `tab.container`
when both the previous tab and the new one were undefined, aborting the peer change
that called it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
morethanwords/tweb/master • 12fbb85 • 2 files, +119/-2
Isolate fastRaf callbacks so one throw cannot poison the batch
Callbacks batched into a single frame are unrelated to each other, but `fastRaf`
ran them with a bare `forEach`, so the first one to throw cancelled every callback
queued behind it. `fastRafPromise` resolves from a callback queued in exactly that
way and caches its promise in a module-level variable that is only cleared once the
promise resolves — losing that resolve leaves it pending forever, and every later
`fastRafPromise()` hands out the same dead promise. Awaiting one is enough to park
a render path for the lifetime of the tab, silently.
`fastRafConventional` had the same hazard with an extra edge: a throw escaping its
loop also left the queue non-empty and `processing` stuck true, degrading every
later call to synchronous execution.
Run each callback in isolation and log what it threw, so a broken callback fails
alone instead of taking the frame's other work with it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#webk
Support chat-specific hashtag and cashtag search
morethanwords/tweb/master • 293cb45 • 8 files, +233/-9
Stop a stalled spoiler renderer from bricking a chat
A chat with a media spoiler in it could become permanently impossible to open:
the container went active but the topbar and input kept their `hide` class, the
bubbles stayed in a detached `chatInner`, and nothing was logged anywhere.
The chain started at the shader fetch. `DotRendererCore.shaderTexts[url] ??= fetch(url)`
memoized the request forever, so once it stalled every later attempt inherited the
same dead promise; `init()` memoized its failure the same way. The worker only posts
`media-inited` after `init()` resolves, so `DotRenderer.mediaWorkerReady` — a static
deferred, with `mediaInited` latched true and no retry — stayed pending for the rest
of the session. `wrapMediaSpoiler` awaits it, so that bubble's render promise never
settled, and `processBatch`'s `Promise.all(...).catch(noop)` waited on it forever:
`.catch` covers a rejection, never an answer that simply does not arrive. Behind it
queued `performHistoryResult` and then `Chat.setPeerPromise`, and `setPeer`'s early
return on a pending `setPeerPromise` turned every retry into a silent no-op.
Bound each step so no single stuck promise can latch permanently:
* never memoize a failed shader fetch or a failed `init()`, and give the fetch a
timeout, so the next spoiler retries instead of inheriting a dead promise
* give up on the worker's `*-inited` answer after a deadline: resolve the deferred
(the spoiler degrades to its blurred thumbnail, which still covers the media) and
unlatch `*Inited` so the next spoiler re-sends the init
* bound `wrapMediaSpoiler`'s wait on the dot canvas — it is decoration on top of an
already-covering thumbnail and must never hold up the message batch
* bound the batch's media `Promise.all`; the bubbles are already built, so at worst
some media finishes loading after mount instead of before it
* expire the in-flight peer-change dedupe, so an abandoned change stops swallowing
every attempt to reopen the chat
Also fixes a null deref in `replaceSharedMediaTab`, which threw on `tab.container`
when both the previous tab and the new one were undefined, aborting the peer change
that called it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
morethanwords/tweb/master • 12fbb85 • 2 files, +119/-2
Isolate fastRaf callbacks so one throw cannot poison the batch
Callbacks batched into a single frame are unrelated to each other, but `fastRaf`
ran them with a bare `forEach`, so the first one to throw cancelled every callback
queued behind it. `fastRafPromise` resolves from a callback queued in exactly that
way and caches its promise in a module-level variable that is only cleared once the
promise resolves — losing that resolve leaves it pending forever, and every later
`fastRafPromise()` hands out the same dead promise. Awaiting one is enough to park
a render path for the lifetime of the tab, silently.
`fastRafConventional` had the same hazard with an extra edge: a throw escaping its
loop also left the queue non-empty and `processing` stuck true, degrading every
later call to synchronous execution.
Run each callback in isolation and log what it threw, so a broken callback fails
alone instead of taking the frame's other work with it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#webk
🫡3
morethanwords/tweb/master • 1271882 • 1 files, +8/-8
Stop a read receipt from leaving two check marks on one message
An outgoing message in a group could end up rendering its sent and its read
status side by side — "18:11 ✓✓ ✓" — with the thread reply counter that used to
sit next to them gone.
setBubbleSendingStatus asked whether a status was already there with a
descendant query (`element.querySelector('.time-sending-status')`) but then
wrote over `element.firstElementChild`, which is only the same node while
nothing has been prepended in front of it. setBubbleRepliesCount prepends
exactly there: a message that gains its first thread reply after its bubble was
rendered gets `.time-replies` pushed ahead of the status. The next status change
— the read receipt — then replaced the counter instead of the old icon, and the
old icon stayed. Both carry `order: 5` against the time's `0`, so they line up
after the time in DOM order, newest first. The `!status` branch had the mirror
of the same bug: it removed the first child and left the status alone.
The two lookups now name the node they intend to touch, so a status replaces a
status and a missing one is prepended. setBubbleRepliesCount gets the same
direct-child scope: once the status bug had eaten the outer `.time`'s counter,
its descendant query found the copy inside `.time-inner`, concluded the counter
was already mounted and never restored it — leaving the hidden spacer that
reserves the footer's width one element short of what is drawn.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
morethanwords/tweb/master • a5a90e7 • 4 files, +64/-2
Keep tag search input focused
#webk
Stop a read receipt from leaving two check marks on one message
An outgoing message in a group could end up rendering its sent and its read
status side by side — "18:11 ✓✓ ✓" — with the thread reply counter that used to
sit next to them gone.
setBubbleSendingStatus asked whether a status was already there with a
descendant query (`element.querySelector('.time-sending-status')`) but then
wrote over `element.firstElementChild`, which is only the same node while
nothing has been prepended in front of it. setBubbleRepliesCount prepends
exactly there: a message that gains its first thread reply after its bubble was
rendered gets `.time-replies` pushed ahead of the status. The next status change
— the read receipt — then replaced the counter instead of the old icon, and the
old icon stayed. Both carry `order: 5` against the time's `0`, so they line up
after the time in DOM order, newest first. The `!status` branch had the mirror
of the same bug: it removed the first child and left the status alone.
The two lookups now name the node they intend to touch, so a status replaces a
status and a missing one is prepended. setBubbleRepliesCount gets the same
direct-child scope: once the status bug had eaten the outer `.time`'s counter,
its descendant query found the copy inside `.time-inner`, concluded the counter
was already mounted and never restored it — leaving the hidden spacer that
reserves the footer's width one element short of what is drawn.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
morethanwords/tweb/master • a5a90e7 • 4 files, +64/-2
Keep tag search input focused
#webk
🫡3
morethanwords/tweb/master • 3501e76 • 11 files, +107/-23
Take a frame's url and height as input rather than at face value
Three values a hosted frame — a mini app, a payment provider, an Instant View
embed — hands the client were used as given.
`path_full` from a `web_app_open_tg_link` event was pasted onto the bare host,
so a value that does not open with a slash landed in the host instead of the
path: '.evil.com/x' built https://t.me.evil.com/x. It walks out of the
registrable domain but not out of the client, because wrapUrl's t.me regexp is
not anchored at its end and matches the result anyway, handing it to the `im`
handler, which reads the parsed path and never the href — so the link opens a
username. Both call sites build it through `getWebViewTgLink` now, which anchors
the path.
`resize_frame` from an Instant View embed set the block height with no ceiling.
The event is the embed's own way of asking for the room its content needs, and
the document that sends it is third party by definition — after a navigation
away, not even the one the block asked for — so the height is capped at four
viewports.
`keyboardButtonUrlAuth.url` reached `window.open()` raw, the one url in the
client that skipped `safeWindowOpen`; the server rejects a non-https button url
today, which is what kept it out of reach. Its local `openWindow` wrapper is
gone. The helper it now shares, meanwhile, repeated wrapUrl's protocol filter
for none of its callers, and most of them pass a url straight off the wire — a
web app event, a gift's listing url, a bot's privacy policy. The filter lives in
`normalizeUrlProtocol` and runs there too, replacing the three hand-rolled
copies of it.
Untouched: the bridge still authorizes an inbound message by WindowProxy
identity alone unless the server asked for `same_origin`, and still answers a
frame it is not bound to at '*'. Binding it by default would break the
cross-origin hops the opt-in exists to permit — a 3DS redirect, an OAuth leg.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#webk
Take a frame's url and height as input rather than at face value
Three values a hosted frame — a mini app, a payment provider, an Instant View
embed — hands the client were used as given.
`path_full` from a `web_app_open_tg_link` event was pasted onto the bare host,
so a value that does not open with a slash landed in the host instead of the
path: '.evil.com/x' built https://t.me.evil.com/x. It walks out of the
registrable domain but not out of the client, because wrapUrl's t.me regexp is
not anchored at its end and matches the result anyway, handing it to the `im`
handler, which reads the parsed path and never the href — so the link opens a
username. Both call sites build it through `getWebViewTgLink` now, which anchors
the path.
`resize_frame` from an Instant View embed set the block height with no ceiling.
The event is the embed's own way of asking for the room its content needs, and
the document that sends it is third party by definition — after a navigation
away, not even the one the block asked for — so the height is capped at four
viewports.
`keyboardButtonUrlAuth.url` reached `window.open()` raw, the one url in the
client that skipped `safeWindowOpen`; the server rejects a non-https button url
today, which is what kept it out of reach. Its local `openWindow` wrapper is
gone. The helper it now shares, meanwhile, repeated wrapUrl's protocol filter
for none of its callers, and most of them pass a url straight off the wire — a
web app event, a gift's listing url, a bot's privacy policy. The filter lives in
`normalizeUrlProtocol` and runs there too, replacing the three hand-rolled
copies of it.
Untouched: the bridge still authorizes an inbound message by WindowProxy
identity alone unless the server asked for `same_origin`, and still answers a
frame it is not bound to at '*'. Binding it by default would break the
cross-origin hops the opt-in exists to permit — a 3DS redirect, an OAuth leg.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#webk
🫡3