# Configuración de Scope Extensions y Link Handling en Nucleo V3 ## Resumen Este documento describe la implementación de **Scope Extensions** y **Link Handling** en las PWAs del ecosistema Nucleo V3, permitiendo que múltiples aplicaciones web en diferentes subdominios funcionen como un sistema unificado de aplicaciones progresivas. ## ¿Qué son Scope Extensions? Scope Extensions es una característica de las Progressive Web Apps que permite a una PWA extender su scope (alcance) a otros orígenes (dominios/subdominios). Esto significa que: - Una PWA instalada puede "capturar" navegaciones a otros subdominios - Los usuarios pueden moverse entre apps manteniendo la experiencia de PWA - El ecosistema de apps se siente más integrado y cohesivo ## Arquitectura Implementada ### Hub Principal: Perfil PWA La aplicación **perfil** (`inicio.nucleoriofrio.com`) actúa como el **hub principal** del ecosistema Nucleo V3, con la capacidad de capturar navegaciones a: - `musica.nucleoriofrio.com` (RepoDructor) - `docs.nucleoriofrio.com` (Nucleo Docs) - `analitica.nucleoriofrio.com` (Analítica Nucleo) - `seguidordelotes.nucleoriofrio.com` (Seguidor de Lotes) - `whisper.nucleoriofrio.com` (Nucleo Whisper) - `amigos.nucleoriofrio.com` (Amigos App) ### Apps Secundarias Cada app secundaria puede: - Funcionar de manera independiente como PWA - Confirmar su asociación con la PWA de Perfil mediante archivos `.well-known` - Capturar enlaces dentro de su propio scope ## Componentes de la Implementación ### 1. Manifests (nuxt.config.ts) #### Perfil (Hub Principal) ```typescript manifest: { // ... otras propiedades ... capture_links: 'existing-client-navigate', scope_extensions: [ { origin: "https://musica.nucleoriofrio.com" }, { origin: "https://docs.nucleoriofrio.com" }, { origin: "https://analitica.nucleoriofrio.com" }, { origin: "https://seguidordelotes.nucleoriofrio.com" }, { origin: "https://whisper.nucleoriofrio.com" }, { origin: "https://amigos.nucleoriofrio.com" } ] } ``` #### Apps Secundarias ```typescript manifest: { // ... otras propiedades ... capture_links: 'existing-client-navigate' } ``` ### 2. Archivos .well-known/web-app-origin-association Cada app secundaria debe tener este archivo en `public/.well-known/web-app-origin-association`: ```json { "web_apps": [ { "manifest": "https://inicio.nucleoriofrio.com/manifest.webmanifest", "details": { "paths": ["/*"] } } ] } ``` **Ubicaciones:** - `/home/draganel/repos/repodructor/public/.well-known/web-app-origin-association` - `/home/draganel/repos/nucleoDocs/nuxt4/public/.well-known/web-app-origin-association` - `/home/draganel/repos/nucleoWhisper/nuxt4/public/.well-known/web-app-origin-association` - `/home/draganel/repos/analiticaNucleo/nuxt4-app/public/.well-known/web-app-origin-association` - `/home/draganel/repos/seguidorDeLotes/nuxt4-app/public/.well-known/web-app-origin-association` ### 3. Configuración de Traefik (docker-compose.yml) Cada `docker-compose.yml` ha sido actualizado para servir los archivos `.well-known` **sin autenticación**, con alta prioridad: ```yaml # Router público para recursos PWA (sin autenticación) - "traefik.http.routers.${APP_NAME}-public.rule=Host(`${APP_DOMAIN}`) && (PathPrefix(`/.well-known`) || PathPrefix(`/manifest.webmanifest`) || ...)" - "traefik.http.routers.${APP_NAME}-public.priority=100" ``` ## Flujo de Usuario 1. **Instalación de Perfil PWA** - Usuario instala la PWA de Perfil desde `inicio.nucleoriofrio.com` - El navegador lee el manifest y detecta los `scope_extensions` - El navegador valida automáticamente los archivos `.well-known` en cada origen extendido 2. **Navegación entre Apps** - Usuario hace clic en un enlace a `musica.nucleoriofrio.com` desde cualquier app - Si la PWA de Perfil está instalada y configurada correctamente: - El navegador puede abrir el enlace dentro de la ventana de la PWA - En lugar de abrir el navegador normal - La experiencia es más fluida y cohesiva 3. **Apps Independientes** - Cada app puede seguir siendo instalada independientemente - Cada app mantiene su propio Service Worker y caché - Las apps pueden funcionar offline según su configuración individual ## Limitaciones Técnicas ### Same-Origin Policy Aunque las apps comparten el link handling, **NO comparten**: - Service Workers (cada origen tiene el suyo) - Caches (cada origen tiene su propio cache storage) - Almacenamiento local (localStorage, IndexedDB) - Permisos (cada origen pide permisos independientemente) ### Soporte de Navegadores - **Chromium-based browsers** (Chrome, Edge): Soporte completo - **Firefox**: Soporte limitado o experimental - **Safari**: Sin soporte actualmente ## Validación y Testing ### Verificar Implementación 1. **Verificar archivos .well-known:** ```bash # Debe devolver el JSON de asociación curl https://musica.nucleoriofrio.com/.well-known/web-app-origin-association ``` 2. **Verificar manifest de Perfil:** ```bash # Debe contener scope_extensions curl https://inicio.nucleoriofrio.com/manifest.webmanifest | grep scope_extensions ``` 3. **Instalar y probar:** - Instalar la PWA de Perfil en Chrome/Edge - Hacer clic en enlaces a otras apps del ecosistema - Verificar que se abren dentro de la ventana de la PWA ### Debugging **Chrome DevTools:** 1. Abrir DevTools → Application → Manifest 2. Verificar que `scope_extensions` aparece correctamente 3. En la consola, verificar errores relacionados con `.well-known` **Edge DevTools:** Similar a Chrome, con soporte adicional para PWA features ## Mantenimiento ### Agregar una Nueva App al Ecosistema 1. **Actualizar el manifest de Perfil** (`/home/draganel/repos/perfil/nuxt4/nuxt.config.ts`): ```typescript scope_extensions: [ // ... extensiones existentes ... { origin: "https://nuevaapp.nucleoriofrio.com" } ] ``` 2. **Crear `.well-known` en la nueva app**: ```bash mkdir -p /ruta/a/nuevaapp/public/.well-known ``` Crear `/ruta/a/nuevaapp/public/.well-known/web-app-origin-association`: ```json { "web_apps": [ { "manifest": "https://inicio.nucleoriofrio.com/manifest.webmanifest", "details": { "paths": ["/*"] } } ] } ``` 3. **Actualizar docker-compose.yml** de la nueva app: ```yaml - "traefik.http.routers.nuevaapp-public.rule=Host(`nuevaapp.nucleoriofrio.com`) && (PathPrefix(`/.well-known`) || ...)" ``` 4. **Agregar capture_links** al manifest de la nueva app: ```typescript manifest: { // ... otras propiedades ... capture_links: 'existing-client-navigate' } ``` ### Remover una App del Ecosistema 1. Remover el origen de `scope_extensions` en el manifest de Perfil 2. Eliminar el archivo `.well-known` de la app 3. Rebuild y redeploy ambas apps ## Archivos Modificados ### Manifests Actualizados - ✅ `/home/draganel/repos/perfil/nuxt4/nuxt.config.ts` - ✅ `/home/draganel/repos/repodructor/nuxt.config.ts` - ✅ `/home/draganel/repos/nucleoDocs/nuxt4/nuxt.config.ts` - ✅ `/home/draganel/repos/nucleoWhisper/nuxt4/nuxt.config.ts` - ✅ `/home/draganel/repos/analiticaNucleo/nuxt4-app/nuxt.config.ts` - ✅ `/home/draganel/repos/seguidorDeLotes/nuxt4-app/nuxt.config.ts` ### Archivos .well-known Creados - ✅ `/home/draganel/repos/repodructor/public/.well-known/web-app-origin-association` - ✅ `/home/draganel/repos/nucleoDocs/nuxt4/public/.well-known/web-app-origin-association` - ✅ `/home/draganel/repos/nucleoWhisper/nuxt4/public/.well-known/web-app-origin-association` - ✅ `/home/draganel/repos/analiticaNucleo/nuxt4-app/public/.well-known/web-app-origin-association` - ✅ `/home/draganel/repos/seguidorDeLotes/nuxt4-app/public/.well-known/web-app-origin-association` ### Docker Compose Actualizados - ✅ `/home/draganel/repos/perfil/docker-compose.yml` - ✅ `/home/draganel/repos/repodructor/docker-compose.yml` - ✅ `/home/draganel/repos/nucleoDocs/docker-compose.yml` - ✅ `/home/draganel/repos/nucleoWhisper/docker-compose.yml` - ✅ `/home/draganel/repos/analiticaNucleo/docker-compose.yml` - ✅ `/home/draganel/repos/seguidorDeLotes/docker-compose.yml` ## Referencias - [Building multiple Progressive Web Apps on the same domain - Google](https://web.dev/building-multiple-pwas/) - [Handle links to a PWA - Microsoft Edge Developer](https://docs.microsoft.com/en-us/microsoft-edge/progressive-web-apps-chromium/how-to/handle-links) - [Scope Extensions for Web App Manifest - W3C](https://github.com/WICG/manifest-incubations/blob/gh-pages/scope_extensions-explainer.md) ## Soporte Para problemas o preguntas sobre esta configuración, contactar a: - **Desarrollador:** Dario (Leouch, Draganel, nucleo000) - **Empresa:** Nucleo Rio Frio --- **Fecha de implementación:** 2025-10-17 **Versión:** 1.0 **Sistema:** Nucleo V3