Add app customization options for title, icons, and Windows metadata (#16)

This commit is contained in:
Pandipipas
2026-02-10 23:47:30 +01:00
committed by GitHub
parent ba82e627db
commit 3a500a682f
2 changed files with 71 additions and 1 deletions
+53
View File
@@ -40,3 +40,56 @@ scoreko-electron-dev/
- `NODECG_BUNDLE_NAME` (default: `scoreko-dev`) - `NODECG_BUNDLE_NAME` (default: `scoreko-dev`)
- `SCOREKO_DASHBOARD_ROUTE` (default: `dashboard/example/main.html?standalone=true`) - `SCOREKO_DASHBOARD_ROUTE` (default: `dashboard/example/main.html?standalone=true`)
- `SCOREKO_LOADING_ROUTE` (default: `dashboard/loading/main.html?standalone=true`) - `SCOREKO_LOADING_ROUTE` (default: `dashboard/loading/main.html?standalone=true`)
- `SCOREKO_APP_TITLE` (default: `Scoreko`)
## Personalización (Windows / Electron)
### 1) Título de la app
- **Durante ejecución**: cambia `SCOREKO_APP_TITLE` para sobreescribir el título de ventana.
- **En instalador y ejecutable**: cambia `build.productName` en `package.json`.
### 2) Ícono en barra de tareas y esquina superior de la ventana
Coloca tu icono en uno de estos paths (prioridad de arriba hacia abajo):
- `static/icons/icon.ico`
- `static/icons/icon.png`
- `static/icon.ico`
- `static/icon.png`
Electron tomará automáticamente el primero que exista.
### 3) Ícono del `.exe` (instalador/app empaquetada)
En `package.json` dentro de `build.win` agrega:
```json
"icon": "static/icons/icon.ico"
```
> Recomendado: `.ico` multi-resolución (16/24/32/48/64/128/256).
### 4) Texto y autor que muestra el popup del Firewall de Windows
Ese diálogo toma datos del ejecutable final:
- **Nombre de app**: suele venir de `productName` y metadatos del ejecutable.
- **Publisher/Autor**: viene de la **firma de código** (certificado). Sin firma, suele salir `Unknown publisher`.
Para personalizarlo correctamente en builds de distribución:
1. Ajusta en `package.json`:
- `description`
- `author`
- `build.productName`
2. Firma el `.exe` con un certificado de tu empresa/persona (`CSC_LINK`/`CSC_KEY_PASSWORD` en `electron-builder`).
> Nota: en desarrollo (`npm run start` / `npm run dev`) puedes ver `GitHub, Inc.` porque estás ejecutando el binario de Electron oficial.
### 5) Otros campos personalizables que te conviene revisar
- `build.appId` (identificador único de la app).
- `build.win.executableName` (nombre del ejecutable sin extensión).
- `build.nsis` (nombre del instalador, iconos de instalador/desinstalador, etc.).
- `build.artifactName` (patrón de nombre del archivo de salida).
+18 -1
View File
@@ -3,7 +3,7 @@ import { ChildProcess, spawn } from "node:child_process";
import fs from "node:fs"; import fs from "node:fs";
import path from "node:path"; import path from "node:path";
const APP_TITLE = "Scoreko"; const APP_TITLE = process.env.SCOREKO_APP_TITLE ?? "Scoreko";
const DEFAULT_NODECG_PORT = process.env.NODECG_PORT ?? "9090"; const DEFAULT_NODECG_PORT = process.env.NODECG_PORT ?? "9090";
const DEFAULT_BUNDLE_NAME = process.env.NODECG_BUNDLE_NAME ?? "scoreko-dev"; const DEFAULT_BUNDLE_NAME = process.env.NODECG_BUNDLE_NAME ?? "scoreko-dev";
const DEFAULT_DASHBOARD_ROUTE = process.env.SCOREKO_DASHBOARD_ROUTE ?? "dashboard/example/main.html?standalone=true"; const DEFAULT_DASHBOARD_ROUTE = process.env.SCOREKO_DASHBOARD_ROUTE ?? "dashboard/example/main.html?standalone=true";
@@ -28,9 +28,12 @@ let stopNodeCGPromise: Promise<void> | null = null;
let isQuitting = false; let isQuitting = false;
function createMainWindow(): BrowserWindow { function createMainWindow(): BrowserWindow {
const iconPath = resolveAppIconPath();
const win = new BrowserWindow({ const win = new BrowserWindow({
show: false, show: false,
title: APP_TITLE, title: APP_TITLE,
...(iconPath ? { icon: iconPath } : {}),
width: 1280, width: 1280,
height: 800, height: 800,
minWidth: 800, minWidth: 800,
@@ -66,10 +69,13 @@ function createMainWindow(): BrowserWindow {
} }
function createLoadingWindow(): BrowserWindow { function createLoadingWindow(): BrowserWindow {
const iconPath = resolveAppIconPath();
const win = new BrowserWindow({ const win = new BrowserWindow({
show: false, show: false,
frame: false, frame: false,
title: APP_TITLE, title: APP_TITLE,
...(iconPath ? { icon: iconPath } : {}),
width: 300, width: 300,
height: 300, height: 300,
resizable: false, resizable: false,
@@ -90,6 +96,17 @@ function createLoadingWindow(): BrowserWindow {
return win; return win;
} }
function resolveAppIconPath(): string | undefined {
const candidates = [
path.join(rootPath, "static", "icons", "icon.ico"),
path.join(rootPath, "static", "icons", "icon.png"),
path.join(rootPath, "static", "icon.ico"),
path.join(rootPath, "static", "icon.png"),
];
return candidates.find((candidate) => fs.existsSync(candidate));
}
function validateNodeCGInstall(): void { function validateNodeCGInstall(): void {
const indexPath = path.join(nodecgPath, "index.js"); const indexPath = path.join(nodecgPath, "index.js");
const nodecgBootstrapPath = path.join(nodecgPath, "node_modules", "nodecg", "dist", "server", "bootstrap.js"); const nodecgBootstrapPath = path.join(nodecgPath, "node_modules", "nodecg", "dist", "server", "bootstrap.js");