Kể từ bản dựng beta 12.10.283300 phát hành ngày 8 tháng 10, ứng dụng Telegram dành cho macOS đã tích hợp mô-đun HTMLBubbles: các tin nhắn được thiết kế bằng HTML và CSS, với JavaScript nhúng, hiển thị trực tiếp trong bong bóng chat mà không cần cửa sổ mini-app. Vào ngày 11 tháng 10, trong bản dựng 13.0.283309, thư viện three.js và ba trò chơi 3D điều khiển bằng phím mũi tên đã được bổ sung. Hiện tại, tính năng này chỉ dành cho những người dùng kênh beta của macOS: mô-đun hoạt động trên các cuộc trò chuyện demo được tích hợp sẵn trong bản dựng, và chưa có loại tin nhắn hỗ trợ tính năng này từ phía máy chủ trong lược đồ API.

The post on Telegram — @gramnews
Tin nhắn HTML trong bản beta Telegram dành cho macOS

Những gì có trong bản dựng

Bản beta macOS được phân phối qua nguồn cấp dữ liệu cập nhật mac-updates.telegram.org, và mỗi bản dựng là một tệp zip thông thường chứa ứng dụng. Trong bản 12.10.283299 không có mô-đun này, nhưng trong bản 12.10.283300, một gói HTMLBubbles_HTMLBubbles.bundle xuất hiện bên cạnh các tài nguyên. Bản dựng đã được phân tích ngay trong ngày hôm đó.

Bên trong gói này có mười hai tệp .chat. Đây không phải là dữ liệu từ máy chủ, mà là các kịch bản cho các cuộc trò chuyện demo: tiêu đề, danh sách người tham gia với màu avatar và các tin nhắn, mỗi tin nhắn là một đoạn HTML với <style> và <script> riêng. Các tên gọi đã tự nói lên nhiệm vụ của chúng: «Design Crew», «Deploy Bot», «Stress Test», «Playground», «Long Reads», «Trip to Lisbon», «Shop Assistant», «Analytics», «Live Scripts», «Code Review», «Game Night», «Motion Lab». Chú thích cho «Stress Test» trực tiếp nêu tên công cụ — «những gì litehtml có thể xử lý và những gì không».

Trong các chuỗi của tệp thực thi có một danh mục tin nhắn demo, khoảng năm mươi thẻ: thẻ lên máy bay với các tab theo ngày, trang sản phẩm với lựa chọn kích thước và màu sắc, phễu chuyển đổi, tỷ lệ giữ chân theo nhóm, pull request với nút Approve, bản dựng CI với các nút Promote và Roll back, cờ caro với bot, xúc xắc «thực sự lăn», trình phát nhạc với bộ cân bằng trực tiếp và một câu trả lời «tự động gõ như AI».

Một bot trò chuyện riêng biệt, HTML Bot, tự giới thiệu như sau: mỗi câu trả lời là HTML và CSS, không có mạng; hãy gõ / để chọn tin nhắn. Cũng có một quy tắc cho mã riêng: bất kỳ HTML nào có kiểu và script sẽ hiển thị toàn bộ chiều rộng mà không có bong bóng, còn nếu được bọc trong <div class="widget"> thì sẽ hiển thị bên trong bong bóng.

Những gì bản dựng ngày 11 tháng 10 đã bổ sung

Trong bản 13.0.283309, hai thứ đã xuất hiện trong gói. Thứ nhất là lib/three.js với dung lượng 1.27 MB: thư viện three.js phiên bản r160 theo giấy phép MIT, được biên dịch lại, theo chú thích ở dòng đầu tiên của tệp, «cho các tin nhắn HTML» — mô-đun được thực thi bằng một script và tự đặt mình vào đối tượng toàn cục THREE. Tin nhắn không kết nối nó bằng địa chỉ mạng mà bằng liên kết nội bộ app:three.

Thứ hai là cuộc trò chuyện thứ mười ba, «3D Lab», với chú thích «các cảnh three.js, được vẽ bởi trình kết xuất Metal của ứng dụng». Trong đó có ba tin nhắn: trò chơi arcade Chicken Cross, nơi một con gà băng qua đường, một cảnh demo «three.js on Metal» và cờ vua với bot. Điều khiển trong Chicken Cross — phím mũi tên hoặc WASD sau khi nhấp vào trường, Esc để thoát tiêu điểm; bên dưới trường có các nút trùng lặp cho chuột.

The post on Telegram — @gramnews
three.js và các trò chơi 3D trong tin nhắn của bản beta Telegram dành cho macOS

Cũng tại đó, một thư mục ported đã xuất hiện với hơn một trăm tệp HTML riêng biệt — đó là các tin nhắn demo tương tự, được sắp xếp theo cuộc trò chuyện. Chuỗi «twidget has no port of this card» trong tệp nhị phân gợi ý mục đích: các thẻ được chuyển sang công cụ kết xuất thứ hai và kiểm tra xem những thẻ nào đã được chuyển thành công.

Điều này có ý nghĩa gì đối với người dùng và nhà phát triển bot

Telegram ổn định cho macOS, Telegram Desktop, iOS và Android không hiển thị các tin nhắn như vậy. Trong bản beta, mô-đun hoạt động trên các cuộc trò chuyện demo riêng: không có cách nào để gửi tin nhắn HTML với script cho người đối thoại qua máy chủ — trong lược đồ API (lớp 230) không có loại tin nhắn nào có thể gửi mã nguồn với kiểu và script đến người nhận.

Tính năng công khai gần nhất là Rich Messages, đã xuất hiện trong Bot API 10.1 vào ngày 11 tháng 6 năm 2026. Bot có thể gửi tin nhắn bằng HTML hoặc Markdown thông qua sendRichMessage, nhưng tài liệu chỉ mô tả HTML như một cách ghi: mỗi thẻ được chuyển đổi thành một khối từ một tập hợp cố định — đoạn văn, tiêu đề, danh sách, bảng, trích dẫn, khối mở rộng, công thức, ảnh, video. Trong lược đồ API, điều này được thể hiện qua các loại: đầu vào chấp nhận inputRichMessageHTML với một chuỗi đánh dấu, và người nhận thấy richMessage với một danh sách các khối — giống như những khối tạo nên các trang Instant View. Bot API không liệt kê thẻ <script> hay <style> nào trong số các thẻ được hỗ trợ.

Bản dựng không cho thấy mối liên hệ giữa HTMLBubbles và Rich Messages: các cuộc trò chuyện demo được tải từ gói bên trong ứng dụng, chứ không phải từ tin nhắn máy chủ. Các văn bản demo được nhúng vào tệp nhị phân bằng tiếng Anh, không có trên nền tảng dịch thuật macOS.

Cách tin nhắn được vẽ trong bong bóng

Con đường chính không cần đến trình duyệt. Mã đánh dấu được phân tích bởi litehtml — một công cụ bố cục HTML và CSS mã nguồn mở theo giấy phép BSD, bản thân nó không vẽ gì: nó sắp xếp các phần tử theo tọa độ, và giao việc kết xuất cho ứng dụng. Nó đọc HTML bằng trình phân tích Gumbo, và các chuỗi gỡ lỗi của Gumbo («Entering adoption agency algorithm», «Noah's ark clause») đã được đưa vào tệp nhị phân cùng với nó. Ứng dụng tự thực hiện việc kết xuất, và HTML Bot có ba chế độ so sánh trong các chuỗi: litehtml, litehtml-gpu — cùng một bố cục với đầu ra qua Metal — và twidget (WebKit).

Script trong tin nhắn như vậy không sửa đổi trực tiếp mã đánh dấu. Nó khai báo một hàm render() trả về một chuỗi HTML cho trạng thái hiện tại, và các trình xử lý: onAction(name, value) — cho việc nhấp vào một phần tử có thuộc tính data-action, onKey, onPointer và onFocus — cho các trò chơi. Sau mỗi sự kiện, client gọi render() và vẽ lại bong bóng tại chỗ. Trên đó là một bộ trợ giúp cho hoạt ảnh: tween(), animate(), các đường cong ease.*, transition('pop') để thay đổi nội dung gốc. HTML tĩnh xung quanh <script> đóng vai trò là chế độ dự phòng nếu script không khởi chạy.

Theo văn bản demo «Live Scripts», mỗi script được thực thi trong một sandbox JavaScriptCore riêng — công cụ JavaScript của macOS. Nhấp chuột phải vào thẻ sẽ mở «Script Log…» với console của nó, và lệnh /stats trong cuộc trò chuyện với HTML Bot sẽ bật thời gian kết xuất khung hình, tốc độ khung hình, CPU và bộ nhớ trên mỗi tin nhắn — một công cụ để đo lường, không phải cho người dùng.

Sandbox và mạng

Bản demo «Runaway scripts the sandbox stops» cho thấy các giới hạn ngay trong các thẻ: một vòng lặp vô hạn khi tải, theo văn bản của chúng, JavaScriptCore sẽ ngắt sau 50 ms và để lại HTML tĩnh; thẻ có nút Hang sẽ khởi chạy một vòng lặp tương tự bên trong onAction; một bộ đếm thời gian, cứ sau 100 ms chiếm CPU trong 40 ms, sẽ vượt quá ngân sách 200 ms thời gian CPU mỗi giây.

Chế độ WebKit nằm trong mô-đun WidgetSandbox riêng biệt và được bảo vệ khỏi mạng bởi ba lớp cùng một lúc. Trang nhận chính sách bảo mật nội dung với connect-src 'none' và các script chỉ bằng một khóa dùng một lần; một danh sách các quy tắc được kết nối với WebView, chặn tất cả các địa chỉ http, https, ws, wss và ftp; trước mã tin nhắn, fetch, XMLHttpRequest, WebSocket, EventSource, RTCPeerConnection, các worker và window.open bị xóa khỏi cửa sổ. Hình ảnh và phương tiện chỉ được phép từ data: và blob:, các tệp như three.js được xử lý bởi trình xử lý lược đồ nội bộ.

Các cảnh 3D được cấu trúc như thế nào

Các trò chơi từ «3D Lab» được viết bằng mã three.js thông thường: cảnh, camera trực giao, ánh sáng với bóng đổ, hình học từ các khối. Trình kết xuất được tạo dưới dạng THREE.WebGLRenderer, nhưng với tham số cornerRadius, mà three.js không có — nó chỉ được hiểu bởi lớp bao bọc ứng dụng. Trong tệp nhị phân có lớp bao bọc cho chế độ trang WebKit: nó thay thế WebGLRenderer bằng một lớp kế thừa, chèn canvas của nó vào một phần tử có thuộc tính data-3d, theo dõi kích thước và chuyển tiếp các phím mũi tên, WASD, phím cách và Enter vào onKey của trò chơi — với Cmd, Ctrl hoặc Alt, các phím sẽ được gửi đến ứng dụng.

Trong bong bóng, theo chú thích của cuộc trò chuyện, cùng một cảnh được vẽ bởi trình kết xuất Metal của ứng dụng; trong mô-đun có các lớp HTMLBubbleGPU, HTMLBubbleGPUPool và các bộ đệm cho tài nguyên Metal. Trên Mac không có Metal, trò chơi hiển thị một thông báo giữ chỗ «3D needs a Mac with Metal».

Telegram Serverless và tgcloud.ai

Không có liên kết nào đến Telegram Serverless, tgcloud.ai hoặc bất kỳ trình thực thi máy chủ nào khác trong gói HTMLBubbles, trong các chuỗi của tệp nhị phân, hay trong lược đồ API: các tin nhắn demo nằm cục bộ, và HTML Bot không có mạng theo thiết kế. Mối liên hệ giữa chúng hiện chưa được xác nhận bởi bất cứ điều gì, ngoài sự trùng hợp về thời gian.