Estudo de caso · Stack

Como a Raycast construiu um launcher nativo que roda no Mac e no Windows

A Raycast é um launcher de teclado com extensões, chat de IA e busca de arquivos. Começou como um app de Mac todo em Swift e AppKit, e na versão 2.0 virou um híbrido: cascas nativas finas, uma interface única em React dentro das web views do sistema, um núcleo em Node.js e Rust onde a velocidade importa.
Copiar stackraycast.com Launcher de produtividade para Mac e Windows · Reino Unido · fundada em 2020

A stack da Raycast

Abrir no montador

Linguagem

  • Swiftraycast.com

    É a linguagem do app host no macOS, que cuida de janelas, atalhos e barra de menu.

  • TypeScriptraycast.com

    É a linguagem do front, do núcleo em Node e das extensões da comunidade.

Biblioteca de interface

  • AppKitraycast.com

    Dá a camada nativa do app no macOS.

    Por quê: Não tinham certeza de que o SwiftUI não aumentaria os travamentos ou pioraria o desempenho.

  • Reactraycast.com

    Monta a interface única de todas as janelas e a API das extensões.

    Por quê: Um só código de interface web atende os dois sistemas, enquanto as cascas nativas mantêm acesso total às APIs do sistema.

  • WebKitraycast.com

    Desenha a interface no macOS pelo WKWebView do sistema, e o WebView2 faz o mesmo no Windows.

    Por quê: Não queriam embutir o Chromium no macOS se o WebKit do sistema já estava lá.

Framework full-stack

  • .NETraycast.com

    Roda o app host no Windows, escrito em C# com .NET 8 e WPF.

Build e runtime

  • esbuildraycast.com

    Transpila o TypeScript das extensões dentro da CLI ray.

  • Goraycast.com

    É a linguagem da CLI ray, que quem faz extensão usa para compilar e publicar.

Busca de dados

  • JSON-RPCraycast.com

    Leva as mensagens entre o runtime das extensões e o app pelos streams padrão.

    Por quê: É leve, bem suportado, rápido o bastante e fácil de depurar por ser texto puro.

Framework de servidor

  • Node.jsraycast.com

    Roda um processo de longa duração com acesso ao banco, o runtime das extensões e outros serviços.

    Por quê: O Node é a camada comum aos dois sistemas, então cada recurso é feito uma vez só.

  • Rustraycast.com

    Move a camada de dados compartilhada, a sincronização na nuvem e o indexador de arquivos.

    Por quê: Usam onde desempenho ou portabilidade importam mais que a comodidade.

Modelo de IA

  • OpenAIraycast.com

    Foi o primeiro e, por um tempo, o único fornecedor de modelos da Raycast AI.

  • Anthropicraycast.com

    Fornece os modelos Claude oferecidos na Raycast AI.

    Por quê: Nenhum modelo é o melhor em velocidade, inteligência e contexto ao mesmo tempo, então o usuário escolhe para cada tarefa.

Como montaram

Nativo desde o começo

O app original para Mac foi escrito em Swift com AppKit. O time deixou o SwiftUI de lado porque não tinha certeza de que ele não aumentaria os travamentos ou pioraria o desempenho, coisas que um launcher aberto dezenas de vezes por dia não pode ter.

Fontes:raycast.com

Extensões em React, desenhadas como interface nativa

A Raycast queria que as extensões parecessem parte do app, e não um mini-app dentro de uma moldura web. Quem desenvolve escreve em React e TypeScript, e um reconciler próprio do React transforma os componentes numa árvore em JSON que o lado em Swift desenha com AppKit, comparando cada render com JSON Patch.

A primeira tentativa rodava as extensões no JavaScriptCore, mas ninguém conseguia usar os pacotes npm de sempre. Aí a Raycast passou para o Node.js, com cada extensão numa worker thread própria, limite de memória e travamento isolado, conversando com o app por JSON-RPC 2.0.

Fontes:raycast.com

Raycast 2.0: um stack híbrido para chegar ao Windows

Para chegar ao Windows, a Raycast reescreveu o app do zero. Cada sistema tem um host nativo (Swift e AppKit no macOS, C# com .NET 8 e WPF no Windows) que carrega um front único em React e TypeScript na web view do sistema e cuida de um processo Node.js de longa duração com as regras de negócio.

O time avaliou Electron, Tauri, Flutter, Qt e React Native para desktop. O Electron complicava a integração profunda com o sistema e obrigava a embutir o Chromium no macOS, e o Tauri dava menos controle nativo e parecia novo demais para apostar a empresa nele. O preço é manter a própria comunicação entre processos, e o app passou a usar mais memória que a versão 1.

Fontes:raycast.com

Rust onde desempenho e portabilidade contam

O Rust fica nos pontos em que desempenho ou portabilidade pesam mais que a comodidade: uma camada de dados que o app de iOS também usa, a sincronização na nuvem e um indexador de arquivos que roda num processo à parte.

O indexador existe porque o Windows não tem um índice do sistema bom o bastante para a Raycast. Lá, ele lê direto a Master File Table do NTFS para varrer os discos rápido.

Fontes:raycast.com raycast.com

De um fornecedor de IA para vários

A Raycast AI começou só com modelos da OpenAI. Em abril de 2024, depois de muito pedido da comunidade, entraram Anthropic, Perplexity e modelos abertos servidos pela Groq, com o argumento de que nenhum modelo ganha ao mesmo tempo em velocidade, inteligência e tamanho de contexto.

Fontes:raycast.com

Também detectado no site

Achado na página inicial com as regras abertas do Wappalyzer (HTML, scripts e cabeçalhos). Mostra o que roda no navegador, não o backend inteiro.

  • HSTS
  • Next.js
  • Vercel
  • Webpack