From 604cdd54d6a55ebad3fa4f113355855ad9eb7be7 Mon Sep 17 00:00:00 2001
From: Psychotoxical <171614930+Psychotoxical@users.noreply.github.com>
Date: Sat, 27 Jun 2026 15:56:54 +0200
Subject: [PATCH] feat(updater): show the WinGet update command in the Windows
update modal (#1202)
* feat(updater): show WinGet update command in the Windows update modal
* docs(changelog): WinGet update command in the Windows update dialog
---
CHANGELOG.md | 6 ++++++
src/components/AppUpdater.tsx | 8 +++++++-
src/hooks/useAppUpdater.ts | 7 ++++++-
src/locales/de/common.ts | 1 +
src/locales/en/common.ts | 1 +
src/locales/es/common.ts | 1 +
src/locales/fr/common.ts | 1 +
src/locales/hu/common.ts | 1 +
src/locales/ja/common.ts | 1 +
src/locales/nb/common.ts | 1 +
src/locales/nl/common.ts | 1 +
src/locales/pl/common.ts | 1 +
src/locales/ro/common.ts | 1 +
src/locales/ru/common.ts | 1 +
src/locales/zh/common.ts | 1 +
src/styles/layout/update-toast.css | 22 ++++++++++++++++++++++
16 files changed, 53 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b64e7448..c9b7acfd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -135,6 +135,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* Sort a playlist by **Date added** (newest or oldest first), or by title, artist, album and the other columns, from a new sort dropdown in the playlist filter toolbar. The Subsonic API has no per-track "added on" date, so this follows the playlist's own order — servers add new tracks at the end, so newest-first puts your latest additions on top.
+### WinGet update command in the update dialog (Windows)
+
+**By [@Psychotoxical](https://github.com/Psychotoxical), PR [#1202](https://github.com/Psychotoxical/psysonic/pull/1202)**
+
+* The Windows update dialog now also shows the WinGet command (`winget upgrade Psysonic`) next to the installer download, so you can update whichever way you installed.
+
## Changed
diff --git a/src/components/AppUpdater.tsx b/src/components/AppUpdater.tsx
index 42e3ec5d..3beb7157 100644
--- a/src/components/AppUpdater.tsx
+++ b/src/components/AppUpdater.tsx
@@ -13,7 +13,7 @@ export default function AppUpdater() {
const {
release, dismissed, setDismissed, changelogOpen, setChangelogOpen,
dlState, dlProgress, dlError, countdown,
- asset, showAurHint, useTauriUpdater, showInstallBtn, pct,
+ asset, showAurHint, showWingetHint, useTauriUpdater, showInstallBtn, pct,
handleSkip, handleRestartNow, handleDownload, handleShowFolder,
} = useAppUpdater();
@@ -184,6 +184,12 @@ export default function AppUpdater() {
{formatBytes(asset.size)}
)}
+ {dlState === 'idle' && showWingetHint && (
+
diff --git a/src/hooks/useAppUpdater.ts b/src/hooks/useAppUpdater.ts
index 1d945498..87f8a1d7 100644
--- a/src/hooks/useAppUpdater.ts
+++ b/src/hooks/useAppUpdater.ts
@@ -196,6 +196,11 @@ export function useAppUpdater() {
};
const showAurHint = IS_LINUX && isArch;
+ // Windows can also update through WinGet once a release clears moderation
+ // (the notice itself is held back for that window, see #1200). Shown next to
+ // the installer download, not instead of it — not every Windows user
+ // installed via WinGet.
+ const showWingetHint = IS_WINDOWS;
// On macOS the Tauri Updater handles architecture, signature verification
// and in-place install — we don't need (and should not show) a DMG asset.
const useTauriUpdater = IS_MACOS;
@@ -208,7 +213,7 @@ export function useAppUpdater() {
return {
release, dismissed, setDismissed, changelogOpen, setChangelogOpen,
dlState, dlProgress, dlError, countdown,
- asset, showAurHint, useTauriUpdater, showInstallBtn, pct,
+ asset, showAurHint, showWingetHint, useTauriUpdater, showInstallBtn, pct,
handleSkip, handleRestartNow, handleDownload, handleShowFolder,
};
}
diff --git a/src/locales/de/common.ts b/src/locales/de/common.ts
index e79a12e1..9c686cfd 100644
--- a/src/locales/de/common.ts
+++ b/src/locales/de/common.ts
@@ -48,6 +48,7 @@ export const common = {
updaterShowFolder: 'Im Ordner anzeigen',
updaterInstallHint: 'Psysonic schließen und das Installationsprogramm manuell ausführen.',
updaterAurHint: 'Update über AUR installieren:',
+ updaterWingetHint: 'Oder per WinGet aktualisieren:',
updaterErrorMsg: 'Download fehlgeschlagen',
updaterInstallNow: 'Jetzt installieren',
updaterMacReadyTitle: 'Bereit zur Installation',
diff --git a/src/locales/en/common.ts b/src/locales/en/common.ts
index 62d50258..157278c3 100644
--- a/src/locales/en/common.ts
+++ b/src/locales/en/common.ts
@@ -48,6 +48,7 @@ export const common = {
updaterShowFolder: 'Show in Folder',
updaterInstallHint: 'Close Psysonic and run the installer manually.',
updaterAurHint: 'Install the update via AUR:',
+ updaterWingetHint: 'Or update via WinGet:',
updaterErrorMsg: 'Download failed',
updaterRetryBtn: 'Retry',
updaterInstallNow: 'Install now',
diff --git a/src/locales/es/common.ts b/src/locales/es/common.ts
index ff753a4b..3a3a99e8 100644
--- a/src/locales/es/common.ts
+++ b/src/locales/es/common.ts
@@ -47,6 +47,7 @@ export const common = {
updaterShowFolder: 'Mostrar en Carpeta',
updaterInstallHint: 'Cierra Psysonic y ejecuta el instalador manualmente.',
updaterAurHint: 'Instala la actualización vía AUR:',
+ updaterWingetHint: 'O actualiza vía WinGet:',
updaterErrorMsg: 'Error de descarga',
updaterRetryBtn: 'Reintentar',
durationHoursMinutes: '{{hours}}h {{minutes}}m',
diff --git a/src/locales/fr/common.ts b/src/locales/fr/common.ts
index f417d8de..419cf555 100644
--- a/src/locales/fr/common.ts
+++ b/src/locales/fr/common.ts
@@ -47,6 +47,7 @@ export const common = {
updaterShowFolder: 'Afficher dans le dossier',
updaterInstallHint: 'Fermez Psysonic et lancez le programme d\'installation manuellement.',
updaterAurHint: 'Installer la mise à jour via AUR :',
+ updaterWingetHint: 'Ou mettez à jour via WinGet :',
updaterErrorMsg: 'Échec du téléchargement',
updaterRetryBtn: 'Réessayer',
durationHoursMinutes: '{{hours}} h {{minutes}} min',
diff --git a/src/locales/hu/common.ts b/src/locales/hu/common.ts
index e5cbd794..70b6dd62 100644
--- a/src/locales/hu/common.ts
+++ b/src/locales/hu/common.ts
@@ -48,6 +48,7 @@ export const common = {
updaterShowFolder: 'Megjelenítés a mappában',
updaterInstallHint: 'Zárd be a Psysonicot, és futtasd a telepítőt kézzel.',
updaterAurHint: 'Telepítsd a frissítést az AUR-on keresztül:',
+ updaterWingetHint: 'Vagy frissíts a WinGeten keresztül:',
updaterErrorMsg: 'A letöltés nem sikerült',
updaterRetryBtn: 'Újra',
updaterInstallNow: 'Telepítés most',
diff --git a/src/locales/ja/common.ts b/src/locales/ja/common.ts
index c5e76d15..9d15bf75 100644
--- a/src/locales/ja/common.ts
+++ b/src/locales/ja/common.ts
@@ -48,6 +48,7 @@ export const common = {
updaterShowFolder: 'フォルダーに表示',
updaterInstallHint: 'Psysonic を閉じて、インストーラーを手動で実行してください。',
updaterAurHint: 'AUR からアップデートをインストール:',
+ updaterWingetHint: 'または WinGet で更新:',
updaterErrorMsg: 'ダウンロードに失敗しました',
updaterRetryBtn: '再試行',
updaterInstallNow: '今すぐインストール',
diff --git a/src/locales/nb/common.ts b/src/locales/nb/common.ts
index f99ba76e..34070829 100644
--- a/src/locales/nb/common.ts
+++ b/src/locales/nb/common.ts
@@ -47,6 +47,7 @@ export const common = {
updaterShowFolder: 'Vis i mappe',
updaterInstallHint: 'Lukk Psysonic og kjør installasjonsprogrammet manuelt.',
updaterAurHint: 'Installer oppdateringen via AUR:',
+ updaterWingetHint: 'Eller oppdater via WinGet:',
updaterErrorMsg: 'Nedlasting mislyktes',
updaterRetryBtn: 'Prøv igjen',
durationHoursMinutes: '{{hours}} t {{minutes}} min',
diff --git a/src/locales/nl/common.ts b/src/locales/nl/common.ts
index 5d26233b..033e2f1e 100644
--- a/src/locales/nl/common.ts
+++ b/src/locales/nl/common.ts
@@ -47,6 +47,7 @@ export const common = {
updaterShowFolder: 'Tonen in map',
updaterInstallHint: 'Sluit Psysonic en voer het installatieprogramma handmatig uit.',
updaterAurHint: 'Update installeren via AUR:',
+ updaterWingetHint: 'Of bijwerken via WinGet:',
updaterErrorMsg: 'Downloaden mislukt',
updaterRetryBtn: 'Opnieuw proberen',
durationHoursMinutes: '{{hours}} u {{minutes}} min',
diff --git a/src/locales/pl/common.ts b/src/locales/pl/common.ts
index 403dda0f..7118731b 100644
--- a/src/locales/pl/common.ts
+++ b/src/locales/pl/common.ts
@@ -48,6 +48,7 @@ export const common = {
updaterShowFolder: 'Pokaż w folderze',
updaterInstallHint: 'Zamknij PsySonic i uruchom instalator ręcznie.',
updaterAurHint: 'Zainstaluj aktualizację przez AUR:',
+ updaterWingetHint: 'Lub zaktualizuj przez WinGet:',
updaterErrorMsg: 'Pobieranie nie powiodło się',
updaterRetryBtn: 'Spróbuj ponownie',
updaterInstallNow: 'Zainstaluj teraz',
diff --git a/src/locales/ro/common.ts b/src/locales/ro/common.ts
index c15aa259..ffedf001 100644
--- a/src/locales/ro/common.ts
+++ b/src/locales/ro/common.ts
@@ -48,6 +48,7 @@ export const common = {
updaterShowFolder: 'Arată în Folder',
updaterInstallHint: 'Închide Psysonic și rulează programul de instalare manual.',
updaterAurHint: 'Instalează update-ul prin AUR:',
+ updaterWingetHint: 'Sau actualizează prin WinGet:',
updaterErrorMsg: 'Descărcare eșuată',
updaterRetryBtn: 'Reîncearcă',
updaterInstallNow: 'Instalează acum',
diff --git a/src/locales/ru/common.ts b/src/locales/ru/common.ts
index e58606d5..ac83ac47 100644
--- a/src/locales/ru/common.ts
+++ b/src/locales/ru/common.ts
@@ -48,6 +48,7 @@ export const common = {
updaterShowFolder: 'Показать в папке',
updaterInstallHint: 'Закройте Psysonic и запустите установщик вручную.',
updaterAurHint: 'Установить обновление через AUR:',
+ updaterWingetHint: 'Или обновить через WinGet:',
updaterErrorMsg: 'Ошибка загрузки',
updaterRetryBtn: 'Повторить',
updaterInstallNow: 'Установить сейчас',
diff --git a/src/locales/zh/common.ts b/src/locales/zh/common.ts
index fcf54d8f..431ecf16 100644
--- a/src/locales/zh/common.ts
+++ b/src/locales/zh/common.ts
@@ -47,6 +47,7 @@ export const common = {
updaterShowFolder: '在文件夹中显示',
updaterInstallHint: '请关闭 Psysonic 并手动运行安装程序。',
updaterAurHint: '通过 AUR 安装更新:',
+ updaterWingetHint: '或通过 WinGet 更新:',
updaterErrorMsg: '下载失败',
updaterRetryBtn: '重试',
durationHoursMinutes: '{{hours}}小时{{minutes}}分钟',
diff --git a/src/styles/layout/update-toast.css b/src/styles/layout/update-toast.css
index a1a00e1f..084e3020 100644
--- a/src/styles/layout/update-toast.css
+++ b/src/styles/layout/update-toast.css
@@ -280,6 +280,28 @@
.update-modal-aur-alt {
color: var(--text-muted);
}
+/* WinGet update hint — shown alongside the Windows installer download, mirrors
+ the AUR hint styling with a little top gap to separate it from the asset. */
+.update-modal-winget {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+ margin-top: var(--space-3);
+}
+.update-modal-winget-title {
+ font-size: 13px;
+ color: var(--text-secondary);
+}
+.update-modal-winget-cmd {
+ display: block;
+ background: var(--bg-glass);
+ border: 1px solid var(--border-subtle);
+ border-radius: var(--radius-sm);
+ padding: 6px 10px;
+ font-size: 12px;
+ color: var(--accent);
+ font-family: monospace;
+}
.update-modal-asset-none {
padding: 4px 0;
}