Mulai dari build beta 12.10.283300 pada 8 Oktober, klien Telegram untuk macOS menyertakan modul HTMLBubbles: pesan yang di-render menggunakan HTML dan CSS, dengan JavaScript tertanam, yang langsung muncul di gelembung chat (chat bubble), tanpa jendela mini-aplikasi. Pada 11 Oktober, di build 13.0.283309, pustaka three.js dan tiga game 3D dengan kontrol panah ditambahkan ke dalamnya. Ini hanya berlaku untuk mereka yang menggunakan saluran beta macOS: modul ini berfungsi pada demo percakapan yang tertanam dalam build itu sendiri, dan tidak ada tipe pesan berbasis server untuknya dalam skema API.

The post on Telegram — @gramnews
Pesan HTML di beta Telegram untuk macOS

Apa yang Ada dalam Build

Beta macOS didistribusikan melalui feed pembaruan mac-updates.telegram.org, dan setiap build adalah file zip biasa yang berisi aplikasi. Di 12.10.283299 tidak ada modul, namun di 12.10.283300, paket HTMLBubbles_HTMLBubbles.bundle muncul di samping sumber daya. Build tersebut dibongkar pada hari yang sama.

Di dalam paket terdapat dua belas file .chat. Ini bukan data dari server, melainkan skenario demo percakapan: judul, daftar peserta dengan warna avatar, dan pesan, yang masing-masing adalah potongan HTML dengan <style> dan <script>-nya sendiri. Nama-nama ini menjelaskan tugasnya sendiri: «Design Crew», «Deploy Bot», «Stress Test», «Playground», «Long Reads», «Trip to Lisbon», «Shop Assistant», «Analytics», «Live Scripts», «Code Review», «Game Night», «Motion Lab». Keterangan untuk «Stress Test» secara langsung menyebutkan mesinnya — "apa yang bisa ditangani litehtml dan apa yang tidak".

Dalam string file yang dapat dieksekusi terdapat katalog pesan demo, sekitar lima puluh kartu: boarding pass dengan tab berdasarkan hari, halaman produk dengan pilihan ukuran dan warna, corong konversi, retensi kohort, pull request dengan tombol Approve, build CI dengan tombol Promote dan Roll back, tic-tac-toe melawan bot, dadu "yang benar-benar bergulir", pemutar musik dengan equalizer langsung, dan balasan "yang mengetik sendiri seperti AI".

Bot lawan bicara terpisah, HTML Bot, memperkenalkan dirinya sebagai berikut: setiap balasan adalah HTML dan CSS, tidak ada jaringan; ketik / untuk memilih pesan. Ada juga aturan untuk kode Anda sendiri: HTML apa pun dengan gaya dan skrip ditampilkan dalam lebar penuh tanpa gelembung, sedangkan yang dibungkus dalam <div class="widget"> — di dalam gelembung.

Apa yang Ditambahkan oleh Build 11 Oktober

Di 13.0.283309, dua hal muncul di dalam paket. Yang pertama adalah lib/three.js dengan ukuran 1,27 MB: pustaka three.js revisi r160 di bawah lisensi MIT, yang dikompilasi ulang, menurut komentar di baris pertama file, "untuk pesan HTML" — modul ini dieksekusi sebagai satu skrip dan menempatkan dirinya di objek global THREE. Pesan tersebut tidak menghubungkannya melalui alamat jaringan, melainkan melalui tautan internal app:three.

Yang kedua adalah percakapan ketiga belas, «3D Lab», dengan keterangan "scene three.js, dirender oleh renderer Metal aplikasi". Di dalamnya terdapat tiga pesan: arcade Chicken Cross, di mana seekor ayam menyeberang jalan, demo scene «three.js on Metal», dan catur melawan bot. Kontrol di Chicken Cross adalah panah atau WASD setelah mengklik bidang, Esc melepaskan fokus; di bawah bidang terdapat tombol duplikat untuk mouse.

The post on Telegram — @gramnews
three.js dan game 3D di pesan beta Telegram untuk macOS

Di sana juga muncul folder ported dengan lebih dari seratus file HTML terpisah — pesan demo yang sama, diatur berdasarkan percakapan. String "twidget has no port of this card" di biner menunjukkan tujuannya: kartu-kartu tersebut dipindahkan ke mesin rendering kedua dan diperiksa mana yang berhasil dipindahkan.

Apa Artinya Ini bagi Pengguna dan Pengembang Bot

Telegram stabil untuk macOS, Telegram Desktop, iOS, dan Android tidak menampilkan pesan semacam ini. Di beta, modul ini berfungsi pada demo percakapannya sendiri: tidak ada cara untuk mengirim pesan HTML dengan skrip kepada lawan bicara melalui server — dalam skema API (layer 230) tidak ada tipe pesan yang akan mengirimkan markup asli dengan gaya dan skrip kepada penerima.

Yang terdekat yang publik adalah Rich Messages, yang muncul di Bot API 10.1 pada 11 Juni 2026. Bot dapat mengirim pesan dalam HTML atau Markdown melalui sendRichMessage, tetapi dokumentasi menjelaskan HTML hanya sebagai cara penulisan: setiap tag direduksi menjadi blok dari set tetap — paragraf, judul, daftar, tabel, kutipan, blok yang dapat diperluas, formula, foto, video. Dalam skema API ini terlihat dari tipenya: inputRichMessageHTML diterima sebagai input dengan string markup, dan penerima melihat richMessage dengan daftar blok — sama seperti yang digunakan untuk menyusun halaman Instant View. Baik tag <script> maupun <style> tidak tercantum di antara yang didukung oleh Bot API.

Build tersebut tidak menunjukkan hubungan HTMLBubbles dengan Rich Messages: demo percakapan dimuat dari paket di dalam aplikasi, bukan dari pesan server. Teks demo tertanam dalam biner dalam bahasa Inggris, dan tidak ada di platform terjemahan macOS.

Bagaimana Pesan Dirender dalam Gelembung

Jalur utama tidak menggunakan browser. Markup diurai oleh litehtml — mesin rendering HTML dan CSS open-source di bawah lisensi BSD, yang tidak merender apa pun sendiri: ia menempatkan elemen berdasarkan koordinat, dan menyerahkan rendering ke aplikasi. Ia membaca HTML dengan parser Gumbo, dan string debug Gumbo («Entering adoption agency algorithm», «Noah's ark clause») masuk ke biner bersamanya. Aplikasi melakukan rendering sendiri, dan HTML Bot memiliki tiga mode perbandingan dalam string: litehtml, litehtml-gpu — rendering yang sama dengan output melalui Metal — dan twidget (WebKit).

Skrip dalam pesan semacam itu tidak memodifikasi markup secara langsung. Ia mendeklarasikan fungsi render() yang mengembalikan string HTML untuk keadaan saat ini, dan handler: onAction(name, value) — untuk klik pada elemen dengan atribut data-action, onKey, onPointer, dan onFocus — untuk game. Setelah setiap peristiwa, klien memanggil render() dan merender ulang gelembung di tempatnya. Di atas ini, ada serangkaian pembantu untuk animasi: tween(), animate(), kurva ease.*, transition('pop') untuk perubahan konten asli. HTML statis di sekitar <script> berfungsi sebagai tampilan cadangan jika skrip tidak berjalan.

Menurut teks demo «Live Scripts», setiap skrip dieksekusi dalam sandbox JavaScriptCore-nya sendiri — mesin JavaScript yang merupakan bagian dari macOS. Klik kanan pada kartu akan membuka «Script Log…» dengan konsolnya, dan perintah /stats di chat dengan HTML Bot akan mengaktifkan waktu rendering frame, frame rate, CPU, dan memori di atas setiap pesan — alat untuk pengukuran, bukan untuk pengguna.

Sandbox dan Jaringan

Demo «Runaway scripts the sandbox stops» menunjukkan batas-batas langsung di kartu: loop tak terbatas saat memuat, menurut teksnya, JavaScriptCore menginterupsi setelah 50 ms dan meninggalkan HTML statis; kartu dengan tombol Hang memulai loop yang sama di dalam onAction; timer yang setiap 100 ms menggunakan CPU selama 40 ms, melebihi anggaran waktu CPU 200 ms per detik.

Mode WebKit berada dalam modul WidgetSandbox terpisah dan terlindungi dari jaringan oleh tiga lapisan sekaligus. Halaman menerima kebijakan keamanan konten dengan connect-src 'none' dan skrip hanya dengan kunci sekali pakai; daftar aturan terhubung ke WebView yang memblokir semua alamat http, https, ws, wss, dan ftp; sebelum kode pesan, fetch, XMLHttpRequest, WebSocket, EventSource, RTCPeerConnection, worker, dan window.open dihapus dari jendela. Gambar dan media hanya diizinkan dari data: dan blob:, file seperti three.js disajikan oleh handler skema internal.

Bagaimana Scene 3D Dibuat

Game dari «3D Lab» ditulis dengan kode three.js biasa: scene, kamera ortogonal, cahaya dengan bayangan, geometri dari kubus. Renderer dibuat sebagai THREE.WebGLRenderer, tetapi dengan parameter cornerRadius, yang tidak dimiliki three.js, — ini hanya dipahami oleh pembungkus aplikasi. Dalam biner terdapat pembungkus untuk mode halaman WebKit: ia mengganti WebGLRenderer dengan turunannya, menyisipkan kanvasnya ke elemen dengan atribut data-3d, memantau ukuran, dan meneruskan panah, WASD, spasi, dan Enter ke onKey game — dengan Cmd, Ctrl, atau Alt, tombol-tombol tersebut masuk ke aplikasi.

Dalam gelembung, menurut keterangan percakapan, scene yang sama dirender oleh renderer Metal aplikasi; dalam modul terdapat kelas HTMLBubbleGPU, HTMLBubbleGPUPool, dan buffer untuk sumber daya Metal. Di Mac tanpa Metal, game menampilkan placeholder «3D needs a Mac with Metal».

Telegram Serverless dan tgcloud.ai

Baik di paket HTMLBubbles, maupun di string biner, maupun di skema API, tidak ada tautan ke Telegram Serverless, tgcloud.ai, atau eksekutor server lainnya: pesan demo berada secara lokal, dan HTML Bot tidak memiliki jaringan berdasarkan desain. Hubungan di antara keduanya belum dikonfirmasi oleh apa pun selain kebetulan waktu.