diff --git a/assets/icon.icns b/assets/icon.icns new file mode 100644 index 0000000..85cd39a Binary files /dev/null and b/assets/icon.icns differ diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000..95bce61 Binary files /dev/null and b/assets/icon.png differ diff --git a/forge.config.ts b/forge.config.ts index 41c1ab6..8e4547a 100644 --- a/forge.config.ts +++ b/forge.config.ts @@ -11,11 +11,17 @@ const config: ForgeConfig = { packagerConfig: { name: 'Bradly', executableName: 'bradly', + icon: './assets/icon', asar: { // Remotion compositor binaries MUST be outside app.asar // because they are native executables that need direct filesystem access unpack: '{**/node_modules/@remotion/compositor-*/**,**/node_modules/@remotion/renderer/**}', }, + // Include the built renderer and Remotion bundle as extra resources + extraResource: [ + './out/renderer', + './out/remotion-bundle', + ], // Ignore development files during packaging ignore: [ /^\/src$/, diff --git a/package.json b/package.json index bd98fac..e069b1b 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "main": "out/main/index.js", "scripts": { "dev": "electron-vite dev", - "dev:web": "tsx server.ts", + "dev:web": "npx tsx server.ts", "build": "electron-vite build", "build:web": "vite build && esbuild server.ts --bundle --platform=node --format=cjs --packages=external --sourcemap --outfile=dist/server.cjs", "start": "electron-vite preview", diff --git a/src/electron/main.ts b/src/electron/main.ts index aadf13f..4b875a1 100644 --- a/src/electron/main.ts +++ b/src/electron/main.ts @@ -71,6 +71,26 @@ async function startExpressServer(): Promise { const { createExpressApp } = await import('../../server'); const expressApp = await createExpressApp(); + // In production Electron, serve the built renderer files + if (!process.env.NODE_ENV || process.env.NODE_ENV !== 'development') { + const { default: express } = await import('express'); + // electron-vite builds renderer to out/renderer/ + const rendererPath = app.isPackaged + ? path.join(process.resourcesPath, 'renderer') + : path.join(__dirname, '..', '..', 'out', 'renderer'); + + if (fs.existsSync(rendererPath)) { + expressApp.use(express.static(rendererPath)); + // SPA fallback — serve index.html for all non-API routes + expressApp.get('*', (_req: any, res: any) => { + res.sendFile(path.join(rendererPath, 'index.html')); + }); + console.log('📦 Serving renderer from:', rendererPath); + } else { + console.warn('⚠️ Renderer build not found at:', rendererPath); + } + } + return new Promise((resolve, reject) => { const server = expressApp.listen(EXPRESS_PORT, '127.0.0.1', () => { console.log(`🚀 Express server on http://127.0.0.1:${EXPRESS_PORT}`);