> ## Documentation Index
> Fetch the complete documentation index at: https://supastack.dev/llms.txt
> Use this file to discover all available pages before exploring further.
> For the full documentation corpus in one file, fetch: https://supastack.dev/llms-full.txt

# Actualizaciones automáticas y canales de release

Feeds de actualización firmados, el canal stable/beta y el flujo de release incluido.

## Genera el par de claves del updater una vez

El updater verifica firmas minisign en los artefactos descargados. Genera un par de claves con el firmante de Tauri y guarda la clave privada como TAURI_SIGNING_PRIVATE_KEY con su contraseña en TAURI_SIGNING_PRIVATE_KEY_PASSWORD, ambas en tu almacén de secretos —nunca en el repositorio—. Las compilaciones que crean artefactos del updater emiten un archivo adyacente .sig junto a cada instalador; la clave pública va a los clientes, la privada se queda en CI.

```
corepack pnpm --filter @supastack/desktop exec tauri signer generate -w ~/.tauri/product.key
```


## Configura el updater en tiempo de compilación

tauri.conf.json distribuye un bloque de updater centinela con endpoints y pubkey vacíos —consérvalo, porque el plugin del updater no puede inicializarse sin las claves presentes—. Los valores reales se fusionan en profundidad en tiempo de compilación mediante un overlay JSON de --config o la variable de entorno TAURI_CONFIG; check:release-config imprime el overlay exacto a pegar cuando SUPASTACK_UPDATER_ENDPOINT y SUPASTACK_UPDATER_PUBKEY están definidos.

Define ambos o ninguno: un overlay solo de endpoints deja pubkey vacío, así que las comprobaciones parecen funcionar mientras cada instalación falla la verificación de firma. La URL del endpoint lleva los marcadores {{target}}, {{arch}} y {{current_version}} —la ranura de versión es obligatoria— más un segmento de ruta opcional {{channel}} que habilita los canales de release.

```
# check:release-config prints this overlay for tauri build --config:
# {"plugins":{"updater":{"endpoints":["https://releases.example.com/{{channel}}/{{target}}/{{arch}}/{{current_version}}"],"pubkey":"<base64 public key>"}}}
# SUPASTACK_UPDATER_ENDPOINT=
# SUPASTACK_UPDATER_PUBKEY=
```


## Publica el feed latest.json

Cada endpoint responde un manifiesto latest.json —version, notes, pub_date y un mapa platforms que cubre darwin-aarch64, darwin-x86_64, windows-x86_64, windows-aarch64, linux-x86_64 y linux-aarch64— donde cada entrada empareja la URL del instalador con su signature.

Constrúyelo con el script release:manifest: explora un directorio de bundle en busca de artefactos .app.tar.gz, -setup.exe (preferido sobre .msi) y .AppImage —cada uno debe tener su vecino .sig— y escribe o fusiona el manifiesto. Los flags cubren --version, --base-url, --bundle-dir con --platform, --merge para acumular plataformas entre ejecuciones, --notes, --pub-date y --out.

```
corepack pnpm --filter @supastack/desktop release:manifest -- \
  --version 1.2.0 \
  --base-url https://releases.example.com/stable \
  --bundle-dir src-tauri/target/release/bundle \
  --platform windows-x86_64 \
  --merge latest.json
```


## Canales stable y beta

Cuando un endpoint contiene el marcador {{channel}}, el menú de la app habilita una casilla Beta Updates que alterna el feed entre stable y beta. La elección persiste en un archivo update-channel junto a la configuración de la app; SUPASTACK_UPDATE_CHANNEL la sobrescribe por ejecución —cualquier cosa no reconocida se ignora con un aviso— y stable es el predeterminado. Sin el marcador, el conmutador permanece deshabilitado y solo se comprueba el feed stable.


## Cuándo se comprueban las actualizaciones

Una comprobación silenciosa en segundo plano se ejecuta al arrancar y solo muestra un diálogo cuando existe una actualización; el elemento de menú Check for Updates… informa cada resultado. Las comprobaciones se serializan: una segunda petición concurrente se descarta. Una actualización disponible ofrece Install and Restart, que descarga, instala y reinicia la app; las compilaciones sin configurar responden que las actualizaciones no están configuradas, y los fallos aparecen como diálogos en lugar de reintentos.


## El flujo de release incluido

.github/workflows/desktop-release.yml compila la matriz —macOS en ambas arquitecturas, Windows y Ubuntu— en etiquetas desktop-v* o en un dispatch manual con una versión y un canal. Estampa la versión del manifiesto desde la etiqueta (una release que se lo salta se ofrece a sí misma como actualización para siempre), fusiona los manifiestos por plataforma y crea una release de GitHub en borrador que lleva latest.json más cada instalador y firma —marcada como prerelease para canales beta—.

Necesita SUPASTACK_APP_URL y SUPASTACK_UPDATER_ENDPOINT como variables del repositorio, y SUPASTACK_UPDATER_PUBKEY más la clave privada de firma y su contraseña como secretos; las credenciales de firma de Apple son añadidos opcionales. El runbook completo vive en `docs/desktop-updates.md` del repositorio.


## Verificación y solución de problemas

Instala una compilación, publica un manifiesto más reciente en un feed de prueba y confirma que el diálogo de actualización llega en la siguiente comprobación y la app reinicia en la versión nueva. Después cambia a beta y confirma que la respuesta del feed de canal cambia.

[Empaqueta y publica](https://supastack.dev/es/docs/desktop/release.md)

[Firma de código](https://supastack.dev/es/docs/desktop/signing.md)


## Siguiente

[Dentro del shell de escritorio](https://supastack.dev/es/docs/desktop/internals.md)
