Être notifié quand quelque chose se termine
Tout l'intérêt du produit tient au moment où un travail se termine pendant que vous êtes ailleurs. Progress Watch le délivre par Web Push, directement du serveur à votre navigateur — bureau et téléphone par un seul mécanisme, sans rien entre les deux qui nous appartienne.
L'activer
Le push se choisit espace par espace. Ouvrez un espace, appuyez sur Me notifier, et ce navigateur est enregistré pour cet espace et pour aucun autre. Rien vous concernant n'est stocké tant que vous n'appuyez pas, et retirer l'espace le désinscrit.
Sur un téléphone, installez d'abord le site
iOS ne délivre le Web Push qu'à un site ajouté à l'écran d'accueil, et il n'y a pas moyen de contourner cela : ouvrez l'espace dans Safari, Partager, Sur l'écran d'accueil, et appuyez sur Me notifier depuis là. Android et le bureau fonctionnent depuis un onglet ordinaire.
L'installation a un second avantage sur iOS. Safari efface le stockage local d'un site ordinaire après sept jours sans visite, et une application web installée en est exemptée — et c'est dans ce stockage que vit votre liste d'espaces. Il n'y a aucun compte depuis lequel la restaurer.
Un arbre d'étapes fait une notification
Chaque tâche qui se termine notifie, y compris chaque étape d'un travail. Elles ne s'empilent pas : une étape remplace sur place la notification précédente de son travail au lieu de s'y ajouter, un déploiement en dix étapes se lit donc comme une ligne qui change, et seule la fin du travail lui-même vibre à nouveau.
Ce que chaque partie apprend
Les charges utiles sont chiffrées pour le navigateur qui s'est abonné, avec des clés que lui seul détient. Google, Mozilla et Apple relaient du texte chiffré et ne peuvent pas lire les titres de vos tâches. Ce qu'ils apprennent, c'est qu'un navigateur donné a reçu quelque chose, et quand.
Votre propre serveur apprend une chose qu'il ignorerait autrement : qu'un navigateur s'est abonné sur un espace donné. C'est la raison pour laquelle c'est un bouton par espace et non un réglage global — la liste des espaces d'un navigateur vit dans ce navigateur et nulle part ailleurs, et un abonnement est la seule chose qui fasse entrer un espace dans les registres du serveur.
Si vous auto-hébergez, PUSH_CONTENT=minimal envoie « Task completed » sans titre. La charge est chiffrée dans les deux cas ; ceci concerne l'écran verrouillé d'un téléphone que quelqu'un d'autre peut voir.
Un serveur à la maison
Les notifications partent de votre serveur : il peut donc rester chez vous derrière un routeur et les envoyer quand même. Ce qui doit l'atteindre, ce sont votre téléphone et votre navigateur, pour activer la cloche et ouvrir ce vers quoi pointe une notification, et pour cela il lui faut une adresse HTTPS avec un vrai certificat. Un navigateur ne propose aucune notification sur http://192.168.1.50:7979, et l'app iOS ne se connecte qu'à des serveurs HTTPS. localhost est la seule exception, c'est pourquoi tout fonctionne tant que vous essayez sur la machine elle-même.
Sans domaine à vous, Tailscale donne au serveur une adresse HTTPS publique en une seule commande. Installez-le sur la machine qui fait tourner Progress Watch, connectez-vous et lancez :
La première fois, il vous demande d'autoriser Funnel pour votre réseau. Ensuite il affiche l'adresse, https://your-machine.your-tailnet.ts.net, et c'est désormais votre serveur : dans l'app, dans progresswatch configure --server et dans le navigateur. L'adresse est publique, comme l'est progress.watch, et un espace n'est toujours lu que par qui détient son lien.
Auto-hébergement : générer les clés
Les deux clés vides signifient que la fonctionnalité n'existe pas — pas de bouton, et rien de stocké sur qui que ce soit. Générez une paire une fois :
Mettez les deux dans le bloc environment: de docker-compose.yml et relancez docker compose up -d. Pas restart, qui réutilise la configuration que le conteneur a déjà.
Il n'y a rien à enregistrer nulle part — pas de projet Firebase, pas de compte développeur Apple, pas de clé d'API. Celui qui a fait le navigateur exploite le service de push ; son adresse arrive dans l'abonnement que le navigateur remet à votre serveur, et la paire VAPID est la preuve auto-signée que chaque notification vient du même expéditeur. VAPID_SUBJECT n'est qu'une adresse de contact et personne ne la vérifie.
Ne faites pas tourner les clés. Les abonnements existants y sont liés, les navigateurs n'en sont pas informés, et ils cessent simplement de recevoir.
L'app iOS
Une app iOS est en route vers l'App Store. C'est ce même site dans une enveloppe native, et elle est notifiée par le service push d'Apple plutôt que par Web Push : il n'y a donc rien à ajouter à l'écran d'accueil. Depuis un serveur auto-hébergé, ces notifications passent par progress.watch, parce que seul l'éditeur de l'app détient la clé qu'Apple exige : ce qui passe, c'est l'appareil et le texte de la notification, jamais un UUID d'espace. PUSH_CONTENT=minimal en écarte les titres des tâches, et PUSH_RELAY=false le désactive complètement. Ce qu'elle ne fait pas encore, c'est surveiller plusieurs serveurs à la fois : elle pointe vers un seul serveur à la fois.