feat(brand): finish desktop chrome rebrand → fee[dB]ack (#23)

main/main split #21 already rebranded splash.html + the splash status
message. This finishes the remaining user-visible chrome:

- Window titles (both BrowserWindows): Slopsmith → fee[dB]ack
- Error dialogs: "failed to start" / "Please restart" (×4) + the
  Velopack updater-error dialog
- macOS mic-permission warning string
- crashReporter productName/companyName label
- package.json: productName → "fee[dB]ack" (+ safe executableName
  "feedback" and artifactName slug so the AppImage/deb filename and
  inner binary avoid the "[dB]" glob metacharacters), description,
  and NSMicrophoneUsageDescription

Deliberately unchanged for continuity:
- package.json "name" (config dir stays ~/.config/slopsmith-desktop —
  testers keep settings/cache) and "appId" (Velopack update identity)
- code comments + the [main] dev console.log

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Byron Gamatos
2026-06-19 16:32:57 +02:00
committed by GitHub
co-authored by Claude Opus 4.8
parent 4b7690b803
commit facac93659
2 changed files with 16 additions and 14 deletions
+5 -3
View File
@@ -1,7 +1,7 @@
{ {
"name": "slopsmith-desktop", "name": "slopsmith-desktop",
"version": "0.2.9", "version": "0.2.9",
"description": "Slopsmith desktop app with integrated audio engine, VST hosting, and amp modeling", "description": "fee[dB]ack desktop app with integrated audio engine, VST hosting, and amp modeling",
"author": { "author": {
"name": "Byron", "name": "Byron",
"email": "byron@ougsoft.com" "email": "byron@ougsoft.com"
@@ -30,7 +30,9 @@
}, },
"build": { "build": {
"appId": "com.byron.slopsmith-desktop", "appId": "com.byron.slopsmith-desktop",
"productName": "Slopsmith", "productName": "fee[dB]ack",
"executableName": "feedback",
"artifactName": "feedback-${version}-${arch}.${ext}",
"directories": { "directories": {
"output": "release" "output": "release"
}, },
@@ -109,7 +111,7 @@
"entitlementsInherit": "resources/entitlements.mac.plist", "entitlementsInherit": "resources/entitlements.mac.plist",
"notarize": true, "notarize": true,
"extendInfo": { "extendInfo": {
"NSMicrophoneUsageDescription": "Slopsmith needs microphone access for guitar input and note detection." "NSMicrophoneUsageDescription": "fee[dB]ack needs microphone access for guitar input and note detection."
}, },
"files": [ "files": [
"build/Release/slopsmith-vst-scan", "build/Release/slopsmith-vst-scan",
+11 -11
View File
@@ -46,8 +46,8 @@ if (process.platform !== 'linux') {
const { app, dialog } = require('electron'); const { app, dialog } = require('electron');
if (app.isPackaged) { if (app.isPackaged) {
dialog.showErrorBox( dialog.showErrorBox(
'Slopsmith update system error', 'fee[dB]ack update system error',
'The Velopack updater failed to initialize. Slopsmith will still ' 'The Velopack updater failed to initialize. fee[dB]ack will still '
+ 'run, but automatic updates may not work until it is reinstalled.' + 'run, but automatic updates may not work until it is reinstalled.'
+ `\n\n${String(err)}`, + `\n\n${String(err)}`,
); );
@@ -66,8 +66,8 @@ import { execFileSync } from 'child_process';
// run before app.whenReady(). uploadToServer:false keeps dumps local — they // run before app.whenReady(). uploadToServer:false keeps dumps local — they
// can be inspected with WinDbg / minidump-stackwalk. // can be inspected with WinDbg / minidump-stackwalk.
crashReporter.start({ crashReporter.start({
productName: 'slopsmith-desktop', productName: 'feedback-desktop',
companyName: 'slopsmith', companyName: 'feedback',
submitURL: '', submitURL: '',
uploadToServer: false, uploadToServer: false,
compress: false, compress: false,
@@ -260,8 +260,8 @@ function failRendererStartup(reason: string): void {
publishStartupStatus({ message: reason, phase: 'error', running: false }); publishStartupStatus({ message: reason, phase: 'error', running: false });
if (mainWindow && !mainWindow.isDestroyed()) { if (mainWindow && !mainWindow.isDestroyed()) {
dialog.showErrorBox( dialog.showErrorBox(
'Slopsmith failed to start', 'fee[dB]ack failed to start',
'The app window did not finish loading. Please restart Slopsmith. ' 'The app window did not finish loading. Please restart fee[dB]ack. '
+ 'If the problem persists, check the backend logs.', + 'If the problem persists, check the backend logs.',
); );
} }
@@ -280,7 +280,7 @@ function createSplashWindow(): void {
fullscreenable: false, fullscreenable: false,
frame: false, frame: false,
show: true, show: true,
title: 'Slopsmith', title: 'fee[dB]ack',
backgroundColor: '#050508', backgroundColor: '#050508',
webPreferences: { webPreferences: {
preload: path.join(__dirname, 'splash-preload.js'), preload: path.join(__dirname, 'splash-preload.js'),
@@ -404,7 +404,7 @@ function createWindow(port: number): void {
height: 900, height: 900,
minWidth: 800, minWidth: 800,
minHeight: 600, minHeight: 600,
title: 'Slopsmith', title: 'fee[dB]ack',
backgroundColor: '#0f172a', // slate-900 to match Slopsmith UI backgroundColor: '#0f172a', // slate-900 to match Slopsmith UI
webPreferences: rendererWebPreferences, webPreferences: rendererWebPreferences,
}); });
@@ -444,7 +444,7 @@ function createWindow(port: number): void {
// Retries are exhausted — the renderer will never paint. Surface the // Retries are exhausted — the renderer will never paint. Surface the
// failure now rather than letting the splash spin until the safety // failure now rather than letting the splash spin until the safety
// timer's full deadline (the give-up budget is well under it). // timer's full deadline (the give-up budget is well under it).
failRendererStartup(`The app window failed to load (network error ${errorCode}). Please restart Slopsmith.`); failRendererStartup(`The app window failed to load (network error ${errorCode}). Please restart fee[dB]ack.`);
return; return;
} }
retryCount += 1; retryCount += 1;
@@ -869,7 +869,7 @@ async function ensureMicrophoneAccess(): Promise<void> {
// explains a silent input; the user must re-enable via System // explains a silent input; the user must re-enable via System
// Settings (or `tccutil reset Microphone`). // Settings (or `tccutil reset Microphone`).
console.warn(`[main] Microphone access is '${status}'; the OS will not re-prompt. ` + console.warn(`[main] Microphone access is '${status}'; the OS will not re-prompt. ` +
'Enable Slopsmith under System Settings → Privacy & Security → Microphone.'); 'Enable fee[dB]ack under System Settings → Privacy & Security → Microphone.');
return; return;
} }
// status === 'not-determined' → this triggers the one-time OS prompt. // status === 'not-determined' → this triggers the one-time OS prompt.
@@ -1065,7 +1065,7 @@ async function startup(): Promise<void> {
// arrives). The retry-exhaustion case surfaces earlier via the // arrives). The retry-exhaustion case surfaces earlier via the
// did-fail-load give-up branch; failRendererStartup() is idempotent so // did-fail-load give-up branch; failRendererStartup() is idempotent so
// whichever path fires first wins. // whichever path fires first wins.
failRendererStartup('The app window failed to load. Please restart Slopsmith.'); failRendererStartup('The app window failed to load. Please restart fee[dB]ack.');
}, SPLASH_RENDERER_DEADLINE_MS); }, SPLASH_RENDERER_DEADLINE_MS);
} }