Soluções

Empresa

Modelos

Desenvolvedor

Recursos

Preços

Como a Cal.com lançou uma aplicação iOS/Android usando Expo e Chrome/Firefox usando WXT em uma única base de código

Como a Cal.com lançou uma aplicação iOS/Android usando Expo e Chrome/Firefox usando WXT em uma única base de código

Como a Cal.com lançou uma aplicação iOS/Android usando Expo e Chrome/Firefox usando WXT em uma única base de código

Saiba mais sobre como a equipe e o Peer lançaram um aplicativo nativo em menos de 3 semanas.

Uma base de código. Cinco plataformas. Duas lojas de aplicativos. Quatro navegadores.

Distribuído em menos de três semanas.

Cal.com sempre foi sobre encontrar as pessoas onde elas já estão.

Para agendamento, isso significa em todos os lugares: no seu telefone, no seu navegador, na aba que você nunca fecha, no laptop que você usa para trabalhar e no dispositivo que você pega quando está saindo pela porta.

Muitos de vocês pediram isso e finalmente decidimos tentar. Esta semana anunciámos:

  • Um aplicativo nativo para iOS

  • Um aplicativo nativo para Android

  • Uma extensão para Chrome

  • Uma extensão para Firefox

  • Uma extensão para Safari

  • Uma extensão para Edge

E nós não fizemos isso ao longo de meses ou trimestres.

Distribuímos tudo isso em menos de três semanas, da ideia à produção.

Tudo isso sem dividir o produto em dúzias de repositórios que lentamente se afastam ao longo do tempo.

Fizemos isso com uma única base de código.

A ideia central: distribuir o Cal.com em todo lugar sem distribuir o Cal.com cinco vezes

Historicamente, “aplicativo móvel” e “extensão de navegador” vivem em universos diferentes.

  • Mobile quer React Native, ferramentas de construção nativas, fluxos de trabalho de loja de aplicativos, notificações push, deep linking, etc.

  • Extensões querem scripts de conteúdo, workers de fundo/serviço, permissões, APIs de armazenamento, peculiaridades do navegador e o interminável jogo “funciona no Chrome mas…”

A abordagem usual é aceitar a divisão:

  • equipes separadas

  • stacks separados

  • processos de lançamento separados

  • bugs separados

  • inconsistências de UI separadas

Isso não parecia ser o jeito do Cal.com.

Queríamos que o Cal tivesse a sensação de o mesmo produto em todos os lugares. Mesma interface. Mesmo modelo mental. Mesmas funcionalidades. Mesma velocidade de iteração.

Então construímos dessa forma.

iOS + Android: alimentados pelo mais recente Expo e React Native

Nossos aplicativos para iOS e Android são alimentados pelo mais recente Expo (expo.dev) e React Native (RN).

O Expo atingiu um ponto em que você obtém o melhor de ambos os mundos:

  • excelente experiência de desenvolvimento

  • prontidão séria para produção

  • flexibilidade quando você precisa ir para o nativo

Mais importante ainda, o Expo se encaixa em uma tese maior que nos preocupamos profundamente:

Web e nativo não deveriam parecer produtos separados.

Eles deveriam parecer superfícies diferentes do mesmo sistema.

Extensões: alimentadas pelo WXT

Para extensões de navegador, baseamos no wxt.dev.

As extensões ainda são uma daquelas áreas onde as ferramentas podem parecer estranhamente presas no passado. O WXT faz com que pareça moderno:

  • estrutura limpa

  • padrões sensatos

  • construções confiáveis multi-navegador

E sim, criámos para Chrome, Firefox, Safari e Edge.

Só o Safari geralmente é suficiente para assustar as equipas de suporte multi-navegador. Mas o objetivo nunca foi “Chrome agora, outros depois.”

O objetivo era Cal em todos os lugares.

A parte divertida: UI da extensão Chrome alimentada pelo Expo Web

Aqui está a parte que ainda parece um pouco surreal:

Nosso UI da extensão Chrome é alimentado pelo Expo Web.

Isso significa que a UI da extensão não é um front end separado com seu próprio sistema de componentes e diferença de estilo. É construída usando a mesma abordagem de UI que já usamos para móveis rodando na web dentro da superfície da extensão.

Então, quando digo uma base de código, quero dizer de uma forma que realmente importa:

  • telas compartilhadas

  • componentes compartilhados

  • primitivos de design compartilhados

  • lógica compartilhada

  • velocidade compartilhada

O próprio aplicativo WXT roda dentro de /extension/entrypoints/content.ts que então carrega o aplicativo expo-web como um iframe. Essa é a abordagem mais comum para construir extensões chrome "sidebar" e aprendi esse truque com Wilson Wilson (@euboid). Infelizmente, o "popup" oficial da extensão chrome tem uma altura máxima de 600px.

Nós até implementamos algumas APIs apenas de navegador, como injetar nosso widget Cal.com em mail.google.com e calendar.google.com, o que pode ser facilmente feito na pasta /extensions do WXT.

Da minha experiência, essa combinação: iOS nativo + Android via Expo, extensões multi-navegador via WXT, UI da extensão via Expo Web, tudo unido em uma base de código coerente é algo que eu pessoalmente nunca vi feito assim antes.

Talvez exista em algum lugar. A internet é grande.

Mas eu não vi, e definitivamente não havia um manual que pudéssemos seguir.

Então criamos o nosso próprio.

Menos de 3 semanas… porque a fundação estava certa

Distribuir tão rápido não foi sobre heroísmo ou pressão.

Foi sobre ter a fundação certa.

Tudo se baseia na API mais recente e aprimorada do Cal.com v2, que usa OAuth para autorização. Isso significou:

  • fluxos de autenticação limpos

  • acesso seguro

  • um modelo consistente em aplicativos e extensões

  • sem atalhos, sem truques

A mesma API alimenta móveis, web e extensões. Sem “endpoints apenas para extensão.” Sem “exceções para o móvel.”

Apenas uma API, projetada para escalar com o ecossistema.

👉 Se você está desenvolvendo aplicativos ou integrações no Cal.com, este é o seu ponto de partida:
https://cal.com/help/apps-and-integrations/oauth

Essa fundação OAuth é o que torna realista distribuir novos aplicativos de agendamento tão rapidamente sem comprometer a segurança ou a sanidade do desenvolvedor.

Por que isso importa (além de “olhe o que construímos”)

Distribuir para muitas plataformas só é impressionante se continuar a ser sustentável.

A verdadeira vitória não é a lista de plataformas. A verdadeira vitória é:

  • Consistência: as características se implantam em todos os lugares, não “primeiro no móvel, depois na extensão”

  • Velocidade: um lugar para construir, um lugar para corrigir

  • Qualidade: menos divergências específicas da plataforma

  • Momentum: a equipe constrói o produto em vez de código intermediário

As extensões nos permitem viver diretamente nos fluxos de trabalho. O móvel nos permite viver no mundo real. Juntos, essa área de superfície se torna uma vantagem do produto.

Créditos a quem merece

Isso não aconteceu por causa de uma única pessoa. Mas duas pessoas foram multiplicadores massivos:

  • Wilson Wilson (@euboid), uma grande quantidade do suporte à extensão do navegador, casos especiais em navegadores cruzados, e “este é o truque que realmente funciona” veio de Wilson.

  • Beto (@betomoedano), toneladas de experiência em Expo e ajuda prática que transforma “isto deve funcionar” em “parece bom, sente-se bem” vieram de Beto.

  • e a equipe trabalhadora da call, a saber: eu, Dhairyashil Shinde, Carina Wollendorfer e

    Volnei Munhoz e Claude Code.

Obrigado a todos. Sério.

O que vem a seguir

Curiosidade: Nossos aplicativos ainda não foram lançados, o que é bastante hilário. O processo de inscrição na App Store está demorando mais do que o próprio desenvolvimento do aplicativo. Por algum motivo, ainda há questões de KYC com nossa empresa (renomeamos há alguns anos, discrepância no número D-U-N-S, funcionário não americano controlando uma empresa americana, bla bla bla.)

Às vezes eu gostaria que o desenvolvimento de aplicativos móveis pudesse experimentar o mesmo ritmo ao qual estamos acostumados na web, mas isso é muito improvável.

De qualquer forma, por favor inscreva-se na nossa lista de espera em cal.com/app e seja notificado assim que os aplicativos de produção estiverem disponíveis nas lojas. Segundo a equipa de inscrição são apenas mais alguns dias, mas as férias estão chegando, então nunca se sabe.

A base de código ainda está um pouco confusa com grandes componentes, mas estamos limpando esses agora.

No final, a parte mais empolgante é chegar ao “Cal.com em todos os lugares” com tão pouco esforço de engenharia para manter.

É que agora temos uma base onde entregar a próxima coisa parece como deveria:

  • construir uma vez

  • distribuir em todos os lugares

  • iterar rapidamente

Essa é a meta.

E é uma meta bastante divertida de alcançar.


Comece com o Cal.com gratuitamente hoje!

Experimente uma programação e produtividade sem interrupções, sem taxas ocultas. Registe-se em segundos e comece a simplificar a sua programação hoje, sem necessidade de cartão de crédito!