From 67f08b2effa051844294ec5629b6f87af0c4c71b Mon Sep 17 00:00:00 2001 From: Phelipe Lorran <112786693+httpsphl@users.noreply.github.com> Date: Tue, 29 Sep 2026 22:45:18 -0300 Subject: [PATCH] feat(installer): Botloft's own look, with no third-party names The installer and uninstaller use the app icon instead of NSIS's own; the welcome and finish pages get a black side image with the mascot and the name, and the other pages the mascot in the header, on the right. Both images come from app-icon.svg without its square. The footer shows the copyright instead of "Nullsoft Install System", and a post-install hook writes Botloft as the publisher in Installed apps. bundle.publisher stays unset on purpose: Tauri also names the registry key that keeps the install folder after it, so changing it would make the first update of an existing install run the old uninstaller without its folder. Spec 15.4 follows. --- app/src-tauri/tauri.bundle.conf.json | 4 ++++ app/src-tauri/tauri.conf.json | 1 + app/src-tauri/windows/hooks.nsh | 13 +++++++++++++ app/src-tauri/windows/installer-header.bmp | Bin 0 -> 25818 bytes app/src-tauri/windows/installer-sidebar.bmp | Bin 0 -> 154542 bytes docs/spec.md | 1 + 6 files changed, 19 insertions(+) create mode 100644 app/src-tauri/windows/installer-header.bmp create mode 100644 app/src-tauri/windows/installer-sidebar.bmp diff --git a/app/src-tauri/tauri.bundle.conf.json b/app/src-tauri/tauri.bundle.conf.json index 76752f65..fc42e1dc 100644 --- a/app/src-tauri/tauri.bundle.conf.json +++ b/app/src-tauri/tauri.bundle.conf.json @@ -6,6 +6,10 @@ "windows": { "nsis": { "installMode": "currentUser", + "installerIcon": "icons/icon.ico", + "uninstallerIcon": "icons/icon.ico", + "sidebarImage": "windows/installer-sidebar.bmp", + "headerImage": "windows/installer-header.bmp", "languages": ["English", "PortugueseBR", "Spanish"], "installerHooks": "./windows/hooks.nsh" } diff --git a/app/src-tauri/tauri.conf.json b/app/src-tauri/tauri.conf.json index 007939e9..0d8b1814 100644 --- a/app/src-tauri/tauri.conf.json +++ b/app/src-tauri/tauri.conf.json @@ -37,6 +37,7 @@ }, "bundle": { "active": true, + "copyright": "Copyright 2026 Phelipe Lorran", "targets": [ "nsis" ], diff --git a/app/src-tauri/windows/hooks.nsh b/app/src-tauri/windows/hooks.nsh index af8e7fcc..8aa931cf 100644 --- a/app/src-tauri/windows/hooks.nsh +++ b/app/src-tauri/windows/hooks.nsh @@ -2,6 +2,19 @@ ; data folder as a scheduled task, so installing or updating the app never ; touches it; the app updates the daemon when it next opens. +; The header image (installer-header.bmp) sits on the right of each page, +; next to the title, as the Botloft mascot on the page's white. +!define MUI_HEADERIMAGE_RIGHT + +!macro NSIS_HOOK_POSTINSTALL + ; Installed apps shows Botloft as the publisher. `bundle.publisher` stays + ; unset on purpose: Tauri also names the key that keeps the install folder + ; after it (Software\\Botloft), so a new name would make the + ; first update of an existing install run the old uninstaller without its + ; folder. + WriteRegStr SHCTX "${UNINSTKEY}" "Publisher" "Botloft" +!macroend + !macro NSIS_HOOK_PREUNINSTALL ; A real uninstall stops the daemon and removes its scheduled task and ; binary. Bots and data stay in %LOCALAPPDATA%\Botloft. An update runs diff --git a/app/src-tauri/windows/installer-header.bmp b/app/src-tauri/windows/installer-header.bmp new file mode 100644 index 0000000000000000000000000000000000000000..deb54c868006e847a019832976a8343e5df3eee6 GIT binary patch literal 25818 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 Xun1TLECLn*i-1MIB480Xoe}u|pl|sy literal 0 HcmV?d00001 diff --git a/docs/spec.md b/docs/spec.md index 92953fcf..7c9f6ec3 100644 --- a/docs/spec.md +++ b/docs/spec.md @@ -704,6 +704,7 @@ Identidade: o mascote do Botloft é uma chama com olhos. O ícone do app (`app/a - `pnpm bundle` (em `app/`) roda `scripts/sidecar.mjs`, que compila o `botloftd` em release e o copia para `src-tauri/binaries/botloftd-.exe`, e depois `tauri build --config src-tauri/tauri.bundle.conf.json`. Esse arquivo liga o `externalBin` e o NSIS; ele fica fora do `tauri.conf.json` porque o `tauri-build` copia o `externalBin` também em dev e no `cargo clippy`, o que exigiria o sidecar em todo build e sobrescreveria o `target\debug\botloftd.exe` com a cópia de release. - NSIS por usuário (`installMode = currentUser`), sem pedir administrador, em `%LOCALAPPDATA%\Botloft` (seção 5). O instalador não mexe no daemon: ele roda da própria cópia em `\bin`, então o arquivo do sidecar nunca está em uso. - Hook `NSIS_HOOK_PREUNINSTALL` (`src-tauri/windows/hooks.nsh`): numa desinstalação de verdade, `botloftd service uninstall` para o daemon e apaga a tarefa e o binário, e o valor `Botloft` da chave Run sai (15.2); bots e dados ficam. Uma atualização também roda o desinstalador antigo, com `/UPDATE`: aí o hook não faz nada e o daemon continua rodando até o app novo abrir e atualizá-lo (15.2). +- Marca do instalador, sem nome de terceiros à vista: o instalador e o desinstalador usam o ícone do app (`icons/icon.ico`); as telas de boas-vindas e de conclusão têm a imagem lateral `windows/installer-sidebar.bmp` (164×314, o mascote e "Botloft" sobre o preto) e as outras telas o cabeçalho `windows/installer-header.bmp` (150×57, à direita, com `MUI_HEADERIMAGE_RIGHT` no arquivo de hooks). As duas imagens saem do `app-icon.svg` sem o quadrado preto. O rodapé mostra o `bundle.copyright` no lugar de "Nullsoft Install System", e o `NSIS_HOOK_POSTINSTALL` grava "Botloft" como editor em Aplicativos instalados. O `bundle.publisher` fica vazio de propósito: o Tauri dá o nome dele à chave que guarda a pasta de instalação (`Software\\Botloft`, hoje `github`, a segunda parte do identificador), e trocá-lo faria a primeira atualização de uma instalação existente rodar o desinstalador antigo sem a pasta. Por isso a empresa nas propriedades do `Botloft.exe` continua `github`. - O manifesto do app (`src-tauri/windows/app.manifest`) é o padrão do Tauri (controles comuns v6) mais `longPathAware`. ### 15.5 Atualizações