> ## 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

# Aggiornamenti automatici e canali di rilascio

Feed di aggiornamento firmati, il canale stable/beta e il workflow di rilascio incluso.

## Genera la coppia di chiavi dell'updater una sola volta

L'updater verifica le firme minisign sugli artefatti scaricati. Genera una coppia di chiavi con il signer di Tauri e conserva la chiave privata come TAURI_SIGNING_PRIVATE_KEY con la sua password in TAURI_SIGNING_PRIVATE_KEY_PASSWORD, entrambe nel tuo archivio dei segreti — mai nel repository. Le build che creano gli artefatti dell'updater emettono un sidecar .sig accanto a ogni installer; la chiave pubblica va ai client, quella privata resta in CI.

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


## Configura l'updater al momento della build

tauri.conf.json include un blocco updater sentinella con endpoints e pubkey vuoti — mantienilo, perché il plugin updater non può inizializzarsi senza le chiavi presenti. I valori reali vengono uniti in profondità al momento della build tramite un overlay JSON --config o la variabile d'ambiente TAURI_CONFIG; check:release-config stampa l'overlay esatto da incollare quando SUPASTACK_UPDATER_ENDPOINT e SUPASTACK_UPDATER_PUBKEY sono impostati.

Imposta entrambe o nessuna delle due: un overlay con soli endpoints lascia il pubkey vuoto, così i controlli sembrano funzionare mentre ogni installazione fallisce la verifica della firma. L'URL dell'endpoint porta i placeholder {{target}}, {{arch}} e {{current_version}} — lo slot di versione è obbligatorio — più un segmento di percorso opzionale {{channel}} che abilita i canali di rilascio.

```
# 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=
```


## Pubblica il feed latest.json

Ogni endpoint risponde con un manifesto latest.json — version, notes, pub_date e una mappa platforms che copre darwin-aarch64, darwin-x86_64, windows-x86_64, windows-aarch64, linux-x86_64 e linux-aarch64 — dove ogni voce accoppia l'URL dell'installer alla sua signature.

Costruiscilo con lo script release:manifest: analizza una directory di bundle alla ricerca di artefatti .app.tar.gz, -setup.exe (preferito rispetto a .msi) e .AppImage — ognuno deve avere il suo .sig vicino — e scrive o fonde il manifesto. I flag coprono --version, --base-url, --bundle-dir con --platform, --merge per accumulare piattaforme tra esecuzioni, --notes, --pub-date e --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
```


## Canali stable e beta

Quando un endpoint contiene il placeholder {{channel}}, il menu dell'app abilita una casella Beta Updates che alterna il feed tra stable e beta. La scelta persiste in un file update-channel accanto alla configurazione dell'app; SUPASTACK_UPDATE_CHANNEL la sovrascrive per singola esecuzione — i valori non riconosciuti vengono ignorati con un avviso — e stable è il default. Senza il placeholder il toggle resta disattivato e viene consultato solo il feed stable.


## Quando vengono controllati gli aggiornamenti

Un controllo silenzioso in background gira all'avvio e mostra una finestra di dialogo solo quando esiste un aggiornamento; la voce di menu Check for Updates… riporta ogni esito. I controlli si serializzano — una seconda richiesta concorrente viene scartata. Un aggiornamento disponibile offre Install and Restart, che scarica, installa e riavvia l'app; le build non configurate rispondono che gli aggiornamenti non sono configurati, e i fallimenti emergono come finestre di dialogo anziché come nuovi tentativi.


## Il workflow di rilascio incluso

.github/workflows/desktop-release.yml compila la matrice — macOS su entrambe le architetture, Windows e Ubuntu — su tag desktop-v* o su dispatch manuale con versione e canale. Imprime la versione del manifesto dal tag (una release che lo salta si offre come aggiornamento per sempre), fonde i manifesti per piattaforma e crea una bozza di release GitHub con latest.json più ogni installer e firma — marcata prerelease per i canali beta.

Richiede SUPASTACK_APP_URL e SUPASTACK_UPDATER_ENDPOINT come variabili del repository e SUPASTACK_UPDATER_PUBKEY più la chiave privata di firma e la sua password come segreti; le credenziali di firma Apple sono aggiunte opzionali. Il runbook completo è in `docs/desktop-updates.md` nel repository.


## Verifica e risoluzione dei problemi

Installa una build, pubblica un manifesto più recente su un feed di prova e conferma che la finestra di aggiornamento arriva al controllo successivo e che l'app si riavvia nella nuova versione. Poi passa a beta e conferma che la risposta del feed di canale cambia.

[Bundle e rilascio](https://supastack.dev/it/docs/desktop/release.md)

[Firma del codice](https://supastack.dev/it/docs/desktop/signing.md)


## Successivo

[Dentro la shell desktop](https://supastack.dev/it/docs/desktop/internals.md)
