Desde la build beta 12.10.283300 del 8 de octubre, el cliente de Telegram para macOS incluye el módulo HTMLBubbles: mensajes maquetados en HTML y CSS, con JavaScript incrustado, que residen directamente en la burbuja del chat, sin necesidad de una ventana de mini-aplicación. El 11 de octubre, en la build 13.0.283309, se añadió la librería three.js y tres juegos 3D con control por flechas. Por ahora, esto solo afecta a quienes están en el canal beta de macOS: el módulo funciona con conversaciones de demostración integradas en la propia build, y no existe un tipo de mensaje de servidor para ello en el esquema de la API.

The post on Telegram — @gramnews
Mensajes HTML en la beta de Telegram para macOS

Qué contiene la build

La beta de macOS se distribuye a través del feed de actualizaciones mac-updates.telegram.org, y cada build es un archivo zip normal con la aplicación. En la 12.10.283299 no hay módulo, pero en la 12.10.283300, junto a los recursos, aparece el paquete HTMLBubbles_HTMLBubbles.bundle. La build fue desensamblada el mismo día.

Dentro del paquete hay doce archivos .chat. Estos no son datos del servidor, sino guiones de conversaciones de demostración: un título, una lista de participantes con colores de avatar y mensajes, cada uno de los cuales es un fragmento de HTML con sus propios <style> y <script>. Los nombres hablan por sí solos sobre la tarea: «Design Crew», «Deploy Bot», «Stress Test», «Playground», «Long Reads», «Trip to Lisbon», «Shop Assistant», «Analytics», «Live Scripts», «Code Review», «Game Night», «Motion Lab». El subtítulo de «Stress Test» nombra directamente el motor: «lo que litehtml soporta y lo que no».

En las cadenas del archivo ejecutable se encuentra un catálogo de mensajes de demostración, unas cincuenta tarjetas: una tarjeta de embarque con pestañas por días, una página de producto con selección de tamaño y color, un embudo de conversión, retención de cohortes, un pull request con un botón Approve, una compilación CI con botones Promote y Roll back, un tres en raya contra un bot, dados «que realmente ruedan», un reproductor de música con ecualizador en vivo y una respuesta «que se escribe sola, como una IA».

Un bot interlocutor separado, HTML Bot, se presenta así: cada respuesta es HTML y CSS, sin red; escriba / para seleccionar un mensaje. También hay una regla para el código propio: cualquier HTML con estilos y script se muestra a ancho completo sin burbuja, y si está envuelto en <div class="widget">, se muestra dentro de la burbuja.

Qué añadió la build del 11 de octubre

En la 13.0.283309, aparecieron dos cosas en el paquete. La primera es lib/three.js con un peso de 1.27 MB: la librería three.js de la revisión r160 bajo licencia MIT, recompilada, según un comentario en la primera línea del archivo, «para mensajes HTML»; el módulo se ejecuta como un solo script y se coloca en el objeto global THREE. El mensaje la conecta no por una dirección de red, sino por un enlace interno app:three.

La segunda es la decimotercera conversación, «3D Lab», con el subtítulo «escenas three.js renderizadas por el motor Metal de la aplicación». Contiene tres mensajes: el arcade Chicken Cross, donde un pollo cruza carreteras, una escena de demostración «three.js on Metal» y ajedrez contra un bot. El control en Chicken Cross es con las flechas o WASD después de hacer clic en el campo, Esc libera el foco; debajo del campo hay botones duplicados para el ratón.

The post on Telegram — @gramnews
three.js y juegos 3D en los mensajes de la beta de Telegram para macOS

También apareció una carpeta ported con más de cien archivos HTML individuales, los mismos mensajes de demostración, organizados por conversaciones. La cadena «twidget has no port of this card» en el binario sugiere el propósito: las tarjetas se portan a un segundo motor de renderizado y se verifica cuáles se han migrado.

Qué significa esto para usuarios y desarrolladores de bots

El Telegram estable para macOS, Telegram Desktop, iOS y Android no muestran este tipo de mensajes. En la beta, el módulo funciona con sus propias conversaciones de demostración: no hay forma de enviar un mensaje HTML con un script a un interlocutor a través del servidor, ya que en el esquema de la API (capa 230) no existe un tipo de mensaje que entregue el marcado original con estilos y scripts al destinatario.

Lo más cercano públicamente son los Rich Messages, que aparecieron en la Bot API 10.1 el 11 de junio de 2026. Un bot puede enviar un mensaje en HTML o Markdown a través de sendRichMessage, pero la documentación describe HTML solo como un método de escritura: cada etiqueta se reduce a un bloque de un conjunto fijo (párrafo, encabezado, lista, tabla, cita, bloque desplegable, fórmula, foto, video). En el esquema de la API esto se ve por los tipos: se acepta inputRichMessageHTML con una cadena de marcado, y el destinatario ve richMessage con una lista de bloques, los mismos con los que se construyen las páginas de Instant View. La Bot API no enumera las etiquetas <script> ni <style> entre las soportadas.

La build no muestra ninguna conexión entre HTMLBubbles y Rich Messages: las conversaciones de demostración se cargan desde el paquete dentro de la aplicación, no desde mensajes del servidor. Los textos de las demos están incrustados en el binario en inglés, y no están en la plataforma de traducción de macOS.

Cómo se dibuja un mensaje en la burbuja

La ruta principal prescinde del navegador. El marcado es analizado por litehtml, un motor de maquetación HTML y CSS de código abierto bajo licencia BSD, que no dibuja nada por sí mismo: organiza los elementos por coordenadas y delega el renderizado a la aplicación. Lee HTML con el analizador Gumbo, y las cadenas de depuración de Gumbo («Entering adoption agency algorithm», «Noah's ark clause») llegaron al binario junto con él. La aplicación realiza el renderizado por sí misma, y HTML Bot tiene tres modos de comparación en sus cadenas: litehtml, litehtml-gpu (la misma maquetación con salida a través de Metal) y twidget (WebKit).

El script en dicho mensaje no modifica el marcado directamente. Declara una función render() que devuelve una cadena HTML para el estado actual, y manejadores: onAction(name, value) para clics en elementos con el atributo data-action, onKey, onPointer y onFocus para juegos. Después de cada evento, el cliente llama a render() y vuelve a dibujar la burbuja en su lugar. Además de esto, hay un conjunto de ayudantes para la animación: tween(), animate(), curvas ease.*, transition('pop') para un cambio de contenido nativo. El HTML estático alrededor de <script> sirve como vista de respaldo si el script no se ejecuta.

Según el texto de la demo «Live Scripts», cada script se ejecuta en su propia sandbox de JavaScriptCore, el motor JavaScript incluido en macOS. Al hacer clic derecho en una tarjeta, se abre «Script Log…» con su consola, y el comando /stats en el chat con HTML Bot activa, sobre cada mensaje, el tiempo de renderizado de fotogramas, la frecuencia de fotogramas, la CPU y la memoria, una herramienta para mediciones, no para el usuario.

Sandbox y red

La demo «Runaway scripts the sandbox stops» muestra los límites directamente en las tarjetas: un bucle infinito al cargar, según su texto, JavaScriptCore lo interrumpe después de 50 ms y deja el HTML estático; una tarjeta con el botón Hang inicia el mismo bucle dentro de onAction; un temporizador que cada 100 ms ocupa la CPU durante 40 ms excede el presupuesto de 200 ms de tiempo de CPU por segundo.

El modo WebKit reside en un módulo separado, WidgetSandbox, y está aislado de la red por tres capas a la vez. La página recibe una política de seguridad de contenido con connect-src 'none' y scripts solo con una clave de un solo uso; a WebView se le conecta una lista de reglas que bloquea todas las direcciones http, https, ws, wss y ftp; antes del código del mensaje, se eliminan de la ventana fetch, XMLHttpRequest, WebSocket, EventSource, RTCPeerConnection, los workers y window.open. Las imágenes y los medios solo están permitidos desde data: y blob:, archivos como three.js son entregados por un manejador de esquema interno.

Cómo se estructuran las escenas 3D

Los juegos de «3D Lab» se escriben con código three.js estándar: una escena, una cámara ortográfica, luz con sombras, geometría de cubos. El renderizador se crea como THREE.WebGLRenderer, pero con un parámetro cornerRadius que three.js no tiene; solo lo entiende la envoltura de la aplicación. En el binario se encuentra la envoltura para el modo de página WebKit: sustituye WebGLRenderer por un descendiente, inserta su lienzo en un elemento con el atributo data-3d, monitorea el tamaño y pasa las flechas, WASD, espacio y Enter a onKey del juego; con Cmd, Ctrl o Alt, las teclas van a la aplicación.

En la burbuja, según el subtítulo de la conversación, la misma escena es dibujada por el renderizador Metal de la aplicación; el módulo contiene las clases HTMLBubbleGPU, HTMLBubbleGPUPool y búferes para los recursos de Metal. En un Mac sin Metal, el juego muestra un marcador de posición «3D needs a Mac with Metal».

Telegram Serverless y tgcloud.ai

Ni en el paquete HTMLBubbles, ni en las cadenas del binario, ni en el esquema de la API hay referencias a Telegram Serverless, tgcloud.ai o cualquier otro ejecutor de servidor: los mensajes de demostración están localmente, y HTML Bot no tiene red por diseño. La conexión entre ellos aún no está confirmada por nada, excepto por la coincidencia en el tiempo.