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
+11 -11
View File
@@ -46,8 +46,8 @@ if (process.platform !== 'linux') {
const { app, dialog } = require('electron');
if (app.isPackaged) {
dialog.showErrorBox(
'Slopsmith update system error',
'The Velopack updater failed to initialize. Slopsmith will still '
'fee[dB]ack update system error',
'The Velopack updater failed to initialize. fee[dB]ack will still '
+ 'run, but automatic updates may not work until it is reinstalled.'
+ `\n\n${String(err)}`,
);
@@ -66,8 +66,8 @@ import { execFileSync } from 'child_process';
// run before app.whenReady(). uploadToServer:false keeps dumps local — they
// can be inspected with WinDbg / minidump-stackwalk.
crashReporter.start({
productName: 'slopsmith-desktop',
companyName: 'slopsmith',
productName: 'feedback-desktop',
companyName: 'feedback',
submitURL: '',
uploadToServer: false,
compress: false,
@@ -260,8 +260,8 @@ function failRendererStartup(reason: string): void {
publishStartupStatus({ message: reason, phase: 'error', running: false });
if (mainWindow && !mainWindow.isDestroyed()) {
dialog.showErrorBox(
'Slopsmith failed to start',
'The app window did not finish loading. Please restart Slopsmith. '
'fee[dB]ack failed to start',
'The app window did not finish loading. Please restart fee[dB]ack. '
+ 'If the problem persists, check the backend logs.',
);
}
@@ -280,7 +280,7 @@ function createSplashWindow(): void {
fullscreenable: false,
frame: false,
show: true,
title: 'Slopsmith',
title: 'fee[dB]ack',
backgroundColor: '#050508',
webPreferences: {
preload: path.join(__dirname, 'splash-preload.js'),
@@ -404,7 +404,7 @@ function createWindow(port: number): void {
height: 900,
minWidth: 800,
minHeight: 600,
title: 'Slopsmith',
title: 'fee[dB]ack',
backgroundColor: '#0f172a', // slate-900 to match Slopsmith UI
webPreferences: rendererWebPreferences,
});
@@ -444,7 +444,7 @@ function createWindow(port: number): void {
// Retries are exhausted — the renderer will never paint. Surface the
// failure now rather than letting the splash spin until the safety
// 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;
}
retryCount += 1;
@@ -869,7 +869,7 @@ async function ensureMicrophoneAccess(): Promise<void> {
// explains a silent input; the user must re-enable via System
// Settings (or `tccutil reset Microphone`).
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;
}
// 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
// did-fail-load give-up branch; failRendererStartup() is idempotent so
// 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);
}