diff --git a/apps/desktop/src/lib/window-loader.ts b/apps/desktop/src/lib/window-loader.ts index 9ab01aed160..cb8c51af626 100644 --- a/apps/desktop/src/lib/window-loader.ts +++ b/apps/desktop/src/lib/window-loader.ts @@ -24,12 +24,21 @@ export function registerRoute(props: { if (isDev) { // Development: load from Vite dev server with hash routing const url = `http://localhost:${PORTS.VITE_DEV_SERVER}/#/`; - props.browserWindow.loadURL(url); + console.log(`[window-loader] Loading dev URL: ${url}`); + props.browserWindow.loadURL(url).catch((error) => { + console.error("[window-loader] Failed to load dev URL:", error); + }); } else { // Production: load from custom protocol with hash routing // Origin becomes: superset://app (trusted by Better Auth) - const fileName = props.htmlFile.split("/").pop() || "index.html"; + // Split on both forward and back slashes for cross-platform compatibility + const fileName = props.htmlFile.split(/[/\\]/).pop() || "index.html"; const url = `${PROTOCOL_SCHEME}://app/${fileName}#/`; - props.browserWindow.loadURL(url); + console.log(`[window-loader] Loading production URL: ${url}`); + console.log(`[window-loader] HTML file path: ${props.htmlFile}`); + props.browserWindow.loadURL(url).catch((error) => { + console.error("[window-loader] Failed to load production URL:", error); + console.error("[window-loader] Attempted URL:", url); + }); } } diff --git a/apps/desktop/src/main/index.ts b/apps/desktop/src/main/index.ts index f679d450456..c51aa389718 100644 --- a/apps/desktop/src/main/index.ts +++ b/apps/desktop/src/main/index.ts @@ -211,6 +211,14 @@ if (!gotTheLock) { // Register custom protocol to serve app files in production // This provides a stable origin (superset://app or superset-dev://app) for Better Auth CORS if (process.env.NODE_ENV !== "development") { + console.log( + `[main] Registering protocol handler for: ${PROTOCOL_SCHEME}`, + ); + console.log(`[main] __dirname: ${__dirname}`); + console.log( + `[main] Renderer path: ${path.join(__dirname, "../renderer")}`, + ); + protocol.handle(PROTOCOL_SCHEME, (request) => { // Parse URL to extract pathname (e.g., superset://app/index.html#/ -> /index.html) const parsedUrl = new URL(request.url); @@ -218,6 +226,9 @@ if (!gotTheLock) { const filePath = path.normalize( path.join(__dirname, "../renderer", pathname), ); + console.log(`[protocol] Request: ${request.url}`); + console.log(`[protocol] Pathname: ${pathname}`); + console.log(`[protocol] Resolved file path: ${filePath}`); return net.fetch(`file://${filePath}`); }); } diff --git a/apps/desktop/src/main/windows/main.ts b/apps/desktop/src/main/windows/main.ts index dc40dfeebeb..00a74a9cb27 100644 --- a/apps/desktop/src/main/windows/main.ts +++ b/apps/desktop/src/main/windows/main.ts @@ -171,6 +171,7 @@ export async function MainWindow() { ); window.webContents.on("did-finish-load", async () => { + console.log("[main-window] Renderer loaded successfully"); // Restore maximized state if it was saved if (initialBounds.isMaximized) { window.maximize(); @@ -178,6 +179,28 @@ export async function MainWindow() { window.show(); }); + window.webContents.on( + "did-fail-load", + (_event, errorCode, errorDescription, validatedURL) => { + console.error("[main-window] Failed to load renderer:"); + console.error(` Error code: ${errorCode}`); + console.error(` Description: ${errorDescription}`); + console.error(` URL: ${validatedURL}`); + // Show the window anyway so user can see something is wrong + window.show(); + }, + ); + + window.webContents.on("render-process-gone", (_event, details) => { + console.error("[main-window] Renderer process gone:", details); + }); + + window.webContents.on("preload-error", (_event, preloadPath, error) => { + console.error("[main-window] Preload script error:"); + console.error(` Path: ${preloadPath}`); + console.error(` Error:`, error); + }); + window.on("close", () => { // Save window state first, before any cleanup const isMaximized = window.isMaximized();