- Add WASM settings page for configuring external AGPL modules - Implement dynamic loading for PyMuPDF, Ghostscript, and CoherentPDF - Add Cloudflare Worker proxy for serving WASM files with CORS - Update all affected tool pages to check WASM availability - Add showWasmRequiredDialog for missing module configuration Documentation: - Update README, licensing.html, and docs to clarify AGPL components are not bundled and must be configured separately - Add WASM-PROXY.md deployment guide with recommended source URLs - Rename "CPDF" to "CoherentPDF" for consistency
4.5 KiB
Self-Hosting Guide
BentoPDF can be self-hosted on your own infrastructure. This guide covers various deployment options.
Quick Start with Docker / Podman
The fastest way to self-host BentoPDF:
# Docker
docker run -d -p 3000:8080 ghcr.io/alam00000/bentopdf:latest
# Podman
podman run -d -p 3000:8080 ghcr.io/alam00000/bentopdf:latest
Or with Docker Compose / Podman Compose:
# docker-compose.yml
services:
bentopdf:
image: ghcr.io/alam00000/bentopdf:latest
ports:
- '3000:8080'
restart: unless-stopped
# Docker Compose
docker compose up -d
# Podman Compose
podman-compose up -d
Podman Quadlet (Linux Systemd)
Run BentoPDF as a systemd service. Create ~/.config/containers/systemd/bentopdf.container:
[Container]
Image=ghcr.io/alam00000/bentopdf:latest
ContainerName=bentopdf
PublishPort=3000:8080
AutoUpdate=registry
[Service]
Restart=always
[Install]
WantedBy=default.target
systemctl --user daemon-reload
systemctl --user enable --now bentopdf
See Docker deployment guide for full Quadlet documentation.
Building from Source
# Clone and build
git clone https://github.com/alam00000/bentopdf.git
cd bentopdf
npm install
npm run build
# The built files are in the `dist` folder
Configuration Options
Simple Mode
Simple Mode is designed for internal organizational use where you want to hide all branding and marketing content, showing only the essential PDF tools.
What Simple Mode hides:
- Navigation bar
- Hero section with marketing content
- Features, FAQ, testimonials sections
- Footer
- Updates page title to "PDF Tools"
# Build with Simple Mode
SIMPLE_MODE=true npm run build
# Or use the pre-built Docker image
docker run -p 3000:8080 bentopdfteam/bentopdf-simple:latest
See SIMPLE_MODE.md for full details.
Base URL
Deploy to a subdirectory:
BASE_URL=/pdf-tools/ npm run build
Deployment Guides
Choose your platform:
- Vercel
- Netlify
- Cloudflare Pages
- AWS S3 + CloudFront
- Hostinger
- Nginx
- Apache
- Docker
- Kubernetes
- CORS Proxy - Required for digital signatures
Configuring AGPL WASM Components
BentoPDF does not bundle AGPL-licensed processing libraries. Some advanced features require you to configure WASM modules separately.
::: warning AGPL Components Not Included The following WASM modules are not bundled with BentoPDF and must be configured by users who want to use features powered by these libraries:
| Component | License | Features |
|---|---|---|
| PyMuPDF | AGPL-3.0 | EPUB/MOBI/FB2/XPS conversion, image extraction, table extraction |
| Ghostscript | AGPL-3.0 | PDF/A conversion, compression, deskewing, rasterization |
| CoherentPDF | AGPL-3.0 | Table of contents, attachments, PDF merge with bookmarks |
:::
How to Configure WASM Sources
- Navigate to Advanced Settings in the BentoPDF interface
- Enter the URLs for the WASM modules you want to use
- You can use:
- Your own hosted WASM files
- A WASM proxy you deploy (handles CORS)
- Any compatible CDN hosting these packages
Hosting Your Own WASM Proxy
If you need to serve AGPL WASM files with proper CORS headers, you can deploy a simple proxy. See the Cloudflare WASM Proxy guide for an example implementation.
::: tip Why Separate? This separation ensures:
- Clear legal compliance for commercial users
- Users make informed choices when enabling AGPL features
- BentoPDF's core remains under its dual-license (AGPL-3.0 / Commercial) :::
System Requirements
| Requirement | Minimum |
|---|---|
| Storage | ~100 MB (core without AGPL modules) |
| RAM | 512 MB |
| CPU | Any modern processor |
::: tip BentoPDF is a static site—there's no database or backend server required! :::