Telegram github commits and releases
4.43K subscribers
601 files
21K links
Broadcast from the most important Telegram clients' repositories
Download Telegram
UnigramDev/Unigram/develop • ca20f79 • 3 files, +43/-0
Tell the window context when its window is closed

UnigramDev/Unigram/develop • f370bad • 2 files, +122/-2
Build a signed msixbundle for the Win32 flavour

UnigramDev/Unigram/develop • ffb8ba2 • 1 files, +24/-0
Note the caption's missing system menu

#unigram
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
🫡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
🫡3
New telegramdesktop/tdesktop release: 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
🫡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
🫡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
🫡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
🫡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
🫡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
🫡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
🫡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
🫡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
🫡3
UnigramDev/Unigram/scroll-anchoring • bc2b6b8 • 8 files, +465/-168
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
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
🫡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
🫡3
DrKLO/Telegram/master • 62b56a0 • 46 files, +1122/-612
update to 12.10.1 (7038)

#android
🫡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
🫡3