Benachrichtigt werden, wenn etwas fertig ist

Der Sinn des ganzen Produkts ist der Moment, in dem ein Job fertig wird, während Sie woanders sind. Progress Watch liefert das über Web Push, direkt vom Server an Ihren Browser — Desktop und Telefon über einen Mechanismus, und nichts dazwischen gehört uns.

Einschalten

Push ist pro Bereich opt-in. Öffnen Sie einen Bereich, drücken Sie Benachrichtigen, und dieser Browser ist für diesen Bereich registriert und für keinen anderen. Bis Sie drücken, wird nichts über Sie gespeichert, und den Bereich zu entfernen meldet ihn wieder ab.

Auf dem Telefon zuerst die Seite installieren

iOS liefert Web Push nur an eine Seite, die zum Home-Bildschirm hinzugefügt wurde, und daran führt kein Weg vorbei: Öffnen Sie den Bereich in Safari, Teilen, Zum Home-Bildschirm, und drücken Sie Benachrichtigen von dort. Android und Desktop funktionieren aus einem gewöhnlichen Tab.

Das Installieren hat auf iOS einen zweiten Vorteil. Safari löscht den lokalen Speicher einer gewöhnlichen Seite nach sieben Tagen ohne Besuch, eine installierte Web-App ist davon ausgenommen — und in diesem Speicher liegt Ihre Liste der Bereiche. Es gibt kein Konto, aus dem sie sich wiederherstellen ließe.

Ein Baum aus Schritten ist eine Benachrichtigung

Jede Aufgabe, die fertig wird, benachrichtigt, auch jeder Schritt eines Jobs. Sie stapeln sich nicht: Ein Schritt ersetzt die vorherige Benachrichtigung seines Jobs an Ort und Stelle, statt sie zu ergänzen, ein Deploy aus zehn Schritten liest sich also als eine Zeile, die sich immer wieder ändert, und nur der Abschluss des Jobs selbst meldet sich erneut.

Was die Beteiligten erfahren

Nutzdaten sind für den Browser verschlüsselt, der sich angemeldet hat, mit Schlüsseln, die nur er hat. Google, Mozilla und Apple leiten Chiffretext weiter und können Ihre Aufgabentitel nicht lesen. Was sie erfahren, ist, dass ein bestimmter Browser etwas empfangen hat, und wann.

Ihr eigener Server erfährt eine Sache, die er sonst nicht wüsste: dass ein Browser sich für einen bestimmten Bereich angemeldet hat. Das ist der Grund, warum es ein Knopf pro Bereich ist und keine globale Einstellung — die Liste der Bereiche, die ein Browser hält, lebt in diesem Browser und nirgendwo sonst, und eine Anmeldung ist das Einzige, was einen Bereich in die Aufzeichnungen des Servers bringt.

Wenn Sie selbst hosten, sendet PUSH_CONTENT=minimal „Task completed“ ohne Titel. Verschlüsselt sind die Nutzdaten so oder so; das hier ist für den Sperrbildschirm eines Telefons, das jemand anderes sehen kann.

Ein Server zu Hause

Benachrichtigungen verlassen Ihren Server, er kann also zu Hause hinter einem Router stehen und sie trotzdem senden. Was ihn erreichen muss, sind Ihr Telefon und Ihr Browser, um die Glocke einzuschalten und zu öffnen, worauf eine Benachrichtigung zeigt, und dafür braucht er eine HTTPS-Adresse mit einem echten Zertifikat. Ein Browser bietet auf http://192.168.1.50:7979 keine Benachrichtigungen an, und die iOS-App verbindet sich nur mit HTTPS-Servern. localhost ist die einzige Ausnahme, deshalb funktioniert alles, solange Sie es auf dem Rechner selbst ausprobieren.

Ohne eigene Domain gibt Tailscale dem Server mit einem einzigen Befehl eine öffentliche HTTPS-Adresse. Installieren Sie es auf dem Rechner, auf dem Progress Watch läuft, melden Sie sich an und führen Sie aus:

Beim ersten Mal fragt es, ob Funnel für Ihr Netzwerk erlaubt werden soll. Danach gibt es die Adresse aus, https://your-machine.your-tailnet.ts.net, und das ist ab jetzt Ihr Server: in der App, in progresswatch configure --server und im Browser. Die Adresse ist öffentlich, wie progress.watch auch, und einen Bereich liest weiterhin nur, wer seinen Link hat.

Selbst hosten: die Schlüssel erzeugen

Beide Schlüssel ungesetzt heißt, die Funktion existiert nicht — kein Knopf, und nichts über irgendwen gespeichert. Erzeugen Sie einmal ein Paar:

Tragen Sie beide in den environment:-Block in docker-compose.yml ein und führen Sie erneut docker compose up -d aus. Nicht restart, das benutzt die Konfiguration weiter, die der Container schon hat.

Es gibt nichts, wo man sich registrieren müsste — kein Firebase-Projekt, kein Apple-Entwicklerkonto, kein API-Schlüssel. Wer den Browser gebaut hat, betreibt den Push-Dienst; dessen Adresse kommt in der Anmeldung mit, die der Browser Ihrem Server übergibt, und das VAPID-Paar ist ein selbstsignierter Beleg dafür, dass jede Benachrichtigung vom selben Absender kam. VAPID_SUBJECT ist nur eine Kontaktadresse, und niemand prüft sie.

Rotieren Sie die Schlüssel nicht. Bestehende Anmeldungen sind an sie gebunden, Browser werden nicht informiert, und sie empfangen schlicht nichts mehr.

Die iOS-App

Eine iOS-App ist auf dem Weg in den App Store. Sie ist dieselbe Website in einer nativen Hülle und wird über Apples Push-Dienst statt über Web Push benachrichtigt, es muss also nichts zum Home-Bildschirm hinzugefügt werden. Von einem selbst gehosteten Server laufen diese Benachrichtigungen über progress.watch, weil nur der Herausgeber der App den Schlüssel besitzt, den Apple verlangt: Durchgereicht werden das Gerät und der Text der Benachrichtigung, nie eine Bereichs-UUID. PUSH_CONTENT=minimal hält Aufgabentitel heraus, und PUSH_RELAY=false schaltet es ganz ab. Was sie noch nicht kann, ist mehrere Server gleichzeitig beobachten: Sie ist immer auf einen Server gerichtet.