از نسخه بتای 12.10.283300 مورخ 8 اکتبر، کلاینت تلگرام برای macOS شامل ماژول HTMLBubbles است: پیام‌هایی که با HTML و CSS طراحی شده‌اند، با جاوااسکریپت داخلی، که مستقیماً در حباب چت نمایش داده می‌شوند، بدون نیاز به پنجره مینی‌اپ. در 11 اکتبر، در بیلد 13.0.283309، کتابخانه three.js و سه بازی سه‌بعدی با کنترل‌های جهت‌دار به آن اضافه شد. این قابلیت فعلاً فقط برای کسانی است که در کانال بتای macOS هستند: ماژول روی مکالمات نمایشی که در خود بیلد تعبیه شده‌اند کار می‌کند و هیچ نوع پیام سروری برای آن در طرح API وجود ندارد.

The post on Telegram — @gramnews
پیام‌های HTML در بتای تلگرام برای macOS

آنچه در بیلد وجود دارد

بتای macOS از طریق فید به‌روزرسانی mac-updates.telegram.org توزیع می‌شود، و هر بیلد یک فایل zip معمولی حاوی برنامه است. در نسخه 12.10.283299 ماژولی وجود ندارد، اما در نسخه 12.10.283300، بسته HTMLBubbles_HTMLBubbles.bundle در کنار منابع ظاهر می‌شود. این بیلد در همان روز بررسی و تحلیل شد.

داخل این بسته، دوازده فایل .chat وجود دارد. این‌ها داده‌های سرور نیستند، بلکه سناریوهای مکالمات نمایشی هستند: عنوان، لیست شرکت‌کنندگان با رنگ آواتارها و پیام‌ها، که هر کدام یک قطعه HTML با <style> و <script> مخصوص به خود هستند. نام‌ها خود گویای وظیفه هستند: «Design Crew»، «Deploy Bot»، «Stress Test»، «Playground»، «Long Reads»، «Trip to Lisbon»، «Shop Assistant»، «Analytics»، «Live Scripts»، «Code Review»، «Game Night»، «Motion Lab». زیرنویس «Stress Test» مستقیماً به موتور اشاره می‌کند — «آنچه litehtml می‌تواند رندر کند و آنچه نمی‌تواند».

در رشته‌های فایل اجرایی، کاتالوگی از پیام‌های نمایشی، حدود پنجاه کارت وجود دارد: کارت پرواز با تب‌های روزانه، صفحه محصول با انتخاب اندازه و رنگ، قیف تبدیل، حفظ مشتریان (cohort retention)، یک pull request با دکمه Approve، یک بیلد CI با دکمه‌های Promote و Roll back، بازی دوز (tic-tac-toe) در برابر ربات، تاس‌هایی «که واقعاً می‌غلتند»، یک پخش‌کننده موسیقی با اکولایزر زنده و پاسخی «که خودش را مانند هوش مصنوعی تایپ می‌کند».

یک ربات چت جداگانه، HTML Bot، خود را اینگونه معرفی می‌کند: هر پاسخ HTML و CSS است، بدون نیاز به شبکه؛ برای انتخاب پیام، / را تایپ کنید. همچنین قانونی برای کد خودتان وجود دارد: هر HTML با استایل‌ها و اسکریپت به صورت تمام عرض و بدون حباب نمایش داده می‌شود، اما اگر در <div class="widget"> قرار گیرد، داخل حباب نمایش داده می‌شود.

آنچه بیلد 11 اکتبر اضافه کرد

در نسخه 13.0.283309، دو مورد به بسته اضافه شد. اولی lib/three.js با حجم 1.27 مگابایت: کتابخانه three.js با بازبینی r160 تحت مجوز MIT، که طبق توضیحات در خط اول فایل، «برای پیام‌های HTML» بازسازی شده است — ماژول به عنوان یک اسکریپت اجرا می‌شود و خود را در شیء سراسری THREE قرار می‌دهد. پیام آن را نه با آدرس شبکه، بلکه با یک لینک داخلی app:three متصل می‌کند.

دومی، سیزدهمین مکالمه، «3D Lab»، با زیرنویس «صحنه‌های three.js، رندر شده توسط رندرکننده Metal برنامه». در آن سه پیام وجود دارد: بازی آرکید Chicken Cross که در آن مرغ از جاده‌ها عبور می‌کند، صحنه نمایشی «three.js on Metal» و شطرنج در برابر ربات. کنترل‌ها در Chicken Cross — کلیدهای جهت‌دار یا WASD پس از کلیک روی صفحه، Esc فوکوس را آزاد می‌کند؛ دکمه‌های تکراری برای ماوس زیر صفحه وجود دارد.

The post on Telegram — @gramnews
three.js و بازی‌های سه‌بعدی در پیام‌های بتای تلگرام برای macOS

همچنین پوشه ported با بیش از صد فایل HTML جداگانه ظاهر شد — همان پیام‌های نمایشی، که در مکالمات مختلف چیده شده‌اند. رشته «twidget has no port of this card» در باینری، هدف را نشان می‌دهد: کارت‌ها به موتور رندرینگ دوم منتقل می‌شوند و بررسی می‌شود که کدام یک منتقل شده‌اند.

این برای کاربران و توسعه‌دهندگان ربات‌ها چه معنایی دارد

تلگرام پایدار برای macOS، Telegram Desktop، iOS و Android چنین پیام‌هایی را نمایش نمی‌دهند. در نسخه بتا، ماژول روی مکالمات نمایشی خود کار می‌کند: ارسال پیام HTML با اسکریپت به مخاطب از طریق سرور امکان‌پذیر نیست — در طرح API (لایه 230) نوع پیامی وجود ندارد که نشانه‌گذاری اصلی را با استایل‌ها و اسکریپت به گیرنده تحویل دهد.

نزدیک‌ترین قابلیت عمومی، Rich Messages است که در 11 ژوئن 2026 در Bot API 10.1 ظاهر شد. ربات می‌تواند پیامی را در HTML یا Markdown از طریق sendRichMessage ارسال کند، اما مستندات HTML را فقط به عنوان یک روش نوشتن توصیف می‌کند: هر تگ به یک بلوک از مجموعه ثابتی تبدیل می‌شود — پاراگراف، عنوان، لیست، جدول، نقل قول، بلوک قابل گسترش، فرمول، عکس، ویدئو. در طرح API این موضوع در انواع داده‌ها قابل مشاهده است: inputRichMessageHTML با یک رشته نشانه‌گذاری به عنوان ورودی پذیرفته می‌شود، و گیرنده richMessage را با لیستی از بلوک‌ها می‌بیند — همان‌هایی که صفحات Instant View از آن‌ها ساخته می‌شوند. Bot API هیچ تگ <script> یا <style> را در میان موارد پشتیبانی شده لیست نمی‌کند.

بیلد هیچ ارتباطی بین HTMLBubbles و Rich Messages نشان نمی‌دهد: مکالمات نمایشی از بسته داخل برنامه بارگذاری می‌شوند، نه از پیام‌های سرور. متون نمایشی به زبان انگلیسی در باینری تعبیه شده‌اند و در پلتفرم ترجمه macOS وجود ندارند.

نحوه رندر شدن پیام در حباب

مسیر اصلی بدون مرورگر انجام می‌شود. نشانه‌گذاری توسط litehtml تجزیه می‌شود — یک موتور رندرینگ HTML و CSS متن‌باز تحت مجوز BSD، که خودش چیزی را رندر نمی‌کند: عناصر را بر اساس مختصات مرتب می‌کند و رندرینگ را به برنامه واگذار می‌کند. HTML را با تجزیه‌کننده Gumbo می‌خواند، و رشته‌های اشکال‌زدایی Gumbo («Entering adoption agency algorithm»، «Noah's ark clause») همراه با آن وارد باینری شده‌اند. رندرینگ توسط خود برنامه انجام می‌شود، و HTML Bot در رشته‌های خود سه حالت مقایسه دارد: litehtml، litehtml-gpu — همان رندرینگ با خروجی از طریق Metal — و twidget (WebKit).

اسکریپت در چنین پیامی مستقیماً نشانه‌گذاری را تغییر نمی‌دهد. این اسکریپت تابع render() را اعلام می‌کند که یک رشته HTML را برای وضعیت فعلی برمی‌گرداند، و همچنین کنترل‌کننده‌ها: onAction(name, value) — برای کلیک روی عنصری با ویژگی data-action، onKey، onPointer و onFocus — برای بازی‌ها. پس از هر رویداد، کلاینت render() را فراخوانی می‌کند و حباب را در جای خود دوباره رندر می‌کند. علاوه بر این — مجموعه‌ای از کمک‌کننده‌ها برای انیمیشن: tween()، animate()، منحنی‌های ease.*، transition('pop') برای تغییر محتوای بومی. HTML استاتیک اطراف <script> به عنوان یک نمای پشتیبان عمل می‌کند، اگر اسکریپت اجرا نشود.

طبق متن نمایشی «Live Scripts»، هر اسکریپت در sandbox مخصوص به خود در JavaScriptCore — موتور جاوااسکریپت موجود در macOS — اجرا می‌شود. با کلیک راست روی کارت، «Script Log…» با کنسول آن باز می‌شود، و دستور /stats در چت با HTML Bot، زمان رندر فریم، نرخ فریم، پردازنده و حافظه را بالای هر پیام فعال می‌کند — ابزاری برای اندازه‌گیری، نه برای کاربر.

Sandbox و شبکه

دموی «Runaway scripts the sandbox stops» محدودیت‌ها را مستقیماً در کارت‌ها نشان می‌دهد: یک حلقه بی‌نهایت هنگام بارگذاری، طبق متن آن‌ها، JavaScriptCore را پس از 50 میلی‌ثانیه قطع می‌کند و HTML استاتیک را باقی می‌گذارد؛ کارتی با دکمه Hang چنین حلقه‌ای را در onAction راه‌اندازی می‌کند؛ تایمری که هر 100 میلی‌ثانیه پردازنده را برای 40 میلی‌ثانیه مشغول می‌کند، از بودجه 200 میلی‌ثانیه زمان پردازنده در ثانیه فراتر می‌رود.

حالت WebKit در ماژول جداگانه WidgetSandbox زندگی می‌کند و با سه لایه به طور همزمان از شبکه محافظت می‌شود. صفحه یک سیاست امنیتی محتوا با connect-src 'none' و اسکریپت‌ها فقط با یک کلید یک‌بار مصرف دریافت می‌کند؛ لیستی از قوانین به WebView متصل است که تمام آدرس‌های http، https، ws، wss و ftp را مسدود می‌کند؛ قبل از کد پیام، fetch، XMLHttpRequest، WebSocket، EventSource، RTCPeerConnection، workerها و window.open از پنجره حذف می‌شوند. تصاویر و رسانه‌ها فقط از data: و blob: مجاز هستند، فایل‌هایی مانند three.js توسط کنترل‌کننده داخلی طرح ارائه می‌شوند.

صحنه‌های سه‌بعدی چگونه ساخته می‌شوند

بازی‌های «3D Lab» با کد معمولی three.js نوشته شده‌اند: صحنه، دوربین ارتوگرافیک، نور با سایه‌ها، هندسه از مکعب‌ها. رندرکننده به عنوان THREE.WebGLRenderer ایجاد می‌شود، اما با پارامتر cornerRadius که three.js آن را ندارد — این پارامتر فقط توسط پوشش برنامه درک می‌شود. در باینری، پوششی برای حالت صفحه‌ای WebKit وجود دارد: این پوشش WebGLRenderer را با یک فرزند جایگزین می‌کند، بوم آن را در عنصری با ویژگی data-3d قرار می‌دهد، اندازه را نظارت می‌کند و کلیدهای جهت‌دار، WASD، فاصله و Enter را به onKey بازی منتقل می‌کند — با Cmd، Ctrl یا Alt، کلیدها به برنامه می‌روند.

در حباب، طبق زیرنویس مکالمه، همان صحنه توسط رندرکننده Metal برنامه رندر می‌شود؛ در ماژول کلاس‌های HTMLBubbleGPU، HTMLBubbleGPUPool و بافرهایی برای منابع Metal وجود دارد. در مک‌هایی که Metal ندارند، بازی یک جایگزین «3D needs a Mac with Metal» را نمایش می‌دهد.

Telegram Serverless و tgcloud.ai

نه در بسته HTMLBubbles، نه در رشته‌های باینری، و نه در طرح API، هیچ اشاره‌ای به Telegram Serverless، tgcloud.ai یا هر سرویس‌دهنده اجرایی دیگری وجود ندارد: پیام‌های نمایشی به صورت محلی ذخیره می‌شوند، و HTML Bot به طور پیش‌فرض به شبکه دسترسی ندارد. ارتباط بین آن‌ها فعلاً با هیچ چیز دیگری جز همزمانی تأیید نمی‌شود.