Skip to content

Serving Static Web Apps with Launchpad Monitor ​

This recipe demonstrates how to use Launchpad's monitor functionality to serve static web applications using PM2's built-in serve capability, and optionally launch a browser to display them in kiosk mode.

Configuration ​

typescript
import { defineConfig } from '@bluecadet/launchpad-cli';
import path from 'path';
import { homedir } from 'os';

export default defineConfig({
  monitor: {
    apps: [
      // Static web server
      {
        pm2: {
          name: "webapp-server",
          script: "serve",       // Uses PM2's built-in serve functionality
          cwd: "./apps/webapp",  // Path to your web app folder
          env: {
            PM2_SERVE_PATH: "./dist/",         // Path to static files
            PM2_SERVE_PORT: "8080",            // Port to serve on
            PM2_SERVE_SPA: "true",             // Enable single-page app mode
            PM2_SERVE_HOMEPAGE: "/index.html"  // Default page
          }
        }
      },
      
      // Browser to display the web app (optional)
      {
        pm2: {
          name: "webapp-browser",
          // Path to Chromium (adjust for your environment)
          cwd: path.join(homedir(), "AppData/Local/Chromium/Application"), 
          script: "chrome.exe",
          args: "--kiosk --incognito --disable-pinch --overscroll-history-navgation=0 --enable-auto-reload --autoplay-policy=no-user-gesture-required http://localhost:8080"
        },
        windows: {
          foreground: true // Bring browser to foreground
        },
        logging: {
          showStdout: false, // Reduce console noise
          showStderr: false
        }
      }
    ]
  }
});

How It Works ​

The Server App ​

The first app in the configuration uses PM2's built-in serve functionality:

  • script: "serve" tells PM2 to use its static file server
  • PM2_SERVE_PATH specifies which directory to serve
  • PM2_SERVE_PORT sets the port number
  • PM2_SERVE_SPA: "true" enables Single Page App support (routes all requests to index.html)
  • PM2_SERVE_HOMEPAGE sets the default page

The Browser App (optional) ​

The second app launches a browser to display your web content:

  • Uses Chromium in kiosk mode (full-screen, minimal UI)
  • Includes flags to optimize for exhibition use
  • Automatically navigates to the locally served content
  • Is configured to stay in the foreground

Common Customizations ​

Change the Port ​

javascript
env: {
  PM2_SERVE_PORT: "3000", // Change to your preferred port
}

Don't forget to update the URL in the browser args too!

Enable HTTPS ​

javascript
env: {
  PM2_SERVE_PATH: "./dist/",
  PM2_SERVE_PORT: "8443",
  PM2_SERVE_SPA: "true",
  PM2_SERVE_HOMEPAGE: "/index.html",
  PM2_SERVE_SSL_KEY: "./path/to/key.pem",   // Path to SSL key
  PM2_SERVE_SSL_CERT: "./path/to/cert.pem"  // Path to SSL certificate
}

Chrome/Chromium Flags ​

Common flags for kiosk applications:

  • --kiosk: Full-screen kiosk mode
  • --incognito: Private browsing mode
  • --disable-pinch: Disable pinch zoom
  • --overscroll-history-navigation=0: Disable swipe navigation
  • --enable-auto-reload: Auto-refresh on crashes
  • --autoplay-policy=no-user-gesture-required: Allow autoplay of media

Using Other Browsers ​

For Firefox:

javascript
{
  pm2: {
    name: "webapp-firefox",
    cwd: "C:/Program Files/Mozilla Firefox",
    script: "firefox.exe",
    args: "-kiosk http://localhost:8080"
  }
}

Troubleshooting ​

Server won't start ​

  • Ensure the serve module is available to PM2
  • Check that the specified path contains static web files
  • Verify the port isn't already in use

Browser doesn't launch ​

  • Verify the browser path is correct for your system
  • Check that the URL is correct and the server is running
  • Some browser flags may differ between versions

Page doesn't load properly ​

  • If using SPA mode, ensure your app is built as a proper SPA
  • For non-SPA sites, set PM2_SERVE_SPA to "false"

Released under the MIT License.