3 puntos por GN⁺ 2026-03-21 | 1 comentarios | Compartir por WhatsApp
  • Demo de terminal con funcionalidad mínima basada en la API C de libghostty, que funciona con un solo archivo C y renderizado con Raylib
  • Estructurado para validar las capacidades de libghostty-vt, mostrando una implementación de terminal basada en gráficos 2D en lugar de renderizado por GPU
  • Soporta funciones de nivel de un terminal real como reflujo de texto, color de 24 bits, manejo de Unicode y protocolos de mouse y teclado
  • Algunas funciones como Kitty Graphics Protocol y OSC para portapapeles y configuración de título aún no están implementadas, y tampoco incluye soporte para Windows
  • Aprovecha el núcleo de libghostty para ofrecer extensibilidad que permite combinar GUIs o renderizadores propios en distintas aplicaciones

Resumen de Ghostling

  • Ghostling es un proyecto de demostración de terminal con funcionalidad mínima basado en la API C de libghostty, presentado como un ejemplo compuesto por un solo archivo C
  • Usa Raylib para la gestión de ventanas y el renderizado, y opera con una arquitectura de un solo hilo
  • Para mostrar la flexibilidad de libghostty-vt, utiliza un renderizador gráfico 2D en lugar de renderizado directo por GPU
  • No es un terminal completo para uso diario, sino un ejemplo de implementación de terminal mínimo viable, por lo que la verificación de exactitud del código es limitada

Introducción a libghostty

  • Libghostty es una biblioteca embebible de emulación de terminal extraída del núcleo de Ghostty, y ofrece APIs para C y Zig
  • libghostty-vt es una biblioteca sin dependencias encargada de la gestión del estado del terminal, como el análisis de secuencias VT, posición del cursor, estilos y scrollback
    • No incluye código de renderizado ni de gestión de ventanas; las aplicaciones que la usan deben implementarlo por su cuenta
  • Basada en código validado en la GUI de Ghostty, ofrece emulación de terminal precisa y completa, parsing optimizado con SIMD, soporte avanzado de Unicode, uso eficiente de memoria y estabilidad respaldada por pruebas extensivas

Funciones principales

  • Soporte para cambio de tamaño de ventana con reflujo de texto
  • Soporte para color de 24 bits y paleta de 256 colores, además de estilos negrita, cursiva e inverso
  • Manejo de Unicode y grafemas de múltiples code points (aunque sin shaping ni layout)
  • Manejo de teclas modificadoras como Shift, Ctrl, Alt y Super
  • Soporte para Kitty Keyboard Protocol, seguimiento del mouse (X10, normal, button, any-event) y múltiples formatos de reporte del mouse (SGR, URxvt, UTF8, X10)
  • Soporte para rueda de desplazamiento y barra de desplazamiento arrastrable, además de reporte de foco (CSI I / CSI O)
  • Incluye la mayoría de las funciones de emulación de terminal al mismo nivel que la GUI de Ghostty

Funciones previstas

  • Funciones que aún no están completamente expuestas en libghostty-vt
    • Kitty Graphics Protocol

    • Soporte de portapapeles OSC

      • Configuración de título OSC
      • Soporte para Windows es posible en libghostty-vt, pero aún no está implementado en Ghostling
      • La lista se ampliará conforme se identifiquen funciones adicionales en el futuro

Funciones no incluidas

  • libghostty se enfoca en el núcleo de la emulación de terminal, por lo que no incluye funciones de la capa GUI
    • No incluye pestañas, múltiples ventanas, pantalla dividida, gestión de sesiones, archivo de configuración, GUI, interfaz de búsqueda, etc.
  • Estas funciones deben ser implementadas directamente por las aplicaciones que usen libghostty
  • Ghostling las excluye intencionalmente para mantener un ejemplo mínimo

Cómo compilar

  • Requisitos obligatorios: CMake 3.19 o superior, compilador de C y Zig 0.15.x en el PATH
  • Raylib se descarga automáticamente con FetchContent de CMake si no está instalado
  • Procedimiento de compilación básico
    cmake -B build -G Ninja  
    cmake --build build  
    ./build/ghostling  
    
  • Aviso: una compilación de depuración es muy lenta debido a las comprobaciones de seguridad y no es adecuada para benchmarking
  • Compilación Release
    cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release  
    cmake --build build  
    
  • Después de la configuración inicial, basta con ejecutar cmake --build build

FAQ

  • Por qué se usó C en lugar de Zig

    • libghostty-vt ofrece una API completa en Zig, pero la API de C está más difundida y es más accesible

      • Ghostling es una demo para mostrar un ejemplo mínimo de uso de la API C
  • Soporte para otros lenguajes como Rust

    • libghostty-vt puede funcionar sin dependencias a través de la API de C
    • Puede usarse desde la mayoría de los lenguajes con bindings ligeros, y los bindings oficiales se centran en C y Zig
    • Se espera que la comunidad desarrolle y mantenga bindings para varios lenguajes
  • Si Raylib es obligatorio

    • No es obligatorio. libghostty no impone restricciones sobre el renderizador ni el framework GUI
    • También puede funcionar de manera independiente en entornos WASM
    • Ofrece una API de estado de renderizado, por lo que puede combinarse con cualquier renderizador como Metal, OpenGL o Raylib
  • Por qué se eligieron CMake y Raylib

    • No depende de una tecnología específica, y CMake es un sistema de compilación genérico con amplio soporte
    • Raylib es una biblioteca simple y fácil de configurar para ventanas y renderizado 2D

      • El objetivo del proyecto es mostrar un ejemplo de uso de libghostty más que promover una elección tecnológica

1 comentarios

 
GN⁺ 2026-03-21
Comentarios de Hacker News
  • Estoy usando libghostty en Trolley
    Este proyecto empaqueta TUI como apps de escritorio, parecido a envolver una web app con Electron
    Solo le añadí un bundler de GUI y CLI, y funciona perfectamente incluso en Windows
    Estoy sinceramente impresionado con los desarrolladores de Ghostty

    • Estaría bueno que hubiera хотя sea una captura de pantalla en tu README de GitHub
      Creo que ayudaría a entender de inmediato qué tipo de chrome (marco/interfaz exterior) agrega la app alrededor del TUI
  • El archivo C es tan pequeño que pude leerlo completo en unos minutos
    Cerca de la línea 5 me sorprendió ver una forma poco común de incrustar la fuente con un header autogenerado
    Yo estaba acostumbrado al método de recursos de Windows, pero aquí la estructura genera un arreglo de bytes con código de CMake
    Fue un poco impactante y a la vez impresionante — sentí que por fin había encontrado la solución para la incrustación de recursos binarios multiplataforma

    • Comparto el script de build usado aquí
      Con el comando cmake -DINPUT=pixel.gif -DOUTPUT=pixel.h -DARRAY_NAME=pixel_gif -P bin2header.cmake
      pude convertir un GIF de 1x1 píxel en un arreglo de C
      La imagen queda tal cual dentro del header autogenerado como arreglo de bytes
    • Como dato curioso, los bitmaps XPM originalmente fueron diseñados para poder incluirse con #include sin modificaciones
      La wiki de X PixMap explica bien esa estructura
    • También se pueden generar arreglos así con el comando xxd del paquete vim
      Pero es ineficiente para recursos grandes — gcc/clang explotan en uso de memoria
      Por eso yo uso el proyecto LIEF
      Esto permite insertar recursos y luego volver a leerlos en binarios Windows PE, macOS Mach-O y Linux ELF
      Gracias a eso pude construir un sistema de empaquetado de recursos multiplataforma sin límites de tamaño
    • Como programador de Windows, me resultó interesante ver la llamada a DrawTextEx
      Fue una muestra que dejaba ver bien la expresividad de la librería Ghostty
      Las otras elecciones de librerías también fueron excelentes, y me inspiró a querer intentar hacer yo mismo una app de terminal
    • No coincido con la expresión “por fin lo encontré”
      Incluir binarios en el código fuente es una técnica vieja
      Esto era común en las líneas DATA de BASIC en los 70 y 80, y también en juegos de Atari ST y Amiga
      En Java también llegué a meter fuentes pixeladas directamente en archivos .java
      Tengo entendido que algunas fuentes del kernel de Linux también se manejan de esta forma
  • Este proyecto me parece interesante
    Yo no necesito pestañas ni gestión de sesiones en un emulador de terminal
    El WM se encarga de las ventanas y pestañas, y tmux maneja las sesiones, el scrollback, las búsquedas, etc.
    Así que terminales simples como urxvt, st o foot me bastaban
    Ghostty no era de mi gusto, pero esto sí parece algo que vale la pena probar
    Está previsto soporte para OSC, y estaría bien que agregaran un sistema de plugins menos engorroso que el de st