Estudo de caso · Stack

Como a Linear construiu um gerenciador de tarefas rápido

A Linear é uma ferramenta de tarefas e planejamento para times de software, famosa por parecer instantânea. Por baixo, é TypeScript de ponta a ponta, com um motor de sincronização próprio que guarda os dados no navegador e um único banco Postgres no Google Cloud.
Copiar stacklinear.app Gestão de projetos para times de software · Estados Unidos · fundada em 2019

A stack da Linear

Abrir no montador

Linguagem

  • TypeScriptlinear.app

    A única linguagem da stack, dos modelos do banco aos resolvers GraphQL e aos componentes de tela.

Biblioteca de interface

Hospedagem

  • Google Cloudlinear.app

    Nuvem principal, começando pelo us-east1.

  • Kuberneteslinear.app

    Orquestra os serviços que rodam no Google Cloud.

  • Terraformlinear.app

    Descreve a infraestrutura como código, com a região passada como variável.

    Por quê: Ter a infraestrutura em código facilitou muito subir uma segunda região.

  • Cloudflare Workerslinear.app

    Proxy que autentica cada pedido e manda para a região do usuário.

    Por quê: A Linear já usava muito o Cloudflare Workers, então a decisão foi fácil.

Banco de dados

  • PostgreSQLlinear.app

    Banco principal, mantido como uma instância só por região.

Estilo e kit de interface

  • styled-componentslinear.app

    Estiliza os componentes React.

Busca de dados

  • MobXlinear.app

    Cuida do estado reativo no front, em cima dos dados sincronizados.

  • Linear sync engine (WebSockets)linear.app

    Framework próprio de sincronização sobre WebSockets que guarda os dados no cliente e sincroniza mudanças em tempo real.

    Por quê: Feito para ser rápido e funcionar offline, que a Linear considera valores centrais do produto.

  • GraphQLlinear.app

    Move a API pública e o SDK, e também a API interna entre serviços.

    Por quê: Na comunicação entre serviços, escolheram porque o código já tinha boas ferramentas de GraphQL.

  • Redislinear.app

    Cache no back-end, inclusive dos cursores do motor de sincronização.

  • Google Cloud Pub/Sublinear.app

    Espalha tarefas em segundo plano para todas as regiões.

    Por quê: Deixou o serviço de autenticação simples, só respondendo a pedidos HTTP.

Framework de servidor

  • Node.jslinear.app

    Roda os serviços do back-end.

  • Temporallinear.app

    Roda fluxos duráveis, inclusive o sistema de tarefas de agentes de IA em produção.

Como montaram

Velocidade em primeiro lugar, por isso o motor de sincronização próprio

Desde o começo, a Linear tratou velocidade como valor central do produto: dados guardados no próprio aparelho, nada de recarregar a página e o app funcionando offline, além de sincronização em tempo real e presença dos colegas.

Para chegar lá, o time criou um framework de sincronização próprio sobre WebSockets, pensado para ser rápido e funcionar sem internet. O CTO, Tuomas Artman, já deu palestras explicando como o motor funciona e como ele precisou mudar conforme a Linear cresceu.

Fontes:linear.app linear.app linear.app

Uma linguagem só em toda a stack

Na Linear, tudo é TypeScript: dos modelos do banco aos resolvers GraphQL e aos componentes da interface. O front usa React com MobX e styled-components; o back roda em Node com Postgres, Redis e Temporal.

A mesma camada GraphQL alimenta a API pública e o SDK, então o cliente integra com a mesma API que o time usa por dentro.

Fontes:linear.app

Várias regiões sem fatiar o banco

Em 2024 a Linear abriu uma região na Europa. A infraestrutura era configurada à mão no us-east1 do Google Cloud, então o primeiro passo foi passar tudo para Terraform, o que facilitou muito subir uma segunda região.

Em vez de fatiar o Postgres, eles replicaram a instalação inteira por região, e o código continua falando com um único banco. Um serviço pequeno de autenticação, um Cloudflare Worker que manda cada pedido para a região certa e o Pub/Sub do Google Cloud para tarefas em segundo plano fecham o desenho.

Fontes:linear.app

O que uma migração ruim ensinou

Em janeiro de 2024, uma migração de banco apagou dados e a Linear teve que voltar o banco para um backup de algumas horas antes. O relatório do incidente cita um cache na frente do Postgres e cursores de sincronização guardados no Redis, que deixaram a recuperação mais difícil.

Depois disso, o time passou a ter avisos no CI para migrações perigosas, acesso mais restrito aos bancos de produção e testes a seco em staging.

Fontes:linear.app

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.

  • Algolia
  • Cloudflare
  • Google Cloud CDN
  • HSTS
  • HTTP/3
  • Linkedin Insight Tag
  • Sanity
  • Sanity.io