Instale o opolyx no celular — e entre sem senha
O opolyx agora é um app instalável de verdade, e há quatro formas de entrar: link mágico, código por e-mail, Google ou Apple. O código é o que funciona em todo lugar.

Em palavras simples
Você pode adicionar o opolyx à tela inicial e abri-lo como qualquer outro aplicativo: ícone próprio, sem barras do navegador, direto no saguão. Isso já funciona no Android e no iOS pelo menu do navegador, e é a mesma versão que estamos empacotando para as lojas.
- abre em tela cheia no saguão, e não na página de marketing;
- mantém o próprio ícone e a tela de abertura em vez de ser um atalho do navegador;
- mostra uma página do opolyx quando você está sem conexão, em vez de um erro do navegador;
- nunca guarda em cache nada de uma partida em andamento, então o app instalado está tão atual quanto o site.
Agora há quatro caminhos para entrar, e você usa o que couber melhor no seu aparelho:
| Método | Como funciona |
|---|---|
| Link mágico | um link no seu e-mail — um toque, sem senha |
| Código por e-mail | um código de 8 caracteres digitado na página de entrada |
| o seletor de contas de sempre | |
| Apple | inclusive com Hide My Email, atrás do qual nunca enxergamos nada |
O código enviado por e-mail é o caminho que funciona absolutamente em todo lugar — inclusive dentro de um app encapsulado, onde um link abre em outro navegador e não consegue devolver a sessão.
Para os mais técnicos
O service worker é deliberadamente restrito. É uma lista de permissões, não um pega-tudo: navegações vão primeiro à rede com uma página offline como reserva, recursos estáticos com hash usam stale-while-revalidate, e todo o resto — banco de dados, servidor de jogo, tempo real, autenticação, payloads renderizados no servidor — é ignorado por completo, então ele não tem como servir um tabuleiro velho nem quebrar uma partida em andamento.
// public/sw.js — allow-list, not catch-all
self.addEventListener('fetch', (event) => {
const url = new URL(event.request.url);
if (url.origin !== self.location.origin) return; // Supabase, daemon: untouched
if (BYPASS.some((p) => url.pathname.startsWith(p))) return; // /auth, /api, RSC
if (event.request.mode === 'navigate') return event.respondWith(networkFirst(event));
if (HASHED.test(url.pathname)) return event.respondWith(staleWhileRevalidate(event));
});A parte interessante foi a versão iOS encapsulada, em que nenhum método de login se concluía embora todos os navegadores funcionassem. A causa é um ajuste do WebKit que a ferramenta de empacotamento grava por você: com os domínios vinculados ao app ativados, o WebKit cancela silenciosamente qualquer navegação de nível superior para um host fora da lista — e o primeiro salto de um fluxo OAuth é exatamente essa navegação. Além disso, o Google recusa webviews embutidos por política, e nenhuma configuração resolve isso.
O link mágico também jamais funcionaria ali: ele abre no navegador do sistema, cujo repositório de cookies o webview do app não enxerga. É isso que torna o código digitado a única rota de e-mail de mesma origem — ela se completa no webview que a pediu.
Para o Google, o caminho sancionado é rodar o fluxo no navegador do sistema e devolver a sessão. A ponte monta a URL de autorização propositalmente sem PKCE, para que o fluxo retorne os tokens no fragmento de callback que a casca consegue ler — um código de autorização só poderia ser trocado pelo navegador que guarda o verificador, que é justamente o outro.
