A blank white screen after building a Lovable app is usually caused by issues in vite.config.ts, missing environment variables, or JavaScript errors that crash the app before it renders. Open the browser console in Preview to find the specific error, then fix the root cause. If the app worked before, use Lovable's version history to revert to the last working version and isolate the change that broke it.
Why blank screens happen after building a Lovable app
A blank screen means your app's HTML loaded, but the JavaScript failed to execute and render your React components. The page is technically served — it is not a 404 — but nothing appears because the React app crashed silently before mounting. Lovable's own documentation identifies vite.config.ts issues as the primary cause. When the Lovable AI modifies your Vite configuration (for example, adding plugins, changing the base path, or introducing security headers), it can accidentally break how the build bundles your JavaScript. The built files either fail to load or load from the wrong path. Missing environment variables are the second most common cause. If your app tries to initialize a Supabase client with an undefined URL, or calls an API with a missing key, the initialization code throws an error before any component renders. This is especially common when deploying to production where Lovable Cloud secrets are not automatically available. The third category is runtime JavaScript errors — an undefined variable, a failed import, or a component that throws during render. React's default behavior is to unmount the entire component tree when an unhandled error occurs, leaving you with a blank white page and no visible indication of what went wrong.
- Misconfigured vite.config.ts — wrong base path, broken plugin, or injected security headers
- Missing VITE_ environment variables causing Supabase or API initialization to fail
- JavaScript runtime error crashing the React app before it mounts
- Asset path mismatch — built JS/CSS files referenced at paths that return 404
- Security headers (CSP, X-Frame-Options) accidentally blocking script execution
- Authentication logic redirecting to a blank or nonexistent route on load
Error messages you might see
Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "application/octet-stream"The hosting platform is serving your JavaScript files with the wrong content type. This usually happens when deploying the source code folder instead of the dist/ build output folder.
TypeError: Cannot read properties of undefined (reading 'create')A Supabase or API client is being created with undefined configuration values. Check that all required VITE_ environment variables are set in Cloud tab → Secrets or on your hosting platform.
Uncaught SyntaxError: Unexpected token '<'The browser expected a JavaScript file but received an HTML page (likely a 404 page). This means the asset path in your built HTML does not match where the JavaScript file actually exists on the server.
ChunkLoadError: Loading chunk [name] failedA code-split JavaScript chunk could not be loaded. This happens when asset paths are wrong after deployment, or when a cached HTML file references chunks from a previous build that no longer exist.
Before you start
- A Lovable project that shows a blank screen after building or publishing
- Access to browser developer tools (right-click → Inspect → Console tab)
- Knowledge of whether the blank screen appeared after a specific change or on a fresh deploy
How to fix it
Check the browser console for the actual error
The blank screen hides the real error — the console reveals exactly what failed
Check the browser console for the actual error
The blank screen hides the real error — the console reveals exactly what failed
Open your published or preview URL in a browser. Right-click anywhere on the blank page and select Inspect (or press F12). Go to the Console tab. Look for red error messages — they tell you exactly why the app failed to render. Common patterns: 'Cannot read properties of undefined' means missing data or config, 'Failed to load module script' means asset path issues, and 'process is not defined' means environment variable syntax is wrong. Copy the exact error text for the next steps.
Expected result: You see one or more red error messages in the console that explain why the screen is blank.
Review and fix your vite.config.ts
Lovable's docs identify vite.config.ts as the primary cause of blank screens after build
Review and fix your vite.config.ts
Lovable's docs identify vite.config.ts as the primary cause of blank screens after build
Open your project in Lovable and use Dev Mode or the code panel to find vite.config.ts in the project root. Check for any unusual configurations: custom base paths, manually added plugins, security header middleware, or proxy settings. If the AI added something complex, the safest approach is to simplify back to the default Lovable Vite config. Prompt Lovable in Agent Mode to review and fix it, or manually reset it to the standard configuration shown below.
// Broken: AI added a wrong base path or CSP headersimport { defineConfig } from 'vite';import react from '@vitejs/plugin-react-swc';export default defineConfig({ base: '/my-app/', // Wrong: causes all asset paths to break plugins: [react()], server: { headers: { 'Content-Security-Policy': "script-src 'none'" } },});// Fixed: standard Lovable Vite configurationimport { defineConfig } from 'vite';import react from '@vitejs/plugin-react-swc';import path from 'path';export default defineConfig({ plugins: [react()], resolve: { alias: { '@': path.resolve(__dirname, './src'), }, }, server: { host: '::', port: 8080, },});Expected result: After saving and rebuilding, the app loads without asset path errors in the console.
Verify all environment variables are present
Missing VITE_ variables cause silent crashes when the app tries to initialize API clients
Verify all environment variables are present
Missing VITE_ variables cause silent crashes when the app tries to initialize API clients
Click the + button next to Preview and open the Cloud tab → Secrets. Confirm that VITE_SUPABASE_URL, VITE_SUPABASE_PUBLISHABLE_KEY, and any other required variables are listed. If deploying to Vercel or Netlify, also check that these same variables are set on the hosting platform. A common blank-screen cause is that the Supabase client initialization throws because the URL is undefined, which crashes the entire React app before anything renders.
// Crashes if VITE_SUPABASE_URL is undefined — causes blank screenimport { createClient } from '@supabase/supabase-js';const supabase = createClient( import.meta.env.VITE_SUPABASE_URL, import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY);// Safe initialization with fallback and error boundaryimport { createClient } from '@supabase/supabase-js';const url = import.meta.env.VITE_SUPABASE_URL;const key = import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY;if (!url || !key) { console.error('Supabase environment variables are missing. Check Cloud tab → Secrets.');}export const supabase = createClient(url ?? '', key ?? '');Expected result: The app either renders correctly with valid config, or shows a clear console error about missing variables instead of a blank screen.
Add an ErrorBoundary to catch rendering failures
Without an ErrorBoundary, any React rendering error results in a completely blank screen
Add an ErrorBoundary to catch rendering failures
Without an ErrorBoundary, any React rendering error results in a completely blank screen
React unmounts the entire component tree when an unhandled error occurs during rendering. An ErrorBoundary component catches these errors and shows a fallback UI instead of a blank page. This gives you and your users a visible error message and makes debugging much faster. If this requires changes across multiple generated components, RapidDev's engineers have handled this exact pattern across 600+ Lovable projects.
// No error boundary — any render error causes blank screenimport { BrowserRouter } from 'react-router-dom';function App() { return ( <BrowserRouter> <Routes>...</Routes> </BrowserRouter> );}// ErrorBoundary catches render errors and shows fallback UIimport { Component, type ReactNode } from 'react';class ErrorBoundary extends Component< { children: ReactNode }, { hasError: boolean; error: Error | null }> { state = { hasError: false, error: null as Error | null }; static getDerivedStateFromError(error: Error) { return { hasError: true, error }; } render() { if (this.state.hasError) { return ( <div style={{ padding: '2rem', fontFamily: 'sans-serif' }}> <h1>Something went wrong</h1> <pre style={{ color: 'red' }}>{this.state.error?.message}</pre> <button onClick={() => window.location.reload()}>Reload</button> </div> ); } return this.props.children; }}Expected result: Instead of a blank screen, users see a readable error message when something crashes during rendering.
Revert to the last working version if the cause is unclear
Lovable's version history lets you restore a known-good state without losing any code permanently
Revert to the last working version if the cause is unclear
Lovable's version history lets you restore a known-good state without losing any code permanently
If you cannot identify the specific cause, use Lovable's version history to go back to when the app last worked. Scroll up in the chat panel or click the View History icon to see all previous versions. Click on a version to preview it. When you find one that renders correctly, click Restore to revert to that version. Then compare the working code against your current code to identify exactly which change introduced the blank screen. You can also duplicate the project before reverting if you want to preserve the broken version for analysis.
Expected result: Your app renders correctly again from the restored version. Compare the diff to find the breaking change.
Complete code example
1import { Component, type ReactNode } from 'react';23interface ErrorBoundaryProps {4 children: ReactNode;5}67interface ErrorBoundaryState {8 hasError: boolean;9 error: Error | null;10}1112// Catches unhandled React rendering errors13// and shows a fallback instead of a blank screen14export class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {15 constructor(props: ErrorBoundaryProps) {16 super(props);17 this.state = { hasError: false, error: null };18 }1920 static getDerivedStateFromError(error: Error): ErrorBoundaryState {21 return { hasError: true, error };22 }2324 componentDidCatch(error: Error, info: React.ErrorInfo) {25 // Log the error for debugging26 console.error('ErrorBoundary caught:', error, info.componentStack);27 }2829 render() {30 if (this.state.hasError) {31 return (32 <div className="flex flex-col items-center justify-center min-h-screen p-8">33 <h1 className="text-2xl font-bold mb-4">Something went wrong</h1>34 <p className="text-gray-600 mb-4">35 The app encountered an error. Check the browser console for details.36 </p>37 <pre className="bg-red-50 text-red-700 p-4 rounded mb-4 max-w-lg overflow-auto">38 {this.state.error?.message}39 </pre>40 <button41 onClick={() => window.location.reload()}42 className="px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700"43 >44 Reload Page45 </button>46 </div>47 );48 }49 return this.props.children;50 }51}Best practices to prevent this
- Always check the browser console first — the blank screen hides the real error but the console reveals it
- Keep vite.config.ts simple and close to the default Lovable configuration — avoid adding custom base paths or security header middleware
- Add an ErrorBoundary component wrapping your Router so rendering failures show a message instead of a blank page
- Validate environment variables at startup with console.warn so missing config is immediately visible
- Test your production build after every major change — issues often only appear in the built version, not in preview
- Use the Try-to-fix button when it appears on preview errors — it costs no credits and often resolves the issue automatically
- Keep version history in mind — before making large changes, note the current version so you can revert quickly if the screen goes blank
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
My Lovable (lovable.dev) app shows a blank white screen after building. The project uses Vite + React + TypeScript + Tailwind CSS + Supabase. Here is what I see in the browser console: [paste the exact error messages from the Console tab] Here is my current vite.config.ts: [paste your vite.config.ts file] Here is my Supabase client initialization: [paste your supabase client file] Please: 1. Analyze the console errors and tell me the root cause 2. Show me the corrected vite.config.ts if it is misconfigured 3. Check if my Supabase initialization handles missing env vars safely 4. Add an ErrorBoundary component that catches rendering errors 5. List any other common blank-screen causes I should check
My app is showing a blank white screen after building. Please review @vite.config.ts for any misconfigurations like wrong base paths, broken plugins, or security headers that could prevent the app from loading. Also check @src/main.tsx and the Supabase client initialization for any code that might throw before the app renders. Add an ErrorBoundary component that wraps the main Router so rendering errors show a visible message instead of a blank screen. Reset vite.config.ts to the standard Lovable configuration if needed.
Frequently asked questions
Why does my Lovable app show a blank white screen after building?
A blank screen after build usually means your JavaScript failed to execute. The three most common causes are: a misconfigured vite.config.ts file, missing VITE_ environment variables, or an unhandled JavaScript error that crashes React before rendering. Open the browser console (F12 → Console) to see the exact error.
What does 'Welcome to your blank app' mean in Lovable?
This is the default placeholder text that appears when a new Lovable project has no custom components yet. If you see this after making changes, it likely means your changes caused an error and the app fell back to the default state. Check the console for errors, or revert to a previous version using version history.
How do I fix a blank screen when deploying to Vercel or Netlify?
Most blank screens after external deployment are caused by missing environment variables. Lovable Secrets do not automatically transfer. Set VITE_SUPABASE_URL, VITE_SUPABASE_PUBLISHABLE_KEY, and VITE_SUPABASE_PROJECT_ID on your hosting platform. Also ensure the build output directory is set to dist/ and add an SPA fallback rewrite.
How do I handle runtime errors to prevent blank screens in Lovable?
Wrap your app's main Router component with an ErrorBoundary class component. This catches unhandled rendering errors and displays a fallback message instead of crashing to a blank page. Add console.error logging inside componentDidCatch so you can see what failed.
Can the Lovable Try-to-fix button resolve blank screen issues?
Yes, the Try-to-fix button appears when errors are detected in the preview panel, and it costs no credits. It often resolves simple issues automatically. However, for blank screens caused by vite.config.ts misconfiguration or missing environment variables, you will likely need to fix those manually.
How do I revert to a previous working version in Lovable?
Scroll up in the chat panel or click the View History icon to access version history. Click on any previous version to preview it. When you find a version that works correctly, click Restore to revert to it. This does not delete the broken version — you can always go back to it later.
What if I cannot fix the blank screen myself?
Blank screens after build often involve debugging across vite.config.ts, environment variables, routing, and deployed asset paths simultaneously. RapidDev's engineers have debugged this exact issue across 600+ Lovable projects and can typically identify the root cause and fix it in a single session.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your issue.
Book a free consultation