3 pontos por GN⁺ 2026-03-21 | 1 comentários | Compartilhar no WhatsApp
  • Um demo de terminal com funcionalidade mínima baseado na API C do libghostty, operando com um único arquivo C e renderização com Raylib
  • Estruturado para validar os recursos do libghostty-vt, mostrando uma implementação de terminal baseada em gráficos 2D em vez de renderização por GPU
  • Suporta recursos em nível de terminal real, como reflow de texto, cor de 24 bits, processamento de Unicode e protocolos de mouse e teclado
  • Alguns recursos, como Kitty Graphics Protocol e OSC para área de transferência e definição de título, ainda não foram implementados, e o suporte a Windows também não está incluído
  • Aproveitando o núcleo do libghostty, oferece extensibilidade para que vários aplicativos combinem sua própria GUI ou renderizador

Visão geral do Ghostling

  • Ghostling é um projeto de demonstração de terminal com funcionalidade mínima baseado na API C do libghostty, e é um exemplo composto por um único arquivo C
  • Usa Raylib para gerenciamento de janela e renderização, operando em uma arquitetura de thread única
  • Para mostrar a flexibilidade do libghostty-vt, usa um renderizador gráfico 2D em vez de renderização direta por GPU
  • Não é um terminal completo para uso diário, mas um exemplo mínimo viável de implementação de terminal, com verificação limitada da correção do código

Introdução ao libghostty

  • Libghostty é uma biblioteca embarcável de emulação de terminal extraída do núcleo do Ghostty, oferecendo APIs em C e Zig
  • libghostty-vt é uma biblioteca sem dependências, responsável pelo gerenciamento do estado do terminal, como parsing de sequências VT, posição do cursor, estilos e scrollback
    • Não inclui código de renderização nem de gerenciamento de janelas; os aplicativos que a utilizam devem implementar isso diretamente
  • Baseado em código validado na GUI do Ghostty, oferece emulação de terminal precisa e completa, parsing otimizado com SIMD, suporte avançado a Unicode, uso eficiente de memória e estabilidade baseada em testes extensivos

Principais recursos

  • Suporte a redimensionamento de janela com reflow de texto
  • Suporte a cor de 24 bits e paleta de 256 cores, além de estilos negrito, itálico e vídeo reverso
  • Tratamento de Unicode e grafemas com múltiplos code points (mas sem shaping nem layout)
  • Tratamento de teclas modificadoras como Shift, Ctrl, Alt e Super
  • Suporte a Kitty Keyboard Protocol, rastreamento de mouse (X10, normal, button, any-event) e múltiplos formatos de relatório de mouse (SGR, URxvt, UTF8, X10)
  • Suporte a roda de rolagem e barra de rolagem arrastável, além de relato de foco (CSI I / CSI O)
  • Inclui a maior parte dos recursos de emulação de terminal no mesmo nível da GUI do Ghostty

Recursos planejados

  • Recursos que ainda não estão totalmente expostos no libghostty-vt
    • Kitty Graphics Protocol

    • Suporte a clipboard via OSC

      • Definição de título via OSC
      • O suporte a Windows é possível no libghostty-vt, mas ainda não foi implementado no Ghostling
      • A lista deve ser expandida conforme novos recursos forem identificados no futuro

Recursos não fornecidos

  • Como o libghostty se concentra no núcleo da emulação de terminal, ele não inclui recursos da camada de GUI
    • Abas, múltiplas janelas, tela dividida, gerenciamento de sessão, arquivos de configuração, GUI, UI de busca etc. não estão incluídos
  • Esses recursos devem ser implementados diretamente pelos aplicativos que usam o libghostty
  • O Ghostling exclui intencionalmente esses recursos para manter o exemplo mínimo

Como compilar

  • Requisitos obrigatórios: CMake 3.19 ou superior, compilador C e Zig 0.15.x no PATH
  • Raylib será baixado automaticamente com o FetchContent do CMake caso não esteja instalado
  • Procedimento básico de build
    cmake -B build -G Ninja  
    cmake --build build  
    ./build/ghostling  
    
  • Atenção: builds de debug são muito lentos devido às verificações de segurança e não são adequados para benchmark
  • Build Release
    cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release  
    cmake --build build  
    
  • Após a configuração inicial, basta executar cmake --build build

FAQ

  • Por que usar C em vez de Zig

    • O libghostty-vt** fornece uma API Zig completa, mas a** API C é mais amplamente usada e mais acessível

      • O Ghostling é um demo para mostrar um exemplo mínimo de uso da API C
  • Suporte a outras linguagens, como Rust

    • libghostty-vt pode funcionar sem dependências por meio da API C
    • Pode ser usado na maioria das linguagens com apenas bindings leves, e os bindings oficiais são centrados em C e Zig
    • Espera-se que a comunidade desenvolva e mantenha bindings para várias linguagens
  • O Raylib é obrigatório?

    • Não é obrigatório. O libghostty não impõe restrições quanto a renderizador ou framework de GUI
    • Também pode operar de forma independente em ambientes WASM
    • Fornece uma API de estado de renderização, permitindo integração com qualquer renderizador, como Metal, OpenGL ou Raylib
  • Por que escolher CMake e Raylib

    • Não está preso a uma tecnologia específica, e o CMake é um sistema de build genérico com amplo suporte
    • O Raylib** é uma biblioteca simples e fácil de configurar** para janelas e renderização 2D

      • O objetivo do projeto é mostrar um exemplo de uso do libghostty mais do que a escolha de tecnologias

1 comentários

 
GN⁺ 2026-03-21
Comentários do Hacker News
  • Estou usando libghostty no Trolley
    Este projeto empacota TUIs como apps de desktop, de forma parecida com envolver um app web em Electron
    Basicamente só adiciona uma GUI e um empacotador de CLI, e ainda assim funciona perfeitamente no Windows
    Fiquei sinceramente impressionado com os desenvolvedores do Ghostty

    • Seria bom ter pelo menos uma captura de tela no README do seu GitHub
      Acho que ajudaria a entender de imediato que tipo de chrome (moldura da UI) o app adiciona em torno da TUI
  • O arquivo C é pequeno, então deu para ler tudo em poucos minutos
    Lá pela quinta linha, fiquei surpreso ao ver uma abordagem incomum de embutir a fonte com um header gerado automaticamente
    Eu estava acostumado com o método de recursos do Windows, mas aqui a estrutura gerava um array de bytes com código CMake
    Foi meio chocante e ao mesmo tempo impressionante — parecia que eu finalmente tinha encontrado a solução para embutir recursos binários multiplataforma

    • Compartilhando o script de build usado aqui
      Com o comando cmake -DINPUT=pixel.gif -DOUTPUT=pixel.h -DARRAY_NAME=pixel_gif -P bin2header.cmake
      foi possível converter um GIF de 1x1 pixel em um array C
      A imagem entra no header gerado automaticamente exatamente como um array de bytes
    • Um fato curioso é que os bitmaps XPM foram originalmente projetados para poderem ser usados com #include sem modificações
      A wiki do X PixMap explica bem essa estrutura
    • Também dá para criar esse tipo de array com o comando xxd do pacote vim
      Mas isso é ineficiente para recursos grandes — gcc/clang explodem a memória
      Por isso eu uso o projeto LIEF
      Ele permite inserir recursos em binários Windows PE, macOS Mach-O e Linux ELF e depois lê-los de volta
      Com isso, consegui montar um sistema de empacotamento de recursos multiplataforma sem limite de tamanho
    • Como programador Windows, foi interessante ver a chamada a DrawTextEx
      Foi um exemplo que mostrou bem a expressividade da biblioteca Ghostty
      As outras escolhas de biblioteca também foram excelentes, e isso me inspirou a tentar criar um app de terminal eu mesmo
    • Não concordo com a expressão “finalmente encontrei”
      Incluir binários no código-fonte é uma técnica antiga
      Isso já era comum nas linhas DATA do BASIC dos anos 70 e 80, e também em jogos de Atari ST e Amiga
      No Java também já colocaram fontes pixel a pixel diretamente em arquivos .java
      Ouvi dizer que algumas fontes do kernel Linux também são tratadas assim
  • Este projeto é interessante
    Eu não preciso de abas nem de gerenciamento de sessões em um emulador de terminal
    O WM gerencia janelas e abas, e o tmux cuida de sessões, scrollback, busca etc.
    Então terminais simples como urxvt, st e foot sempre foram suficientes para mim
    Ghostty não era muito do meu gosto, mas este vale testar
    Está previsto suporte a OSC, e seria bom adicionar um sistema de plugins menos trabalhoso do que o do st