Skip to content

Deploy to Vercel

Vercel offers the easiest deployment experience for static sites.

One-Click Deploy

Deploy with Vercel

Manual Deployment

Step 1: Fork the Repository

Fork bentopdf/bentopdf to your GitHub account.

Step 2: Import to Vercel

  1. Go to vercel.com/new
  2. Select your forked repository
  3. Configure the project:
SettingValue
Framework PresetVite
Build Commandnpm run build
Output Directorydist
Install Commandnpm install

Step 3: Environment Variables (Optional)

Add these if needed:

VariableDescription
SIMPLE_MODESet to true for minimal UI
VITE_BRAND_NAMECustom brand name (replaces "BentoPDF")
VITE_BRAND_LOGOLogo path relative to public/ (e.g. images/my-logo.svg)
VITE_FOOTER_TEXTCustom footer/copyright text
VITE_DEFAULT_LANGUAGEDefault UI language (e.g. fr, de, es)

Step 4: Deploy

Click "Deploy" and wait for the build to complete.

Custom Domain

  1. Go to your project settings
  2. Navigate to "Domains"
  3. Add your custom domain
  4. Configure DNS as instructed

Limitations

Large Files

Vercel's serverless functions have a 50MB limit. Since BentoPDF is a static site, this shouldn't affect you, but WASM modules are large (~100MB total). Ensure they're served from the /public folder.

Troubleshooting

Build Timeout

If builds timeout, try:

json
// vercel.json
{
  "buildCommand": "npm run build",
  "outputDirectory": "dist"
}

404 on Refresh

Add a vercel.json for SPA routing:

json
{
  "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }]
}

Word/ODT/Excel to PDF Not Working

LibreOffice WASM conversions require SharedArrayBuffer, which needs these response headers on all pages:

  • Cross-Origin-Embedder-Policy: require-corp
  • Cross-Origin-Opener-Policy: same-origin

The pre-compressed .wasm.gz and .data.gz files also need Content-Encoding: gzip so the browser decompresses them.

Add these to your vercel.json:

json
{
  "rewrites": [{ "source": "/(.*)", "destination": "/index.html" }],
  "headers": [
    {
      "source": "/(.*)",
      "headers": [
        { "key": "Cross-Origin-Embedder-Policy", "value": "require-corp" },
        { "key": "Cross-Origin-Opener-Policy", "value": "same-origin" },
        { "key": "Cross-Origin-Resource-Policy", "value": "cross-origin" }
      ]
    },
    {
      "source": "/libreoffice-wasm/soffice.wasm.gz",
      "headers": [
        { "key": "Content-Type", "value": "application/wasm" },
        { "key": "Content-Encoding", "value": "gzip" }
      ]
    },
    {
      "source": "/libreoffice-wasm/soffice.data.gz",
      "headers": [
        { "key": "Content-Type", "value": "application/octet-stream" },
        { "key": "Content-Encoding", "value": "gzip" }
      ]
    }
  ]
}

To verify, open DevTools Console and run console.log(window.crossOriginIsolated) — it should return true.

Dual-licensed under AGPL-3.0 and Commercial License.