Essere avvisati quando qualcosa finisce
Il senso dell'intero prodotto è il momento in cui un lavoro finisce mentre tu sei altrove. Progress Watch lo consegna via Web Push, direttamente dal server al tuo browser: desktop e telefono attraverso un unico meccanismo, senza nulla in mezzo che appartenga a noi.
Attivarlo
Il push si sceglie spazio per spazio. Apri uno spazio, premi Avvisami, e quel browser è registrato per quello spazio e per nessun altro. Finché non premi non viene memorizzato nulla su di te, e rimuovere lo spazio lo disiscrive di nuovo.
Su un telefono, installa prima il sito
iOS consegna il Web Push solo a un sito aggiunto alla schermata Home, e non c'è modo di aggirarlo: apri lo spazio in Safari, Condividi, Aggiungi a Home, e premi Avvisami da lì. Android e desktop funzionano da una scheda normale.
Installarlo ha un secondo vantaggio su iOS. Safari cancella la memoria locale di un sito normale dopo sette giorni senza visite, e una web app installata ne è esente — ed è in quella memoria che vive il tuo elenco di spazi. Non esiste nessun account da cui ripristinarlo.
Un albero di passaggi è una sola notifica
Ogni attività che finisce avvisa, compreso ogni passaggio di un lavoro. Non si impilano: un passaggio sostituisce sul posto la notifica precedente del suo lavoro invece di aggiungersi, quindi un deploy da dieci passaggi si legge come una riga che continua a cambiare, e solo la conclusione del lavoro stesso vibra di nuovo.
Cosa impara ciascuna parte
I payload sono cifrati per il browser che si è iscritto, con chiavi che ha solo lui. Google, Mozilla e Apple inoltrano testo cifrato e non possono leggere i titoli delle tue attività. Quello che imparano è che un certo browser ha ricevuto qualcosa, e quando.
Il tuo server impara una cosa che altrimenti non saprebbe: che un browser si è iscritto a un dato spazio. È questa la ragione per cui è un pulsante per spazio e non un'impostazione globale: l'elenco degli spazi che un browser tiene vive in quel browser e da nessun'altra parte, e un'iscrizione è l'unica cosa che porta uno spazio nei registri del server.
Se ti ospiti da solo, PUSH_CONTENT=minimal invia «Task completed» senza titolo. Il payload è cifrato in entrambi i casi; questo riguarda la schermata di blocco di un telefono che qualcun altro può vedere.
Un server a casa
Le notifiche partono dal tuo server, quindi può stare a casa dietro un router e inviarle lo stesso. A doverlo raggiungere sono il tuo telefono e il tuo browser, per accendere la campanella e aprire ciò a cui punta una notifica, e per questo serve un indirizzo HTTPS con un certificato vero. Un browser non offre notifiche su http://192.168.1.50:7979, e l'app iOS si collega solo a server HTTPS. localhost è l'unica eccezione, ed è per questo che tutto funziona finché provi sulla macchina stessa.
Senza un dominio tuo, Tailscale dà al server un indirizzo HTTPS pubblico con un solo comando. Installalo sulla macchina su cui gira Progress Watch, accedi ed esegui:
La prima volta ti chiede di consentire Funnel per la tua rete. Poi stampa l'indirizzo, https://your-machine.your-tailnet.ts.net, e da ora quello è il tuo server: nell'app, in progresswatch configure --server e nel browser. L'indirizzo è pubblico, come lo è progress.watch, e uno spazio lo legge comunque solo chi ha il suo link.
Autogestito: generare le chiavi
Entrambe le chiavi vuote significano che la funzione non esiste: nessun pulsante e niente memorizzato su nessuno. Genera una coppia una volta sola:
Metti entrambe nel blocco environment: in docker-compose.yml e rilancia docker compose up -d. Non restart, che riusa la configurazione che il container ha già.
Non c'è niente da registrare da nessuna parte: nessun progetto Firebase, nessun account sviluppatore Apple, nessuna chiave API. Chi ha fatto il browser gestisce il servizio di push; il suo indirizzo arriva dentro l'iscrizione che il browser consegna al tuo server, e la coppia VAPID è la prova autofirmata che ogni notifica è arrivata dallo stesso mittente. VAPID_SUBJECT è solo un indirizzo di contatto e nessuno lo verifica.
Non ruotare le chiavi. Le iscrizioni esistenti sono legate a esse, i browser non vengono informati, e semplicemente smettono di ricevere.
L'app iOS
Un'app iOS è in arrivo sull'App Store. È questo stesso sito in un guscio nativo, e riceve le notifiche dal servizio push di Apple anziché da Web Push, quindi non c'è niente da aggiungere alla schermata Home. Da un server self-hosted quelle notifiche passano per progress.watch, perché solo chi pubblica l'app possiede la chiave che Apple richiede: passano il dispositivo e il testo della notifica, mai l'UUID di uno spazio. PUSH_CONTENT=minimal ne tiene fuori i titoli delle attività, e PUSH_RELAY=false lo disattiva del tutto. Quello che ancora non fa è seguire più server insieme: punta a un server alla volta.