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

# Auto-updates e canais de release

Feeds de update assinados, o canal stable/beta e o workflow de release incluído.

## Gera o keypair do updater uma vez

O updater verifica assinaturas minisign nos artefactos descarregados. Gera um keypair com o signer do Tauri e guarda a chave privada como TAURI_SIGNING_PRIVATE_KEY com a sua palavra-passe em TAURI_SIGNING_PRIVATE_KEY_PASSWORD, ambas no teu secret store — nunca no repo. Builds que criam artefactos de updater emitem um sidecar .sig ao lado de cada instalador; a chave pública vai para os clientes, a privada fica no CI.

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


## Configura o updater em build-time

tauri.conf.json inclui um bloco de updater sentinela com endpoints e pubkey vazios — mantém-no, porque o plugin do updater não consegue inicializar sem as chaves presentes. Os valores reais são fundidos em profundidade em build-time através de um overlay JSON --config ou da variável de ambiente TAURI_CONFIG; check:release-config imprime o overlay exato a colar quando SUPASTACK_UPDATER_ENDPOINT e SUPASTACK_UPDATER_PUBKEY estão definidos.

Define os dois ou nenhum: um overlay só de endpoints deixa a pubkey vazia, por isso os checks parecem funcionar enquanto cada instalação falha a verificação de assinatura. O URL de endpoint traz os placeholders {{target}}, {{arch}} e {{current_version}} — o slot de versão é obrigatório — mais um segmento de caminho {{channel}} opcional que ativa os canais 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 o feed latest.json

Cada endpoint responde um manifesto latest.json — version, notes, pub_date e um mapa platforms cobrindo darwin-aarch64, darwin-x86_64, windows-x86_64, windows-aarch64, linux-x86_64 e linux-aarch64 — onde cada entrada emparelha o URL do instalador com a sua assinatura.

Constrói-o com o script release:manifest: ele varre uma diretoria de bundle à procura de artefactos .app.tar.gz, -setup.exe (preferido a .msi) e .AppImage — cada um tem de ter o seu vizinho .sig — e escreve ou funde o manifesto. Os flags cobrem --version, --base-url, --bundle-dir com --platform, --merge para acumular plataformas entre execuções, --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
```


## Canais stable e beta

Quando um endpoint contém o placeholder {{channel}}, o menu da app ativa uma checkbox Beta Updates que muda o feed entre stable e beta. A escolha persiste num ficheiro update-channel ao lado da configuração da app; SUPASTACK_UPDATE_CHANNEL sobrepõe-na por execução — qualquer coisa não reconhecida é ignorada com um aviso — e stable é a predefinição. Sem o placeholder o toggle fica desativado e só o feed stable é consultado.


## Quando os updates são verificados

Um check silencioso em segundo plano corre no arranque e só mostra um diálogo quando existe um update; o item de menu Check for Updates… reporta todos os resultados. Os checks serializam — um segundo pedido concorrente é descartado. Um update disponível oferece Install and Restart, que descarrega, instala e reinicia a app; builds não configurados respondem que os updates não estão configurados, e as falhas aparecem como diálogos em vez de novas tentativas.


## O workflow de release incluído

.github/workflows/desktop-release.yml constrói a matriz — macOS nas duas arquiteturas, Windows e Ubuntu — em tags desktop-v* ou num dispatch manual com versão e canal. Carimba a versão do manifesto a partir da tag (uma release que salte isto oferece-se como update para sempre), funde os manifestos por plataforma e cria uma GitHub release em rascunho com latest.json mais cada instalador e assinatura — marcada como prerelease para canais beta.

Precisa de SUPASTACK_APP_URL e SUPASTACK_UPDATER_ENDPOINT como variáveis do repositório e de SUPASTACK_UPDATER_PUBKEY mais a chave privada de assinatura e a sua palavra-passe como segredos; as credenciais de assinatura Apple são extras opcionais. O runbook completo vive em `docs/desktop-updates.md` no repositório.


## Verificação e resolução de problemas

Instala um build, publica um manifesto mais recente num feed de teste e confirma que o diálogo de update chega no check seguinte e que a app reinicia na nova versão. Depois muda para beta e confirma que a resposta do feed do canal muda.

[Empacotar e publicar](https://supastack.dev/pt/docs/desktop/release.md)

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


## Seguinte

[Por dentro do shell desktop](https://supastack.dev/pt/docs/desktop/internals.md)
