Recibir aviso cuando algo termina

El sentido de todo el producto es el momento en que un trabajo termina mientras tú estás en otra parte. Progress Watch lo entrega mediante Web Push, directo del servidor a tu navegador: escritorio y teléfono por un mismo mecanismo, sin nada por medio que sea nuestro.

Activarlo

Push es opcional y por espacio. Abre un espacio, pulsa Avisarme, y ese navegador queda registrado para ese espacio y para ningún otro. No se guarda nada sobre ti hasta que lo pulsas, y quitar el espacio lo da de baja de nuevo.

En un teléfono, instala primero el sitio

iOS entrega Web Push solo a un sitio añadido a la pantalla de inicio, y no hay forma de evitarlo: abre el espacio en Safari, Compartir, Añadir a pantalla de inicio, y pulsa Avisarme desde ahí. Android y escritorio funcionan desde una pestaña normal.

Instalarlo tiene una segunda ventaja en iOS. Safari borra el almacenamiento local de un sitio normal a los siete días sin visitas, y una aplicación web instalada queda exenta, y en ese almacenamiento vive tu lista de espacios. No hay ninguna cuenta desde la que restaurarla.

Un árbol de pasos es una notificación

Toda tarea que termina avisa, incluido cada paso de un trabajo. No se apilan: un paso reemplaza en su sitio la notificación anterior de su trabajo en lugar de sumarse a ella, así que un despliegue de diez pasos se lee como una línea que va cambiando, y solo la finalización del trabajo en sí vuelve a vibrar.

Qué aprende cada parte

Las cargas van cifradas para el navegador que se suscribió, con claves que solo él tiene. Google, Mozilla y Apple retransmiten texto cifrado y no pueden leer los títulos de tus tareas. Lo que sí saben es que un navegador concreto recibió algo, y cuándo.

Tu propio servidor aprende una cosa que de otro modo no sabría: que un navegador se suscribió a un espacio dado. Esa es la razón de que sea un botón por espacio y no un ajuste global: la lista de espacios que tiene un navegador vive en ese navegador y en ningún otro sitio, y una suscripción es lo único que mete un espacio en los registros del servidor.

Si te lo alojas tú, PUSH_CONTENT=minimal envía «Task completed» sin título. La carga va cifrada de todos modos; esto es para la pantalla de bloqueo de un teléfono que otro puede ver.

Un servidor en casa

Las notificaciones salen de tu servidor, así que puede estar en casa detrás de un router y enviarlas igualmente. Lo que tiene que llegar al servidor es tu teléfono y tu navegador, para activar la campana y abrir lo que señala una notificación, y para eso necesita una dirección HTTPS con un certificado de verdad. Un navegador no ofrece notificaciones en http://192.168.1.50:7979, y la app de iOS solo se conecta a servidores HTTPS. localhost es la única excepción, y por eso todo funciona mientras lo pruebas en la propia máquina.

Sin un dominio propio, Tailscale da al servidor una dirección HTTPS pública con un solo comando. Instálalo en la máquina donde corre Progress Watch, inicia sesión y ejecuta:

La primera vez te pide que permitas Funnel en tu red. Después muestra la dirección, https://your-machine.your-tailnet.ts.net, y ese es tu servidor a partir de ahora: en la app, en progresswatch configure --server y en el navegador. La dirección es pública, como lo es progress.watch, y un espacio lo sigue leyendo solo quien tiene su enlace.

Alojarlo tú: generar las claves

Las dos claves sin poner significa que la función no existe: ni botón, ni nada guardado sobre nadie. Genera un par una vez:

Pon las dos en el bloque environment: de docker-compose.yml y haz docker compose up -d otra vez. No restart, que reutiliza la configuración que el contenedor ya tiene.

No hay nada que registrar en ninguna parte: ni proyecto de Firebase, ni cuenta de desarrollador de Apple, ni clave de API. Quien hizo el navegador opera el servicio de push; su dirección llega dentro de la suscripción que el navegador le entrega a tu servidor, y el par VAPID es la prueba autofirmada de que cada notificación vino del mismo emisor. VAPID_SUBJECT es solo una dirección de contacto y nadie la verifica.

No rotes las claves. Las suscripciones existentes están atadas a ellas, a los navegadores no se les avisa, y sencillamente dejan de recibir.

La app de iOS

Hay una app de iOS de camino al App Store. Es este mismo sitio en una envoltura nativa, y recibe las notificaciones por el servicio push de Apple en lugar de Web Push, así que no hay nada que añadir a la pantalla de inicio. Desde un servidor autoalojado esas notificaciones pasan por progress.watch, porque solo quien publica la app tiene la clave que pide Apple: lo que pasa es el dispositivo y el texto de la notificación, nunca un UUID de espacio. PUSH_CONTENT=minimal deja fuera los títulos de las tareas, y PUSH_RELAY=false lo desactiva del todo. Lo que aún no hace es vigilar varios servidores a la vez: apunta a un servidor cada vez.