Term.everything - Ejecutar cualquier app GUI desde la terminal
(github.com/mmulet)- Programa CLI para Linux que permite ejecutar aplicaciones GUI directamente desde la terminal
- Usa un compositor Wayland propio para enviar la salida gráfica a la terminal en lugar de a un monitor
- También puede ejecutarse en entornos con
ssh, y permite usar navegadores web, gestores de archivos e incluso el juego Doom dentro de la terminal - La calidad de salida varía según la resolución de la terminal (número de filas y columnas), y en terminales con soporte de imágenes como iTerm2 y kitty también admite renderizado a resolución completa
- Está desarrollado con Typescript y bun, e incluye algo de código en C++; por ahora solo soporta algunas apps, pero sigue ampliándose con el objetivo de “Term everything❗”
Importancia del proyecto y ventajas comparativas
- A diferencia de los visores de archivos para terminal tradicionales o de herramientas simples de salida de imágenes, Term.everything puede ejecutar “todas” las aplicaciones GUI dentro de la terminal
- Puede usar interfaces GUI incluso en entornos de red, incluido SSH, lo que le da ventajas para administración de servidores y desarrollo remoto
- Aprovecha al máximo las capacidades de imagen de terminales modernas como kitty e iterm2, y ofrece opciones para mejorar resolución y tasa de fotogramas
Resumen general
- Term.everything es un programa CLI para Linux, y su rasgo principal es permitir ejecutar ventanas GUI directamente en la terminal
- Su pieza clave es un compositor basado en Wayland desarrollado por el proyecto, que renderiza la GUI en la terminal en vez de en un monitor normal
- Soporta tanto x11 como entornos basados en Wayland, y también puede usarse de forma remota mediante
ssh - La cantidad limitada de filas y columnas de la terminal afecta la calidad de la ventana; aumentar la resolución de la terminal puede mejorarla, aunque con posible impacto en el rendimiento
Principales casos de uso
- Ejecución de juegos: permite correr juegos como Fontemon o Doom (episodio shareware) dentro de la terminal
- Reproducción de video: reproduce la película Wing It!, con posibilidad de ajustar la resolución para equilibrar tasa de fotogramas y calidad de imagen
- Navegación web: permite conectarse a Ubuntu con iTerm2 +
sshy ejecutar Firefox - Alternativa a visores de archivos: en vez de crear un visor de archivos específico para terminal, se puede usar directamente un gestor de archivos GUI existente desde la terminal
- Ejecución recursiva: ejecutar otra terminal dentro de la terminal, es decir, un "terminal in a terminal"
Funcionamiento e información de desarrollo
-
Concepto básico
- En el pasado, para dibujar algo en pantalla, los programas podían escribir directamente en una región específica de la RAM
- En los sistemas modernos, el servidor de pantalla (Display Server) gestiona la entrada y salida, coordinando entradas como mouse y teclado, y salidas como gráficos e imágenes
- En Linux se usa principalmente el protocolo Wayland o X11, y Term.everything funciona sobre Wayland
-
Protocolo Wayland
- Wayland no es el servidor de pantalla en sí, sino un protocolo que define la comunicación entre el servidor y los programas
- Los programas entregan al servidor de pantalla el resultado que renderizan directamente, y el servidor lo muestra en pantalla
- Un punto importante es que no impone un modelo de renderizado → el programa puede dibujar de la forma que quiera
- Gracias a eso, la salida puede enviarse a otro lugar en vez de a la pantalla (por ejemplo, la terminal)
-
Procesamiento de salida en Term.everything
- Recibe la imagen dibujada por el cliente Wayland (la app GUI ejecutada) y la convierte en salida de caracteres para terminal
- Proceso de conversión:
- 1. Recibir los datos de imagen enviados por el cliente
- 2. Convertirlos en caracteres UTF-8 + códigos de escape ANSI
- 3. Para la conversión se usa la biblioteca chafa para mapear píxeles a caracteres de terminal
- La entrada se transmite al cliente Wayland mediante eventos de teclado y mouse enviados a través de stdin
-
Implementación real
- La idea central es sencilla, pero la implementación real requiere alrededor de diez mil líneas de código
- Está escrito en Typescript (basado en bun) y algo de C++, y cumple el rol de servidor de pantalla Wayland personalizado
- El código fuente puede revisarse en el directorio src/
-
Posibilidades de expansión
- Term.everything apunta a algo más que simplemente ejecutar una GUI en la terminal
- Con un servidor de pantalla personalizado basado en Wayland, también podría hacer posibles otras ideas experimentales
- Por ejemplo: conectar el dispositivo de salida no a una terminal, sino a otro medio completamente distinto (por ejemplo, una impresora, una obra de arte física, etc.)
9 comentarios
Una capa sobre otra
Esto sí es realmente geek jaja
¿Por qué a mí solo me aparece el logo y no funciona??
Yo usaba Synergy para controlar mi Mac personal desde la Mac de la empresa. Ahora vendí mi Mac personal y solo uso Linux, así que mi flujo de trabajo se volvió más engorroso.
Entonces, ¿con esta herramienta podría conectarme desde la terminal de la Mac de la empresa a mi escritorio Linux personal y hacer todo tipo de tareas libremente?
Me imagino que al equipo de seguridad no le va a gustar mucho.
Yo también soy un viejo lobo de mar en esto, supongo, pero ¿de verdad hace falta esto?
Parece que será útil para hacer experimentos web en el servidor (vía localhost).
Se refiere a cuando quieres resolverlo en local y probarlo antes de desplegarlo, ¿verdad?
Trabajar de forma remota, cuando era un entorno limitado por la dificultad de acceder a la red interna...
Si abres iTerm dentro de iTerm con term.everything... ¿funciona?
Comentarios en Hacker News
bash_completiondebería ser muchísimo más fácil de usar, en la práctica es más difícil de escribir de lo que parece, incluso copiar y pegar resulta engorroso, los desarrolladores listos crean apps que encajan bien conbash_completiondesde el principio, por ejemplo, si el primer argumento clave es amigable con bash, con una estructura comomycli myfunc ...puedes descubrir todas las funciones de inmediato con una sola tecla Tab, ni siquiera hace falta anunciar funciones nuevas, si solo las quitas del completion no rompes scripts existentes y puedes deprecar funcionalidades de forma natural, al final todo termina estando en el CLI porque alguien ya hizo ese trabajo antes