Ser avisado quando algo termina
O sentido de todo o produto é o momento em que um trabalho termina enquanto está noutro sítio. O Progress Watch entrega isso por Web Push, direto do servidor para o seu navegador — computador e telemóvel pelo mesmo mecanismo, sem nada pelo meio que seja nosso.
Ligar
O push é opcional e por espaço. Abra um espaço, carregue em Avisar-me, e esse navegador fica registado para esse espaço e para mais nenhum. Nada sobre si é guardado até carregar, e remover o espaço volta a cancelar o registo.
Num telemóvel, instale primeiro o site
O iOS entrega Web Push apenas a um site adicionado ao ecrã principal, e não há forma de contornar: abra o espaço no Safari, Partilhar, Adicionar ao ecrã principal, e carregue em Avisar-me a partir daí. O Android e o computador funcionam a partir de um separador normal.
Instalar tem uma segunda vantagem no iOS. O Safari limpa o armazenamento local de um site normal ao fim de sete dias sem visitas, e uma aplicação web instalada está isenta — e é nesse armazenamento que vive a sua lista de espaços. Não há conta nenhuma a partir da qual a repor.
Uma árvore de passos é uma notificação
Todas as tarefas que terminam avisam, incluindo cada passo de um trabalho. Não se acumulam: um passo substitui no lugar a notificação anterior do seu trabalho em vez de se somar a ela, por isso um deploy de dez passos lê-se como uma linha que vai mudando, e só a conclusão do próprio trabalho volta a vibrar.
O que cada parte fica a saber
As cargas vão cifradas para o navegador que subscreveu, com chaves que só ele tem. A Google, a Mozilla e a Apple encaminham texto cifrado e não conseguem ler os títulos das suas tarefas. O que ficam a saber é que um determinado navegador recebeu alguma coisa, e quando.
O seu próprio servidor fica a saber uma coisa que de outro modo não saberia: que um navegador subscreveu num dado espaço. É essa a razão de ser um botão por espaço e não uma definição global — a lista de espaços que um navegador guarda vive nesse navegador e em mais lado nenhum, e uma subscrição é a única coisa que põe um espaço nos registos do servidor.
Se aloja por conta própria, PUSH_CONTENT=minimal envia «Task completed» sem título. A carga vai cifrada de qualquer forma; isto é para o ecrã bloqueado de um telemóvel que outra pessoa pode ver.
Um servidor em casa
As notificações saem do seu servidor, por isso ele pode ficar em casa atrás de um router e enviá-las na mesma. O que tem de chegar ao servidor são o seu telemóvel e o seu navegador, para ligar o sino e abrir aquilo para onde uma notificação aponta, e para isso ele precisa de um endereço HTTPS com um certificado a sério. Um navegador não oferece notificações em http://192.168.1.50:7979, e a app iOS só se liga a servidores HTTPS. localhost é a única exceção, e é por isso que tudo funciona enquanto experimenta na própria máquina.
Sem um domínio próprio, o Tailscale dá ao servidor um endereço HTTPS público com um único comando. Instale-o na máquina onde corre o Progress Watch, inicie sessão e execute:
Da primeira vez, pede-lhe que permita o Funnel na sua rede. Depois mostra o endereço, https://your-machine.your-tailnet.ts.net, e esse passa a ser o seu servidor: na app, em progresswatch configure --server e no navegador. O endereço é público, tal como o progress.watch, e um espaço continua a ser lido apenas por quem tem o seu link.
Alojamento próprio: gerar as chaves
As duas chaves por definir significam que a funcionalidade não existe — sem botão, e nada guardado sobre ninguém. Gere um par uma vez:
Ponha ambas no bloco environment: em docker-compose.yml e volte a fazer docker compose up -d. Não restart, que reutiliza a configuração que o contentor já tem.
Não há nada para registar em lado nenhum — sem projeto Firebase, sem conta de programador da Apple, sem chave de API. Quem fez o navegador é quem opera o serviço de push; o endereço dele chega dentro da subscrição que o navegador entrega ao seu servidor, e o par VAPID é a prova auto-assinada de que todas as notificações vieram do mesmo remetente. VAPID_SUBJECT é apenas um endereço de contacto e ninguém o verifica.
Não rode as chaves. As subscrições existentes estão presas a elas, os navegadores não são avisados, e simplesmente deixam de receber.
A app iOS
Há uma app iOS a caminho da App Store. É este mesmo site numa casca nativa, e é notificada pelo serviço push da Apple em vez do Web Push, por isso não há nada para adicionar ao ecrã principal. A partir de um servidor auto-alojado essas notificações passam pelo progress.watch, porque só quem publica a app tem a chave que a Apple pede: o que passa é o dispositivo e o texto da notificação, nunca um UUID de espaço. PUSH_CONTENT=minimal deixa de fora os títulos das tarefas, e PUSH_RELAY=false desliga-o por completo. O que ainda não faz é vigiar vários servidores ao mesmo tempo: aponta para um servidor de cada vez.