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
• Windows 32 bit: Installer
#tdesktop
v6.8.4 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
• Windows 32 bit: Installer
#tdesktop
🫡3
UnigramDev/Unigram/develop • 6cb6ff3 • 1 files, +3/-3
Uncomment
UnigramDev/Unigram/develop • 1f0a35e • 5 files, +6/-6
Fix string
UnigramDev/Unigram/develop • 371aeaa • 3 files, +20/-1
Diagnostics
UnigramDev/Unigram/develop • 735c0c1 • 1 files, +1/-1
Update TDLib
UnigramDev/Unigram/develop • c970207 • 4 files, +72/-20
Update profile settings
UnigramDev/Unigram/develop • c794b50 • 3 files, +107/-65
Fix null ref
UnigramDev/Unigram/develop • 9446c4d • 1 files, +9/-0
Slightly move timestamp on stickers
UnigramDev/Unigram/develop • 6526988 • 1 files, +1/-1
Bump version to 12.7.3
UnigramDev/Unigram/develop • b399f28 • 3 files, +76/-1
Button to remove recent hashtags
UnigramDev/Unigram/develop • 6e9900f • 1 files, +1/-1
Fix null ref
UnigramDev/Unigram/develop • da385eb • 1 files, +1/-1
Fix slide in animation
#unigram
Uncomment
UnigramDev/Unigram/develop • 1f0a35e • 5 files, +6/-6
Fix string
UnigramDev/Unigram/develop • 371aeaa • 3 files, +20/-1
Diagnostics
UnigramDev/Unigram/develop • 735c0c1 • 1 files, +1/-1
Update TDLib
UnigramDev/Unigram/develop • c970207 • 4 files, +72/-20
Update profile settings
UnigramDev/Unigram/develop • c794b50 • 3 files, +107/-65
Fix null ref
UnigramDev/Unigram/develop • 9446c4d • 1 files, +9/-0
Slightly move timestamp on stickers
UnigramDev/Unigram/develop • 6526988 • 1 files, +1/-1
Bump version to 12.7.3
UnigramDev/Unigram/develop • b399f28 • 3 files, +76/-1
Button to remove recent hashtags
UnigramDev/Unigram/develop • 6e9900f • 1 files, +1/-1
Fix null ref
UnigramDev/Unigram/develop • da385eb • 1 files, +1/-1
Fix slide in animation
#unigram
🫡2
morethanwords/tweb/master • 5fb922a • 11 files, +992/-54
feat: voice recording panel with live waveform, pause and resume
#webk
feat: voice recording panel with live waveform, pause and resume
#webk
🫡3
morethanwords/tweb/master • f997ae9 • 11 files, +150/-20
feat: gigagroup (broadcast group) support — convert flow + parity gates
Adds the "Convert to Broadcast Group" capability and updates the surrounding
UI/permission checks to treat gigagroups consistently with other Telegram
clients (tdesktop / iOS).
- appChatsManager: isBroadcastGroup() helper + convertToGigagroup() wraps
channels.convertToGigagroup. Mirror on appPeersManager.
- hasRights: gate send_* in gigagroups by post_messages (non-admins blocked,
parallels broadcast channels).
- GroupPermissionsTab: "Broadcast Group" section with two-step confirmation
popup (info bullets -> irreversible warning) shown to creators when member
count is within 1000 of megagroup_size_max.
- editChat: hide Permissions row entirely for gigagroups
(canEditPermissions parity — no per-user restrictions are allowed).
- input: extend "cant post" plate (Join / Mute) to gigagroup members;
placeholder reads "Broadcast" for posting admins.
- Lang + SCSS for the conversion popup + bullet styling.
#webk
feat: gigagroup (broadcast group) support — convert flow + parity gates
Adds the "Convert to Broadcast Group" capability and updates the surrounding
UI/permission checks to treat gigagroups consistently with other Telegram
clients (tdesktop / iOS).
- appChatsManager: isBroadcastGroup() helper + convertToGigagroup() wraps
channels.convertToGigagroup. Mirror on appPeersManager.
- hasRights: gate send_* in gigagroups by post_messages (non-admins blocked,
parallels broadcast channels).
- GroupPermissionsTab: "Broadcast Group" section with two-step confirmation
popup (info bullets -> irreversible warning) shown to creators when member
count is within 1000 of megagroup_size_max.
- editChat: hide Permissions row entirely for gigagroups
(canEditPermissions parity — no per-user restrictions are allowed).
- input: extend "cant post" plate (Join / Mute) to gigagroup members;
placeholder reads "Broadcast" for posting admins.
- Lang + SCSS for the conversion popup + bullet styling.
#webk
🫡3
telegramdesktop/tdesktop/dev • a272f14 • 1 files, +21/-13
Deduplicated top bar suggestion activation by current priority.
telegramdesktop/tdesktop/dev • 595e235 • 3 files, +38/-36
Replaced unconfirmed auth bar text snapshot with producer.
telegramdesktop/tdesktop/dev • 4923db6 • 1 files, +17/-12
Added refresh of unconfirmed auth bar on authorization list changes.
telegramdesktop/tdesktop/dev • 6c7900c • 1 files, +5/-0
Added day rollover detection to top promotion refresh.
telegramdesktop/tdesktop/dev • 504f680 • 3 files, +3/-0
Added day dependency to birthday top bar suggestions.
telegramdesktop/tdesktop/dev • d224484 • 1 files, +12/-0
Added day change re-evaluation to top bar suggestion driver.
telegramdesktop/tdesktop/dev • 577e06f • 2 files, +29/-2
Added per-row highlight registration to shortcuts settings.
telegramdesktop/tdesktop/dev • 5b0d613 • 1 files, +5/-0
Highlighted compose AI apply row when opening shortcut settings.
telegramdesktop/tdesktop/dev • 32e9e73 • 2 files, +15/-0
Added paid media price entry to media viewer dropdown menu.
telegramdesktop/tdesktop/dev • 8ea22f9 • 1 files, +22/-6
Cached currency icon images in credits history rows controller.
telegramdesktop/tdesktop/dev • 137f5a2 • 2 files, +5/-3
Added optional limit parameter to credits history request.
telegramdesktop/tdesktop/dev • 06a138c • 1 files, +30/-4
Added scroll-driven auto load to credits history list controller.
telegramdesktop/tdesktop/dev • 3fb525d • 1 files, +4/-3
Lowered initial credits history page size in settings section.
#tdesktop
Deduplicated top bar suggestion activation by current priority.
telegramdesktop/tdesktop/dev • 595e235 • 3 files, +38/-36
Replaced unconfirmed auth bar text snapshot with producer.
telegramdesktop/tdesktop/dev • 4923db6 • 1 files, +17/-12
Added refresh of unconfirmed auth bar on authorization list changes.
telegramdesktop/tdesktop/dev • 6c7900c • 1 files, +5/-0
Added day rollover detection to top promotion refresh.
telegramdesktop/tdesktop/dev • 504f680 • 3 files, +3/-0
Added day dependency to birthday top bar suggestions.
telegramdesktop/tdesktop/dev • d224484 • 1 files, +12/-0
Added day change re-evaluation to top bar suggestion driver.
telegramdesktop/tdesktop/dev • 577e06f • 2 files, +29/-2
Added per-row highlight registration to shortcuts settings.
telegramdesktop/tdesktop/dev • 5b0d613 • 1 files, +5/-0
Highlighted compose AI apply row when opening shortcut settings.
telegramdesktop/tdesktop/dev • 32e9e73 • 2 files, +15/-0
Added paid media price entry to media viewer dropdown menu.
telegramdesktop/tdesktop/dev • 8ea22f9 • 1 files, +22/-6
Cached currency icon images in credits history rows controller.
telegramdesktop/tdesktop/dev • 137f5a2 • 2 files, +5/-3
Added optional limit parameter to credits history request.
telegramdesktop/tdesktop/dev • 06a138c • 1 files, +30/-4
Added scroll-driven auto load to credits history list controller.
telegramdesktop/tdesktop/dev • 3fb525d • 1 files, +4/-3
Lowered initial credits history page size in settings section.
#tdesktop
🫡3
telegramdesktop/tdesktop/dev • 5b79e1b • 1 files, +11/-0
Added pass of visible region into credits history list controller.
telegramdesktop/tdesktop/dev • 9caf32d • 1 files, +2/-2
Fix possible assertion violation.
#tdesktop
Added pass of visible region into credits history list controller.
telegramdesktop/tdesktop/dev • 9caf32d • 1 files, +2/-2
Fix possible assertion violation.
#tdesktop
🫡3
morethanwords/tweb/master • 01460eb • 16 files, +664/-483
feat: call panel redesign + popup/grid polish
Keep right column resizable when left sidebar floats
Refactor checklist popup to procedural showChecklistPopup
#webk
feat: call panel redesign + popup/grid polish
Keep right column resizable when left sidebar floats
Refactor checklist popup to procedural showChecklistPopup
#webk
🫡4
morethanwords/tweb/master • a728bfa • 13 files, +435/-31
feat: gift privacy settings
Add a "Gifts" entry under Privacy & Security combining:
- "Who can display gifts on my profile" (privacyKeyStarGiftsAutoSave)
with Always/Never Allow exception lists
- "Accepted Gift Types" — five toggles for the disallowed_gifts flags
(limited / unlimited / unique / from channels / premium subscriptions)
- "Show Gift Icon in Chats" — display_gifts_button on GlobalPrivacySettings
- Premium gating on the toggles: non-Premium users see a toast linking to
PopupPremium and the toggle reverts
Render a gift button in the chat input for DMs whose visibility honours
the new privacy: shown only when both sides are users (no bots / self /
service / replies / hidden), Chat type, and either my own or the peer's
display_gifts_button is on AND the peer hasn't disallowed all gift types.
Reconciled through the acknowledged pattern in finishPeerChange — a
modifyAckedPromise wrapper on appPrivacyManager.getGlobalPrivacySettings()
joins the existing userFull acked promise, and a nested callbackify chain
applies visibility synchronously inside the render closure when both
fetches are warm-cached (so the button settles in the same frame as the
rest of the input — no flicker). Cold first-load reveals lazily once both
resolve. Live updates fire on peer_full_update and on a new
global_privacy_update event from setGlobalPrivacySettings.
appPrivacyManager now caches GlobalPrivacySettings (sync return when
present, in-flight Promise reused), preloads it on user_auth, and
invalidates on set — so the acked check almost always resolves cached.
Mirror tdesktop's Mini Apps entry inside Always Allow / Never Allow:
- AddMembersTab gains optional extraCategories + selectedExtras; takeOut
now returns the extra-keys Set alongside peerIds
- Category buttons follow the includedChats pattern (.folder-categories
SettingSection + selector.checkbox()), wired through AppSelectPeers's
data-peer-id delegation
- PrivacySection.allowMiniApps opt-in adds the Mini Apps category,
reads/writes inputPrivacyValueAllow/DisallowBots, and surfaces the
selection in the row subtitle
- getPrivacyRulesDetails returns allowMiniApps / disallowMiniApps
- Privacy-row subtitles transform per tdesktop: Nobody + AllowBots →
"Mini Apps", Everybody + DisallowBots → "Not Mini Apps", Contacts +
AllowBots → "Contacts and Mini Apps"
Privacy exception peer rows now render the round checkbox on the right
(like includedChats) via a new checkboxSide option on AppSelectPeers and
round design for type === 'privacy'.
Also document the no-blocking-on-chat-open rule in CLAUDE.md so future
features don't slip a fresh network round-trip back into the Promise.all.
morethanwords/tweb/master • 00d7be5 • 1 files, +1/-1
fix appSelectPeers checkbox side regression
#webk
feat: gift privacy settings
Add a "Gifts" entry under Privacy & Security combining:
- "Who can display gifts on my profile" (privacyKeyStarGiftsAutoSave)
with Always/Never Allow exception lists
- "Accepted Gift Types" — five toggles for the disallowed_gifts flags
(limited / unlimited / unique / from channels / premium subscriptions)
- "Show Gift Icon in Chats" — display_gifts_button on GlobalPrivacySettings
- Premium gating on the toggles: non-Premium users see a toast linking to
PopupPremium and the toggle reverts
Render a gift button in the chat input for DMs whose visibility honours
the new privacy: shown only when both sides are users (no bots / self /
service / replies / hidden), Chat type, and either my own or the peer's
display_gifts_button is on AND the peer hasn't disallowed all gift types.
Reconciled through the acknowledged pattern in finishPeerChange — a
modifyAckedPromise wrapper on appPrivacyManager.getGlobalPrivacySettings()
joins the existing userFull acked promise, and a nested callbackify chain
applies visibility synchronously inside the render closure when both
fetches are warm-cached (so the button settles in the same frame as the
rest of the input — no flicker). Cold first-load reveals lazily once both
resolve. Live updates fire on peer_full_update and on a new
global_privacy_update event from setGlobalPrivacySettings.
appPrivacyManager now caches GlobalPrivacySettings (sync return when
present, in-flight Promise reused), preloads it on user_auth, and
invalidates on set — so the acked check almost always resolves cached.
Mirror tdesktop's Mini Apps entry inside Always Allow / Never Allow:
- AddMembersTab gains optional extraCategories + selectedExtras; takeOut
now returns the extra-keys Set alongside peerIds
- Category buttons follow the includedChats pattern (.folder-categories
SettingSection + selector.checkbox()), wired through AppSelectPeers's
data-peer-id delegation
- PrivacySection.allowMiniApps opt-in adds the Mini Apps category,
reads/writes inputPrivacyValueAllow/DisallowBots, and surfaces the
selection in the row subtitle
- getPrivacyRulesDetails returns allowMiniApps / disallowMiniApps
- Privacy-row subtitles transform per tdesktop: Nobody + AllowBots →
"Mini Apps", Everybody + DisallowBots → "Not Mini Apps", Contacts +
AllowBots → "Contacts and Mini Apps"
Privacy exception peer rows now render the round checkbox on the right
(like includedChats) via a new checkboxSide option on AppSelectPeers and
round design for type === 'privacy'.
Also document the no-blocking-on-chat-open rule in CLAUDE.md so future
features don't slip a fresh network round-trip back into the Promise.all.
morethanwords/tweb/master • 00d7be5 • 1 files, +1/-1
fix appSelectPeers checkbox side regression
#webk
🫡3
morethanwords/tweb/master • 7163733 • 1 files, +5/-1
fix: hide input gift button when field is non-empty
#webk
fix: hide input gift button when field is non-empty
#webk
🫡3
morethanwords/tweb/master • c4a91e7 • 1 files, +8/-10
Remove useless wrapper
morethanwords/tweb/master • 58f5bde • 1 files, +17/-5
Adjust hover color. Adjust dot position.
morethanwords/tweb/master • 8c43ad4 • 7 files, +75/-55
Refactor PollMessageContent to render without being attached to DOM.
morethanwords/tweb/master • ef101df • 4 files, +48/-7
Hightlight option on context menu
morethanwords/tweb/master • ace43c2 • 7 files, +81/-18
Highlight bubble on internal link processor
morethanwords/tweb/master • 8a84b75 • 3 files, +20/-20
Submit vote instantly on single-select. Show round checkbox instead of
radio.
morethanwords/tweb/master • 79187eb • 1 files, +2/-2
Adjust color.
morethanwords/tweb/master • a185da4 • 1 files, +2/-0
Adjust explanation margins
morethanwords/tweb/master • 26b1381 • 5 files, +164/-65
Refactor poll options handling
morethanwords/tweb/master • d4108ca • 2 files, +3/-3
Adjust avatar sizes for poll message content
morethanwords/tweb/master • ea3438e • 2 files, +62/-61
Make the footer as a button
morethanwords/tweb/master • b2dacef • 3 files, +20/-7
Highlight poll option when clicking on replies too
morethanwords/tweb/master • c2c40ca • 6 files, +31/-21
Optimize unnecessary encoding<->decoding of poll option
morethanwords/tweb/master • 92ff317 • 1 files, +1/-3
Fix poll option uint8array
morethanwords/tweb/master • 91dd96b • 300 files, +17537/-7498
Merge branch 'master' into feature/new-polls
#webk
Remove useless wrapper
morethanwords/tweb/master • 58f5bde • 1 files, +17/-5
Adjust hover color. Adjust dot position.
morethanwords/tweb/master • 8c43ad4 • 7 files, +75/-55
Refactor PollMessageContent to render without being attached to DOM.
morethanwords/tweb/master • ef101df • 4 files, +48/-7
Hightlight option on context menu
morethanwords/tweb/master • ace43c2 • 7 files, +81/-18
Highlight bubble on internal link processor
morethanwords/tweb/master • 8a84b75 • 3 files, +20/-20
Submit vote instantly on single-select. Show round checkbox instead of
radio.
morethanwords/tweb/master • 79187eb • 1 files, +2/-2
Adjust color.
morethanwords/tweb/master • a185da4 • 1 files, +2/-0
Adjust explanation margins
morethanwords/tweb/master • 26b1381 • 5 files, +164/-65
Refactor poll options handling
morethanwords/tweb/master • d4108ca • 2 files, +3/-3
Adjust avatar sizes for poll message content
morethanwords/tweb/master • ea3438e • 2 files, +62/-61
Make the footer as a button
morethanwords/tweb/master • b2dacef • 3 files, +20/-7
Highlight poll option when clicking on replies too
morethanwords/tweb/master • c2c40ca • 6 files, +31/-21
Optimize unnecessary encoding<->decoding of poll option
morethanwords/tweb/master • 92ff317 • 1 files, +1/-3
Fix poll option uint8array
morethanwords/tweb/master • 91dd96b • 300 files, +17537/-7498
Merge branch 'master' into feature/new-polls
#webk
🫡3
morethanwords/tweb/master • 7799a08 • 300 files, +19847/-8319
Merge branch 'feature/new-polls' into feature/create-managed-bot
morethanwords/tweb/master • 2a1f59a • 5 files, +95/-65
Add geo preview for description and explanation
morethanwords/tweb/master • 2f334bb • 3 files, +22/-1
Disable autoplay for video. Show play button on top of video.
morethanwords/tweb/master • a0b7333 • 2 files, +14/-3
Disable Allow adding options when disabling Show who voted
morethanwords/tweb/master • d4f30e0 • 3 files, +3/-1
Change wording when multiple answers
morethanwords/tweb/master • b819390 • 5 files, +76/-61
Refactor adding options logic
morethanwords/tweb/master • 14cd1ed • 2 files, +223/-158
Refactor canceling video rendering logic to cancel immediately.
morethanwords/tweb/master • 98d6470 • 15 files, +512/-91
Support adding videos when creating poll
morethanwords/tweb/master • 7c1308e • 1 files, +25/-0
Recheck permissions before sending poll
morethanwords/tweb/master • cada2ac • 7 files, +13/-33
Remove StandaloneSignal useless type
morethanwords/tweb/master • d2596da • 4 files, +123/-47
Refactor MediaAttachment video styles and change wording when GIF is
attached
morethanwords/tweb/master • faaaf5b • 4 files, +203/-1
Don't generate video if no changes were made
morethanwords/tweb/master • 66224df • 2 files, +22/-3
Show gif label in poll option video attachment
morethanwords/tweb/master • da210f3 • 2 files, +6/-4
Adjust cancel button
#webk
Merge branch 'feature/new-polls' into feature/create-managed-bot
morethanwords/tweb/master • 2a1f59a • 5 files, +95/-65
Add geo preview for description and explanation
morethanwords/tweb/master • 2f334bb • 3 files, +22/-1
Disable autoplay for video. Show play button on top of video.
morethanwords/tweb/master • a0b7333 • 2 files, +14/-3
Disable Allow adding options when disabling Show who voted
morethanwords/tweb/master • d4f30e0 • 3 files, +3/-1
Change wording when multiple answers
morethanwords/tweb/master • b819390 • 5 files, +76/-61
Refactor adding options logic
morethanwords/tweb/master • 14cd1ed • 2 files, +223/-158
Refactor canceling video rendering logic to cancel immediately.
morethanwords/tweb/master • 98d6470 • 15 files, +512/-91
Support adding videos when creating poll
morethanwords/tweb/master • 7c1308e • 1 files, +25/-0
Recheck permissions before sending poll
morethanwords/tweb/master • cada2ac • 7 files, +13/-33
Remove StandaloneSignal useless type
morethanwords/tweb/master • d2596da • 4 files, +123/-47
Refactor MediaAttachment video styles and change wording when GIF is
attached
morethanwords/tweb/master • faaaf5b • 4 files, +203/-1
Don't generate video if no changes were made
morethanwords/tweb/master • 66224df • 2 files, +22/-3
Show gif label in poll option video attachment
morethanwords/tweb/master • da210f3 • 2 files, +6/-4
Adjust cancel button
#webk
🫡3
morethanwords/tweb/master • 141e4e1 • 1 files, +1/-1
Show drag handle on first option always
morethanwords/tweb/master • cc56b4d • 3 files, +41/-11
Handle component cleanup in MediaAttachment
morethanwords/tweb/master • a52d486 • 2 files, +17/-2
Prevent recursive click handling on media viewer targets
morethanwords/tweb/master • a5c22b4 • 1 files, +7/-5
Add missing rights check in AddOption
morethanwords/tweb/master • b40c055 • 2 files, +32/-26
Fix hover on add option's button icons
morethanwords/tweb/master • 535810c • 2 files, +15/-1
Fix spinner color
morethanwords/tweb/master • 806771d • 5 files, +30/-10
Focus on InputField when clicking on form field
morethanwords/tweb/master • 67c7449 • 6 files, +62/-3
Handle uploadingFileName's on uploading poll media
morethanwords/tweb/master • 0246cc1 • 1 files, +6/-4
Fix poll media finalization not being run
morethanwords/tweb/master • 68a1efc • 46 files, +2244/-587
Merge branch 'master' into feature/new-polls
morethanwords/tweb/master • ee92734 • 4 files, +5/-7
Handle venue location too
morethanwords/tweb/master • 14bbfca • 1 files, +1/-1
Fix type
morethanwords/tweb/master • 047c7b6 • 183 files, +11314/-3700
Merge pull request #631 from H7GhosT/feature/new-polls
New polls
morethanwords/tweb/master • 1d58eb4 • 79 files, +3729/-1058
Merge branch 'master' into feature/create-managed-bot
#webk
Show drag handle on first option always
morethanwords/tweb/master • cc56b4d • 3 files, +41/-11
Handle component cleanup in MediaAttachment
morethanwords/tweb/master • a52d486 • 2 files, +17/-2
Prevent recursive click handling on media viewer targets
morethanwords/tweb/master • a5c22b4 • 1 files, +7/-5
Add missing rights check in AddOption
morethanwords/tweb/master • b40c055 • 2 files, +32/-26
Fix hover on add option's button icons
morethanwords/tweb/master • 535810c • 2 files, +15/-1
Fix spinner color
morethanwords/tweb/master • 806771d • 5 files, +30/-10
Focus on InputField when clicking on form field
morethanwords/tweb/master • 67c7449 • 6 files, +62/-3
Handle uploadingFileName's on uploading poll media
morethanwords/tweb/master • 0246cc1 • 1 files, +6/-4
Fix poll media finalization not being run
morethanwords/tweb/master • 68a1efc • 46 files, +2244/-587
Merge branch 'master' into feature/new-polls
morethanwords/tweb/master • ee92734 • 4 files, +5/-7
Handle venue location too
morethanwords/tweb/master • 14bbfca • 1 files, +1/-1
Fix type
morethanwords/tweb/master • 047c7b6 • 183 files, +11314/-3700
Merge pull request #631 from H7GhosT/feature/new-polls
New polls
morethanwords/tweb/master • 1d58eb4 • 79 files, +3729/-1058
Merge branch 'master' into feature/create-managed-bot
#webk
🫡3
morethanwords/tweb/master • bc77ae7 • 10 files, +588/-4
Merge pull request #647 from H7GhosT/feature/create-managed-bot
Create managed bot keyboard action
#webk
Merge pull request #647 from H7GhosT/feature/create-managed-bot
Create managed bot keyboard action
#webk
🫡3
UnigramDev/Unigram/develop • 20ea209 • 1 files, +32/-1
Support anchors in markdown
UnigramDev/Unigram/develop • dbe8412 • 1 files, +6/-3
Allow selection in IV code blocks
UnigramDev/Unigram/develop • 1fae5e0 • 2 files, +14/-2
Improve instant view title
UnigramDev/Unigram/develop • d532e6a • 7 files, +137/-18
Recognize QR codes in pictures
UnigramDev/Unigram/develop • 15484a9 • 1 files, +4/-1
Improve checkbox in instant view
UnigramDev/Unigram/develop • ee44d43 • 2 files, +10/-0
Track error
UnigramDev/Unigram/develop • d2b844c • 1 files, +1/-1
Bump version to 12.7.4
UnigramDev/Unigram/develop • b84aac4 • 2 files, +9/-0
Handle QR code clicks
#unigram
Support anchors in markdown
UnigramDev/Unigram/develop • dbe8412 • 1 files, +6/-3
Allow selection in IV code blocks
UnigramDev/Unigram/develop • 1fae5e0 • 2 files, +14/-2
Improve instant view title
UnigramDev/Unigram/develop • d532e6a • 7 files, +137/-18
Recognize QR codes in pictures
UnigramDev/Unigram/develop • 15484a9 • 1 files, +4/-1
Improve checkbox in instant view
UnigramDev/Unigram/develop • ee44d43 • 2 files, +10/-0
Track error
UnigramDev/Unigram/develop • d2b844c • 1 files, +1/-1
Bump version to 12.7.4
UnigramDev/Unigram/develop • b84aac4 • 2 files, +9/-0
Handle QR code clicks
#unigram
🫡2
morethanwords/tweb/master • 2208738 • 1 files, +10/-4
fix: #223 draft sync loop when remote client clears draft
morethanwords/tweb/master • eaafbc7 • 1 files, +3/-0
fix: preserve actively-typed draft when a remote clear arrives
Refines the #223 fix: the draft_updated listener cleared the pending
saveDraft timeout before setDraft checked isDebounced(), so a remote
clear arriving while the user was typing would clobber their newer
input. Check isDebounced() first and bail when a local save is pending,
letting the in-progress draft win and sync normally.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
morethanwords/tweb/master • f5f9e83 • 1 files, +13/-4
Merge pull request #648 from hmnd/push-vyvvuzymxyls
fix: #223 draft sync loop when remote client clears draft
#webk
fix: #223 draft sync loop when remote client clears draft
morethanwords/tweb/master • eaafbc7 • 1 files, +3/-0
fix: preserve actively-typed draft when a remote clear arrives
Refines the #223 fix: the draft_updated listener cleared the pending
saveDraft timeout before setDraft checked isDebounced(), so a remote
clear arriving while the user was typing would clobber their newer
input. Check isDebounced() first and bail when a local save is pending,
letting the in-progress draft win and sync normally.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
morethanwords/tweb/master • f5f9e83 • 1 files, +13/-4
Merge pull request #648 from hmnd/push-vyvvuzymxyls
fix: #223 draft sync loop when remote client clears draft
#webk
🫡3🤨1
UnigramDev/Unigram/develop • d82aad2 • 2 files, +40/-3
Fix profile settings navigation
UnigramDev/Unigram/develop • 4e12044 • 1 files, +1/-1
Fix null ref
#unigram
Fix profile settings navigation
UnigramDev/Unigram/develop • 4e12044 • 1 files, +1/-1
Fix null ref
#unigram
🫡3
morethanwords/tweb/master • 871fc5e • 14 files, +246/-108
fix: group + conference calls — DTLS role, e2e recv/key/video send, mirror, rejoin
Group voice chats (SFU):
- DTLS: advertise setup:passive so the SFU drives the handshake. A Chrome ~M124
DTLS change broke the client-active direction — ICE reached connected but the
handshake stalled, so no SRTP keys and no media. (processMediaSection)
Conference calls (TdE2E) — enabled (IS_CONFERENCE_CALL_SUPPORTED=true):
- recv: attach the e2e RTCRtpScriptTransform per remote SSRC at createTransceiver
time, before the decoder binds (the track event is too late → Chrome bypasses).
Drop the single-multiplexed-m-line model; one recvonly m-line per SSRC like the
legacy SFU path. Frames now pump 1:1.
- key: gate the v1+ group-shared-key HMAC mixing on group_state.version() like
tdlib (real calls run at version 0) — fixes MAC verification failures vs iOS.
- video send: keep the VP8 codec header in a per-frame plaintext prefix
(libtgcalls calculateVp8FramePlaintextHeaderSize) instead of encrypting it.
- screen share: attach the e2e send transform on the presentation connection
(its own e2e channel); it was being sent unencrypted.
Calls UI:
- mirror only the local self-view from a front camera; never the remote feed or
screen capture (getDisplayMedia/displaySurface).
Re-join: reset the participant-fetch cursor on leave AND join so re-joining the
same call re-fetches participants — fixes empty popup + no video on rejoin
(incl. after reload, where the SharedWorker keeps stale state).
Cleanups: shared senderKind helper, named e2e channel constants, gate e2e worker
debug instrumentation behind E2E_DEBUG, remove dead attachE2eTransforms.
morethanwords/tweb/master • b0f3f20 • 8 files, +356/-336
Some icons
morethanwords/tweb/master • 6fee2d4 • 1 files, +13/-4
Merge branch 'master' of https://github.com/morethanwords/tweb
morethanwords/tweb/master • 735f656 • 15 files, +1695/-304
feat: My QR code — iOS-style profile QR card with theme picker
Add a "My QR code" popup that renders your (or any peer's) profile QR as an
iOS-faithful card — avatar + QR + @username over a chat wallpaper — painted on a
single canvas and copyable as a 1170×2532 PNG (with a profile-link fallback when
image-clipboard is unavailable).
- QR painted via a shared paintQrCode helper (qr-code-styling), tinted with the
wallpaper gradient and luminance-clamped so it stays scannable on light
themes; SignQRCard now uses the same helper instead of its own copy.
- Reusable ChatThemesPicker extracted (also adopted by generalSettings) with a
popup-local night-mode toggle; selection persisted in appSettings.qrCode
(selectedThemeId + nightMode).
- Entry points: Settings header (self), PeerProfile username + private
invite-link rows; usernameless self falls back to a t.me/contact token
(appUsersManager.exportContactToken), mirroring iOS.
- color.ts: shared getWallPaperColors + WCAG luminance helpers; fix
filter(Boolean) dropping a present black (0x000000) wallpaper stop — now keeps
every present stop like Telegram-iOS.
#webk
fix: group + conference calls — DTLS role, e2e recv/key/video send, mirror, rejoin
Group voice chats (SFU):
- DTLS: advertise setup:passive so the SFU drives the handshake. A Chrome ~M124
DTLS change broke the client-active direction — ICE reached connected but the
handshake stalled, so no SRTP keys and no media. (processMediaSection)
Conference calls (TdE2E) — enabled (IS_CONFERENCE_CALL_SUPPORTED=true):
- recv: attach the e2e RTCRtpScriptTransform per remote SSRC at createTransceiver
time, before the decoder binds (the track event is too late → Chrome bypasses).
Drop the single-multiplexed-m-line model; one recvonly m-line per SSRC like the
legacy SFU path. Frames now pump 1:1.
- key: gate the v1+ group-shared-key HMAC mixing on group_state.version() like
tdlib (real calls run at version 0) — fixes MAC verification failures vs iOS.
- video send: keep the VP8 codec header in a per-frame plaintext prefix
(libtgcalls calculateVp8FramePlaintextHeaderSize) instead of encrypting it.
- screen share: attach the e2e send transform on the presentation connection
(its own e2e channel); it was being sent unencrypted.
Calls UI:
- mirror only the local self-view from a front camera; never the remote feed or
screen capture (getDisplayMedia/displaySurface).
Re-join: reset the participant-fetch cursor on leave AND join so re-joining the
same call re-fetches participants — fixes empty popup + no video on rejoin
(incl. after reload, where the SharedWorker keeps stale state).
Cleanups: shared senderKind helper, named e2e channel constants, gate e2e worker
debug instrumentation behind E2E_DEBUG, remove dead attachE2eTransforms.
morethanwords/tweb/master • b0f3f20 • 8 files, +356/-336
Some icons
morethanwords/tweb/master • 6fee2d4 • 1 files, +13/-4
Merge branch 'master' of https://github.com/morethanwords/tweb
morethanwords/tweb/master • 735f656 • 15 files, +1695/-304
feat: My QR code — iOS-style profile QR card with theme picker
Add a "My QR code" popup that renders your (or any peer's) profile QR as an
iOS-faithful card — avatar + QR + @username over a chat wallpaper — painted on a
single canvas and copyable as a 1170×2532 PNG (with a profile-link fallback when
image-clipboard is unavailable).
- QR painted via a shared paintQrCode helper (qr-code-styling), tinted with the
wallpaper gradient and luminance-clamped so it stays scannable on light
themes; SignQRCard now uses the same helper instead of its own copy.
- Reusable ChatThemesPicker extracted (also adopted by generalSettings) with a
popup-local night-mode toggle; selection persisted in appSettings.qrCode
(selectedThemeId + nightMode).
- Entry points: Settings header (self), PeerProfile username + private
invite-link rows; usernameless self falls back to a t.me/contact token
(appUsersManager.exportContactToken), mirroring iOS.
- color.ts: shared getWallPaperColors + WCAG luminance helpers; fix
filter(Boolean) dropping a present black (0x000000) wallpaper stop — now keeps
every present stop like Telegram-iOS.
#webk
🫡3
morethanwords/tweb/master • ff9288b • 14 files, +301/-104
feat: conference-call join entry points (link/invite/pinned/preview)
Funnel every "join a conference" affordance through one policy entry
point — appImManager.joinConference, which owns the support gate, the
same-call short-circuit, the leave-current-call confirmation and the
dead-link toast:
- t.me/call/<slug> link, the invite service-message anchor and the new
telegram_call web-page preview (chat bubble + pinned bar) all delegate
to it instead of re-implementing the gate + error handling
- joinConference now leaves any current call (1-on-1, live, group or
another conference) via discardCurrentCall before joining, mirroring
joinGroupCall/joinLiveStream; adds a `Conference` confirmation toType
so the prompt never names an empty peer
- joinVoiceChatAnchor imports joinConference lazily — a static import
closes an appImManager↔render-path cycle that crashes page load with a
`Row` TDZ ("Cannot access 'Row' before initialization")
Conference UX (no backing chat peer):
- topbar stacks participant avatars instead of a chat avatar, refreshed
on participant join/leave; fix a string-vs-number group-call id compare
that froze the participant count at its connect-time value
- groupCallInstance nudges a re-render once the real groupCall hydrates
late (invitee/slug joins) so the count doesn't stick at 1
- PopupGroupCall places the e2e fingerprint badge left of fullscreen
Schema: add the `telegram_call` WebPage type.
#webk
feat: conference-call join entry points (link/invite/pinned/preview)
Funnel every "join a conference" affordance through one policy entry
point — appImManager.joinConference, which owns the support gate, the
same-call short-circuit, the leave-current-call confirmation and the
dead-link toast:
- t.me/call/<slug> link, the invite service-message anchor and the new
telegram_call web-page preview (chat bubble + pinned bar) all delegate
to it instead of re-implementing the gate + error handling
- joinConference now leaves any current call (1-on-1, live, group or
another conference) via discardCurrentCall before joining, mirroring
joinGroupCall/joinLiveStream; adds a `Conference` confirmation toType
so the prompt never names an empty peer
- joinVoiceChatAnchor imports joinConference lazily — a static import
closes an appImManager↔render-path cycle that crashes page load with a
`Row` TDZ ("Cannot access 'Row' before initialization")
Conference UX (no backing chat peer):
- topbar stacks participant avatars instead of a chat avatar, refreshed
on participant join/leave; fix a string-vs-number group-call id compare
that froze the participant count at its connect-time value
- groupCallInstance nudges a re-render once the real groupCall hydrates
late (invitee/slug joins) so the count doesn't stick at 1
- PopupGroupCall places the e2e fingerprint badge left of fullscreen
Schema: add the `telegram_call` WebPage type.
#webk
🫡3
morethanwords/tweb/brave-spence-c3c9ac • 5364b6f • 14 files, +2296/-535
feat: round video message recording (кружки)
Record and send round video notes, matching iOS/Android (400×400, 30fps).
- NativeVideoRecorder: getUserMedia -> center-cropped 400x400 <canvas> ->
captureStream -> MediaRecorder (mp4), plus a parallel webm recorder backing
the paused-preview snapshot (Chrome's mp4 MediaRecorder emits no mid-stream
data). rAF draw loop (rVFC never fires for the off-DOM source video), capped
to the capture frame rate.
- VideoRecordingPanel + ProgressRing (Solid .tsx): 360x360 centered camera
circle with the shared progress ring, first-frame reveal, mirror/un-mirror,
opacity fade-out on send/cancel (no black frame). The panel exposes an
imperative handle via createRoot, capturing real DOM nodes through refs so the
dev-mode $$component HMR wrapper doesn't break wrappers/video.ts.
- Reuses the existing voice recording panel (trash / waveform / timer / pause /
preview / send) in place. Click-to-record; voice<->video switch via
right-click, left-button long-press, and the attach menu; 60s cap -> paused
preview + toast (no auto-send); poster thumbnail for the optimistic bubble.
- Extracts ALL recording machinery (voice + video) out of ChatInput into a
ChatRecording collaborator - input.ts shrinks ~1166 lines.
- Camera + microphone follow the user's Settings -> Speakers and Camera choice
through the shared getStream() chokepoint, inheriting its self-healing
fallback (stale device -> strip deviceId, clear the setting, retry on default).
- Gated off on Safari/iOS (broken canvas.captureStream, WebKit #181663) ->
falls back to voice.
- CLAUDE.md: document the "use getStream for any getUserMedia" rule.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
morethanwords/tweb/brave-spence-c3c9ac • 2809885 • 242 files, +15276/-4733
Merge branch 'master' into brave-spence-c3c9ac
#webk
feat: round video message recording (кружки)
Record and send round video notes, matching iOS/Android (400×400, 30fps).
- NativeVideoRecorder: getUserMedia -> center-cropped 400x400 <canvas> ->
captureStream -> MediaRecorder (mp4), plus a parallel webm recorder backing
the paused-preview snapshot (Chrome's mp4 MediaRecorder emits no mid-stream
data). rAF draw loop (rVFC never fires for the off-DOM source video), capped
to the capture frame rate.
- VideoRecordingPanel + ProgressRing (Solid .tsx): 360x360 centered camera
circle with the shared progress ring, first-frame reveal, mirror/un-mirror,
opacity fade-out on send/cancel (no black frame). The panel exposes an
imperative handle via createRoot, capturing real DOM nodes through refs so the
dev-mode $$component HMR wrapper doesn't break wrappers/video.ts.
- Reuses the existing voice recording panel (trash / waveform / timer / pause /
preview / send) in place. Click-to-record; voice<->video switch via
right-click, left-button long-press, and the attach menu; 60s cap -> paused
preview + toast (no auto-send); poster thumbnail for the optimistic bubble.
- Extracts ALL recording machinery (voice + video) out of ChatInput into a
ChatRecording collaborator - input.ts shrinks ~1166 lines.
- Camera + microphone follow the user's Settings -> Speakers and Camera choice
through the shared getStream() chokepoint, inheriting its self-healing
fallback (stale device -> strip deviceId, clear the setting, retry on default).
- Gated off on Safari/iOS (broken canvas.captureStream, WebKit #181663) ->
falls back to voice.
- CLAUDE.md: document the "use getStream for any getUserMedia" rule.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
morethanwords/tweb/brave-spence-c3c9ac • 2809885 • 242 files, +15276/-4733
Merge branch 'master' into brave-spence-c3c9ac
#webk
🫡3
morethanwords/tweb/master • ab756cc • 14 files, +2296/-534
Merge pull request #652 from morethanwords/brave-spence-c3c9ac
feat: round video message recording (кружки)
#webk
Merge pull request #652 from morethanwords/brave-spence-c3c9ac
feat: round video message recording (кружки)
#webk
🫡3