diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml
index 7d9012d..ee18e97 100644
--- a/.github/workflows/build-and-publish.yml
+++ b/.github/workflows/build-and-publish.yml
@@ -109,7 +109,7 @@ jobs:
build-args: |
SIMPLE_MODE=${{ matrix.mode.simple_mode }}
tags: |
- bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64
+ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64
ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64
platforms: linux/amd64
cache-from: type=gha,scope=amd64-${{ matrix.mode.name }}
@@ -123,7 +123,7 @@ jobs:
build-args: |
SIMPLE_MODE=${{ matrix.mode.simple_mode }}
tags: |
- bentopdf/bentopdf${{ matrix.mode.suffix }}:edge-amd64
+ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge-amd64
ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:edge-amd64
platforms: linux/amd64
cache-from: type=gha,scope=amd64-${{ matrix.mode.name }}
@@ -186,7 +186,7 @@ jobs:
build-args: |
SIMPLE_MODE=${{ matrix.mode.simple_mode }}
tags: |
- bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64
+ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64
ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64
platforms: linux/arm64
cache-from: type=gha,scope=arm64-${{ matrix.mode.name }}
@@ -200,7 +200,7 @@ jobs:
build-args: |
SIMPLE_MODE=${{ matrix.mode.simple_mode }}
tags: |
- bentopdf/bentopdf${{ matrix.mode.suffix }}:edge-arm64
+ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge-arm64
ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:edge-arm64
platforms: linux/arm64
cache-from: type=gha,scope=arm64-${{ matrix.mode.name }}
@@ -253,17 +253,17 @@ jobs:
if: steps.version.outputs.is_release == 'true'
run: |
# DockerHub manifests
- docker buildx imagetools create -t bentopdf/bentopdf${{ matrix.mode.suffix }}:latest \
- bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \
- bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64
+ docker buildx imagetools create -t bentopdfteam/bentopdf${{ matrix.mode.suffix }}:latest \
+ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \
+ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64
- docker buildx imagetools create -t bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }} \
- bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \
- bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64
+ docker buildx imagetools create -t bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }} \
+ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \
+ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64
- docker buildx imagetools create -t bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version_without_v }} \
- bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \
- bentopdf/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64
+ docker buildx imagetools create -t bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version_without_v }} \
+ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-amd64 \
+ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:${{ steps.version.outputs.version }}-arm64
# GHCR manifests
docker buildx imagetools create -t ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:latest \
@@ -282,13 +282,13 @@ jobs:
if: steps.version.outputs.is_release == 'false'
run: |
# DockerHub manifests
- docker buildx imagetools create -t bentopdf/bentopdf${{ matrix.mode.suffix }}:edge \
- bentopdf/bentopdf${{ matrix.mode.suffix }}:edge-amd64 \
- bentopdf/bentopdf${{ matrix.mode.suffix }}:edge-arm64
+ docker buildx imagetools create -t bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge \
+ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge-amd64 \
+ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge-arm64
- docker buildx imagetools create -t bentopdf/bentopdf${{ matrix.mode.suffix }}:sha-${{ steps.version.outputs.short_sha }} \
- bentopdf/bentopdf${{ matrix.mode.suffix }}:edge-amd64 \
- bentopdf/bentopdf${{ matrix.mode.suffix }}:edge-arm64
+ docker buildx imagetools create -t bentopdfteam/bentopdf${{ matrix.mode.suffix }}:sha-${{ steps.version.outputs.short_sha }} \
+ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge-amd64 \
+ bentopdfteam/bentopdf${{ matrix.mode.suffix }}:edge-arm64
# GHCR manifests
docker buildx imagetools create -t ghcr.io/${{ github.repository_owner }}/bentopdf${{ matrix.mode.suffix }}:edge \
diff --git a/README.md b/README.md
index ec8dd7d..192e915 100644
--- a/README.md
+++ b/README.md
@@ -3,13 +3,47 @@
**BentoPDF** is a powerful, privacy-first, client-side PDF toolkit that is self hostable and allows you to manipulate, edit, merge, and process PDF files directly in your browser. No server-side processing is required, ensuring your files remain secure and private.
- [](https://ko-fi.com/alio01) 
+ [](https://ko-fi.com/alio01) 
[](https://github.com/sponsors/alam00000)

---
+## Table of Contents
+
+- [Join Us on Discord](#-join-us-on-discord)
+- [Documentation](#-documentation)
+- [Licensing](#-licensing)
+- [Stargazers over time](#-stargazers-over-time)
+- [Thank You to Our Sponsors](#-thank-you-to-our-sponsors)
+- [Why BentoPDF?](#-why-bentopdf)
+- [Features / Tools Supported](#οΈ-features--tools-supported)
+ - [Organize & Manage PDFs](#organize--manage-pdfs)
+ - [Edit & Modify PDFs](#edit--modify-pdfs)
+ - [Convert to PDF](#convert-to-pdf)
+ - [Convert from PDF](#convert-from-pdf)
+ - [Secure & Optimize PDFs](#secure--optimize-pdfs)
+- [Translations](#-translations)
+- [Getting Started](#-getting-started)
+ - [Prerequisites](#prerequisites)
+ - [Quick Start](#-quick-start)
+ - [Static Hosting](#static-hosting-using-netlify-vercel-and-github-pages)
+ - [Self-Hosting Locally](#-self-hosting-locally)
+ - [Docker Compose / Podman Compose](#-run-with-docker-compose--podman-compose-recommended)
+ - [Podman Quadlet](#-podman-quadlet-systemd-integration)
+ - [Simple Mode](#-simple-mode-for-internal-use)
+ - [Security Features](#-security-features)
+ - [Digital Signature CORS Proxy](#digital-signature-cors-proxy-required)
+ - [Version Management](#-version-management)
+ - [Development Setup](#-development-setup)
+- [Tech Stack & Background](#οΈ-tech-stack--background)
+- [Roadmap](#οΈ-roadmap)
+- [Contributing](#-contributing)
+- [Special Thanks](#special-thanks)
+
+---
+
## π’ Join Us on Discord
[](https://discord.gg/Bgq3Ay3f2w)
@@ -247,22 +281,9 @@ You can run BentoPDF locally for development or personal use.
- [npm](https://www.npmjs.com/) (or yarn/pnpm)
- [Docker](https://www.docker.com/) & [Docker Compose](https://docs.docker.com/compose/install/) (for containerized setup)
-### π Quick Start with Docker
+### π Quick Start
-[](https://zeabur.com/templates/K4AU2B)
-
-You can run BentoPDF directly from Docker Hub or GitHub Container Registry without cloning the repository:
-
-You can also watch the video on how to set it up π
-[BentoPDF Docker Setup](https://drive.google.com/file/d/1C4eJ2nqeaH__1Tlad-xuBHaF2Ha4fSBf/view?usp=drive_link)
-
-**Using Docker Hub:**
-
-```bash
-docker run -p 3000:8080 bentopdf/bentopdf:latest
-```
-
-**Using GitHub Container Registry:**
+Run BentoPDF instantly from GitHub Container Registry (Recommended):
```bash
docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest
@@ -270,11 +291,34 @@ docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest
Open your browser at: http://localhost:3000
-This is the fastest way to try BentoPDF without setting up a development environment.
+
+Alternative: Using Docker Hub or Podman
+
+**Docker Hub:**
+
+```bash
+docker run -p 3000:8080 bentopdfteam/bentopdf:latest
+```
+
+**Podman (GHCR):**
+
+```bash
+podman run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest
+```
+
+**Podman (Docker Hub):**
+
+```bash
+podman run -p 3000:8080 docker.io/bentopdfteam/bentopdf:latest
+```
+
+> **Note:** All `docker` commands in this documentation work with Podman by replacing `docker` with `podman`.
+
+
### Static Hosting using Netlify, Vercel, and GitHub Pages
-It is very straightforward to host your own instance of BentoPDF using a static web page hosting service. Plus, services such as Netlify, Vercel, and GitHub Pages all offer a free tier for getting started. See [Static Hosting](https://github.com/alam00000/bentopdf/blob/main/STATIC-HOSTING.md)) for details.
+It is very straightforward to host your own instance of BentoPDF using a static web page hosting service. Plus, services such as Netlify, Vercel, and GitHub Pages all offer a free tier for getting started. See [Static Hosting](https://github.com/alam00000/bentopdf/blob/main/STATIC-HOSTING.md) for details.
### π Self-Hosting Locally
@@ -431,7 +475,7 @@ docker run -p 3000:8080 bentopdf-simple
> - Always include trailing slashes in `BASE_URL` (e.g., `/bentopdf/` not `/bentopdf`)
> - The default value is `/` for root deployment
-### π Run with Docker Compose (Recommended)
+### π Run with Docker Compose / Podman Compose (Recommended)
For a more robust setup with auto-restart capabilities:
@@ -440,7 +484,8 @@ For a more robust setup with auto-restart capabilities:
```yaml
services:
bentopdf:
- image: bentopdf/bentopdf:latest
+ image: ghcr.io/alam00000/bentopdf:latest # Recommended
+ # image: bentopdfteam/bentopdf:latest # Alternative: Docker Hub
container_name: bentopdf
ports:
- '3000:8080'
@@ -450,11 +495,48 @@ services:
2. **Start the application**:
```bash
+# Docker Compose
docker-compose up -d
+
+# Podman Compose
+podman-compose up -d
```
The application will be available at `http://localhost:3000`.
+### π§ Podman Quadlet (Systemd Integration)
+
+For Linux production deployments, you can run BentoPDF as a systemd service using [Podman Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html).
+
+Create `~/.config/containers/systemd/bentopdf.container`:
+
+```ini
+[Unit]
+Description=BentoPDF - Privacy-first PDF toolkit
+After=network-online.target
+
+[Container]
+Image=ghcr.io/alam00000/bentopdf:latest
+ContainerName=bentopdf
+PublishPort=3000:8080
+AutoUpdate=registry
+
+[Service]
+Restart=always
+
+[Install]
+WantedBy=default.target
+```
+
+Then enable and start:
+
+```bash
+systemctl --user daemon-reload
+systemctl --user enable --now bentopdf
+```
+
+For detailed Quadlet configuration, see [Self-Hosting Docker Guide](https://bentopdf.com/docs/self-hosting/docker).
+
### π’ Simple Mode for Internal Use
For organizations that want a clean, distraction-free interface focused solely on PDF tools, BentoPDF supports a **Simple Mode** that hides all branding and marketing content.
@@ -574,20 +656,20 @@ VITE_CORS_PROXY_SECRET=your-secret npm run build
### π¦ Version Management
-BentoPDF supports semantic versioning with multiple Docker tags available on both Docker Hub and GitHub Container Registry:
+BentoPDF supports semantic versioning with multiple container tags available:
-**Docker Hub:**
-
-- **Latest**: `bentopdf/bentopdf:latest`
-- **Specific Version**: `bentopdf/bentopdf:1.0.0`
-- **Version with Prefix**: `bentopdf/bentopdf:v1.0.0`
-
-**GitHub Container Registry:**
+**GitHub Container Registry (Recommended):**
- **Latest**: `ghcr.io/alam00000/bentopdf:latest`
- **Specific Version**: `ghcr.io/alam00000/bentopdf:1.0.0`
- **Version with Prefix**: `ghcr.io/alam00000/bentopdf:v1.0.0`
+**Docker Hub:**
+
+- **Latest**: `bentopdfteam/bentopdf:latest`
+- **Specific Version**: `bentopdfteam/bentopdf:1.0.0`
+- **Version with Prefix**: `bentopdfteam/bentopdf:v1.0.0`
+
#### Quick Release
```bash
diff --git a/RELEASE.md b/RELEASE.md
index 88d0c78..106165b 100644
--- a/RELEASE.md
+++ b/RELEASE.md
@@ -215,16 +215,16 @@ git reset --hard HEAD~1
1. **GitHub Actions Triggered**: Workflow starts building Docker image
2. **Docker Build**: Multi-architecture image created
3. **Docker Push**: Images pushed to Docker Hub with tags:
- - `bentopdf/bentopdf:latest`
- - `bentopdf/bentopdf:1.0.1`
- - `bentopdf/bentopdf:v1.0.1`
+ - `bentopdfteam/bentopdf:latest`
+ - `bentopdfteam/bentopdf:1.0.1`
+ - `bentopdfteam/bentopdf:v1.0.1`
### **End Result:**
Users can immediately pull your new version:
```bash
-docker pull bentopdf/bentopdf:1.0.1
+docker pull bentopdfteam/bentopdf:1.0.1
```
---
diff --git a/SIMPLE_MODE.md b/SIMPLE_MODE.md
index 996caef..4dd45d6 100644
--- a/SIMPLE_MODE.md
+++ b/SIMPLE_MODE.md
@@ -23,27 +23,35 @@ When enabled, Simple Mode will:
Use the pre-built Simple Mode image directly:
+**Using GitHub Container Registry (Recommended):**
+
+```bash
+# Docker
+docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest
+
+# Podman
+podman run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest
+```
+
**Using Docker Hub:**
```bash
-docker run -p 3000:8080 bentopdf/bentopdf-simple:latest
+# Docker
+docker run -p 3000:8080 bentopdfteam/bentopdf-simple:latest
+
+# Podman
+podman run -p 3000:8080 docker.io/bentopdfteam/bentopdf-simple:latest
```
-**Using GitHub Container Registry:**
-
-```bash
-docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest
-```
-
-Or with Docker Compose:
+Or with Docker Compose / Podman Compose:
```yaml
services:
bentopdf:
- # Using Docker Hub
- image: bentopdf/bentopdf-simple:latest
- # Or using GitHub Container Registry
- # image: ghcr.io/alam00000/bentopdf-simple:latest
+ # Using GitHub Container Registry (Recommended)
+ image: ghcr.io/alam00000/bentopdf-simple:latest
+ # Or using Docker Hub
+ # image: bentopdfteam/bentopdf-simple:latest
container_name: bentopdf
restart: unless-stopped
ports:
@@ -105,9 +113,13 @@ This automatically builds and serves Simple Mode on `http://localhost:3000`.
### Method 2: Using Pre-built Image (Easiest for Production)
```bash
-# Pull and run the Simple Mode image
-docker pull bentopdf/bentopdf-simple:latest
-docker run -p 3000:8080 bentopdf/bentopdf-simple:latest
+# Docker - Pull and run the Simple Mode image
+docker pull ghcr.io/alam00000/bentopdf-simple:latest
+docker run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest
+
+# Podman
+podman pull ghcr.io/alam00000/bentopdf-simple:latest
+podman run -p 3000:8080 ghcr.io/alam00000/bentopdf-simple:latest
```
Open `http://localhost:3000` in your browser.
@@ -127,11 +139,13 @@ Open `http://localhost:3000` in your browser.
### Method 4: Compare Both Modes
```bash
-# Test Normal Mode
-docker run -p 3000:8080 bentopdf/bentopdf:latest
+# Test Normal Mode (Docker)
+docker run -p 3000:8080 ghcr.io/alam00000/bentopdf:latest
-# Test Simple Mode
-docker run -p 3001:8080 bentopdf/bentopdf-simple:latest
+# Test Simple Mode (Docker)
+docker run -p 3001:8080 ghcr.io/alam00000/bentopdf-simple:latest
+
+# Podman users: replace 'docker' with 'podman'
```
- Normal Mode: `http://localhost:3000`
@@ -149,52 +163,82 @@ When Simple Mode is working correctly, you should see:
- β No hero section with "The PDF Toolkit built for privacy"
- β No features, FAQ, testimonials, or footer sections
-## π¦ Available Docker Images
+## π¦ Available Container Images
### Normal Mode (Full Branding)
-**Docker Hub:**
-
-- `bentopdf/bentopdf:latest`
-- `bentopdf/bentopdf:v1.0.0` (versioned)
-
-**GitHub Container Registry:**
+**GitHub Container Registry (Recommended):**
- `ghcr.io/alam00000/bentopdf:latest`
- `ghcr.io/alam00000/bentopdf:v1.0.0` (versioned)
-### Simple Mode (Clean Interface)
-
**Docker Hub:**
-- `bentopdf/bentopdf-simple:latest`
-- `bentopdf/bentopdf-simple:v1.0.0` (versioned)
+- `bentopdfteam/bentopdf:latest`
+- `bentopdfteam/bentopdf:v1.0.0` (versioned)
-**GitHub Container Registry:**
+### Simple Mode (Clean Interface)
+
+**GitHub Container Registry (Recommended):**
- `ghcr.io/alam00000/bentopdf-simple:latest`
- `ghcr.io/alam00000/bentopdf-simple:v1.0.0` (versioned)
+**Docker Hub:**
+
+- `bentopdfteam/bentopdf-simple:latest`
+- `bentopdfteam/bentopdf-simple:v1.0.0` (versioned)
+
## π Production Deployment Examples
-### Internal Company Tool
+### Docker Compose / Podman Compose
```yaml
services:
bentopdf:
- image: bentopdf/bentopdf-simple:latest
+ image: ghcr.io/alam00000/bentopdf-simple:latest # Recommended
+ # image: bentopdfteam/bentopdf-simple:latest # Alternative: Docker Hub
container_name: bentopdf
restart: unless-stopped
ports:
- - '80:80'
+ - '80:8080'
environment:
- PUID=1000
- PGID=1000
```
+### Podman Quadlet (Linux Systemd)
+
+Create `~/.config/containers/systemd/bentopdf-simple.container`:
+
+```ini
+[Unit]
+Description=BentoPDF Simple Mode
+After=network-online.target
+
+[Container]
+Image=ghcr.io/alam00000/bentopdf-simple:latest
+ContainerName=bentopdf-simple
+PublishPort=80:8080
+AutoUpdate=registry
+
+[Service]
+Restart=always
+
+[Install]
+WantedBy=default.target
+```
+
+Enable and start:
+
+```bash
+systemctl --user daemon-reload
+systemctl --user enable --now bentopdf-simple
+```
+
## β οΈ Important Notes
-- **Pre-built images**: Use `bentopdf/bentopdf-simple:latest` for Simple Mode
+- **Pre-built images**: Use `ghcr.io/alam00000/bentopdf-simple:latest` for Simple Mode (recommended)
- **Environment variables**: `SIMPLE_MODE=true` only works during build, not runtime
- **Build-time optimization**: Simple Mode uses dead code elimination for smaller bundles
- **Same functionality**: All PDF tools work identically in both modes
diff --git a/docker-compose.yml b/docker-compose.yml
index 4999418..95dbe02 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,8 +1,12 @@
services:
bentopdf:
- # simple mode - bentopdf/bentopdf-simple:latest
- # default mode - bentopdf/bentopdf:latest
- image: bentopdf/bentopdf-simple:latest
+ # GitHub Container Registry (Recommended)
+ # simple mode - ghcr.io/alam00000/bentopdf-simple:latest
+ # default mode - ghcr.io/alam00000/bentopdf:latest
+ # Docker Hub (Alternative)
+ # simple mode - bentopdfteam/bentopdf-simple:latest
+ # default mode - bentopdfteam/bentopdf:latest
+ image: ghcr.io/alam00000/bentopdf-simple:latest
container_name: bentopdf
restart: unless-stopped
ports:
diff --git a/docs/self-hosting/docker.md b/docs/self-hosting/docker.md
index 0130afd..8630da2 100644
--- a/docs/self-hosting/docker.md
+++ b/docs/self-hosting/docker.md
@@ -1,27 +1,38 @@
-# Deploy with Docker
+# Deploy with Docker / Podman
The easiest way to self-host BentoPDF in a production environment.
> [!IMPORTANT]
> **Required Headers for Office File Conversion**
->
+>
> LibreOffice-based tools (Word, Excel, PowerPoint conversion) require these HTTP headers for `SharedArrayBuffer` support:
+>
> - `Cross-Origin-Opener-Policy: same-origin`
> - `Cross-Origin-Embedder-Policy: require-corp`
->
-> The official Docker images include these headers. If using a reverse proxy (Traefik, Caddy, etc.), ensure these headers are preserved or added.
+>
+> The official container images include these headers. If using a reverse proxy (Traefik, Caddy, etc.), ensure these headers are preserved or added.
+
+> [!TIP]
+> **Podman Users:** All `docker` commands work with Podman by replacing `docker` with `podman` and `docker-compose` with `podman-compose`.
## Quick Start
```bash
+# Docker
docker run -d \
--name bentopdf \
-p 3000:8080 \
--restart unless-stopped \
ghcr.io/alam00000/bentopdf:latest
+
+# Podman
+podman run -d \
+ --name bentopdf \
+ -p 3000:8080 \
+ ghcr.io/alam00000/bentopdf:latest
```
-## Docker Compose
+## Docker Compose / Podman Compose
Create `docker-compose.yml`:
@@ -31,10 +42,10 @@ services:
image: ghcr.io/alam00000/bentopdf:latest
container_name: bentopdf
ports:
- - "3000:8080"
+ - '3000:8080'
restart: unless-stopped
healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:8080"]
+ test: ['CMD', 'curl', '-f', 'http://localhost:8080']
interval: 30s
timeout: 10s
retries: 3
@@ -43,7 +54,11 @@ services:
Run:
```bash
+# Docker Compose
docker compose up -d
+
+# Podman Compose
+podman-compose up -d
```
## Build Your Own Image
@@ -73,10 +88,10 @@ docker run -d -p 3000:8080 bentopdf:custom
## Environment Variables
-| Variable | Description | Default |
-|----------|-------------|---------|
+| Variable | Description | Default |
+| ------------- | ------------------------------- | ------- |
| `SIMPLE_MODE` | Build without LibreOffice tools | `false` |
-| `BASE_URL` | Deploy to subdirectory | `/` |
+| `BASE_URL` | Deploy to subdirectory | `/` |
Example:
@@ -94,15 +109,15 @@ services:
traefik:
image: traefik:v2.10
command:
- - "--providers.docker=true"
- - "--entrypoints.web.address=:80"
- - "--entrypoints.websecure.address=:443"
- - "--certificatesresolvers.letsencrypt.acme.email=you@example.com"
- - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
+ - '--providers.docker=true'
+ - '--entrypoints.web.address=:80'
+ - '--entrypoints.websecure.address=:443'
+ - '--certificatesresolvers.letsencrypt.acme.email=you@example.com'
+ - '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json'
+ - '--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web'
ports:
- - "80:80"
- - "443:443"
+ - '80:80'
+ - '443:443'
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
@@ -110,15 +125,15 @@ services:
bentopdf:
image: ghcr.io/alam00000/bentopdf:latest
labels:
- - "traefik.enable=true"
- - "traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)"
- - "traefik.http.routers.bentopdf.entrypoints=websecure"
- - "traefik.http.routers.bentopdf.tls.certresolver=letsencrypt"
- - "traefik.http.services.bentopdf.loadbalancer.server.port=8080"
+ - 'traefik.enable=true'
+ - 'traefik.http.routers.bentopdf.rule=Host(`pdf.example.com`)'
+ - 'traefik.http.routers.bentopdf.entrypoints=websecure'
+ - 'traefik.http.routers.bentopdf.tls.certresolver=letsencrypt'
+ - 'traefik.http.services.bentopdf.loadbalancer.server.port=8080'
# Required headers for SharedArrayBuffer (LibreOffice WASM)
- - "traefik.http.routers.bentopdf.middlewares=bentopdf-headers"
- - "traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin"
- - "traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp"
+ - 'traefik.http.routers.bentopdf.middlewares=bentopdf-headers'
+ - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Opener-Policy=same-origin'
+ - 'traefik.http.middlewares.bentopdf-headers.headers.customresponseheaders.Cross-Origin-Embedder-Policy=require-corp'
restart: unless-stopped
```
@@ -129,12 +144,12 @@ services:
caddy:
image: caddy:2
ports:
- - "80:80"
- - "443:443"
+ - '80:80'
+ - '443:443'
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
-
+
bentopdf:
image: ghcr.io/alam00000/bentopdf:latest
restart: unless-stopped
@@ -169,6 +184,141 @@ services:
memory: 128M
```
+## Podman Quadlet (Systemd Integration)
+
+[Quadlet](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) allows you to run Podman containers as systemd services. This is ideal for production deployments on Linux systems.
+
+### Basic Quadlet Setup
+
+Create a container unit file at `~/.config/containers/systemd/bentopdf.container` (user) or `/etc/containers/systemd/bentopdf.container` (system):
+
+```ini
+[Unit]
+Description=BentoPDF - Privacy-first PDF toolkit
+After=network-online.target
+Wants=network-online.target
+
+[Container]
+Image=ghcr.io/alam00000/bentopdf:latest
+ContainerName=bentopdf
+PublishPort=3000:8080
+AutoUpdate=registry
+
+[Service]
+Restart=always
+TimeoutStartSec=300
+
+[Install]
+WantedBy=default.target
+```
+
+### Enable and Start
+
+```bash
+# Reload systemd to detect new unit
+systemctl --user daemon-reload
+
+# Start the service
+systemctl --user start bentopdf
+
+# Enable on boot
+systemctl --user enable bentopdf
+
+# Check status
+systemctl --user status bentopdf
+
+# View logs
+journalctl --user -u bentopdf -f
+```
+
+> [!TIP]
+> For system-wide deployment, use `systemctl` without `--user` flag and place the file in `/etc/containers/systemd/`.
+
+### Simple Mode Quadlet
+
+For Simple Mode deployment, create `bentopdf-simple.container`:
+
+```ini
+[Unit]
+Description=BentoPDF Simple Mode - Clean PDF toolkit
+After=network-online.target
+Wants=network-online.target
+
+[Container]
+Image=ghcr.io/alam00000/bentopdf-simple:latest
+ContainerName=bentopdf-simple
+PublishPort=3000:8080
+AutoUpdate=registry
+
+[Service]
+Restart=always
+TimeoutStartSec=300
+
+[Install]
+WantedBy=default.target
+```
+
+### Quadlet with Health Check
+
+```ini
+[Unit]
+Description=BentoPDF with health monitoring
+After=network-online.target
+Wants=network-online.target
+
+[Container]
+Image=ghcr.io/alam00000/bentopdf:latest
+ContainerName=bentopdf
+PublishPort=3000:8080
+AutoUpdate=registry
+HealthCmd=curl -f http://localhost:8080 || exit 1
+HealthInterval=30s
+HealthTimeout=10s
+HealthRetries=3
+
+[Service]
+Restart=always
+TimeoutStartSec=300
+
+[Install]
+WantedBy=default.target
+```
+
+### Auto-Update with Quadlet
+
+Podman can automatically update containers when new images are available:
+
+```bash
+# Enable auto-update timer
+systemctl --user enable --now podman-auto-update.timer
+
+# Check for updates manually
+podman auto-update
+
+# Dry run (check without updating)
+podman auto-update --dry-run
+```
+
+### Quadlet Network Configuration
+
+For custom network configuration, create a network file `bentopdf.network`:
+
+```ini
+[Network]
+Subnet=10.89.0.0/24
+Gateway=10.89.0.1
+```
+
+Then reference it in your container file:
+
+```ini
+[Container]
+Image=ghcr.io/alam00000/bentopdf:latest
+ContainerName=bentopdf
+PublishPort=3000:8080
+Network=bentopdf.network
+```
+
## Updating
```bash
diff --git a/docs/self-hosting/index.md b/docs/self-hosting/index.md
index a492ec2..045a2a6 100644
--- a/docs/self-hosting/index.md
+++ b/docs/self-hosting/index.md
@@ -2,15 +2,19 @@
BentoPDF can be self-hosted on your own infrastructure. This guide covers various deployment options.
-## Quick Start with Docker
+## Quick Start with Docker / Podman
The fastest way to self-host BentoPDF:
```bash
+# 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:
+Or with Docker Compose / Podman Compose:
```yaml
# docker-compose.yml
@@ -18,14 +22,43 @@ services:
bentopdf:
image: ghcr.io/alam00000/bentopdf:latest
ports:
- - "3000:8080"
+ - '3000:8080'
restart: unless-stopped
```
```bash
+# 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`:
+
+```ini
+[Container]
+Image=ghcr.io/alam00000/bentopdf:latest
+ContainerName=bentopdf
+PublishPort=3000:8080
+AutoUpdate=registry
+
+[Service]
+Restart=always
+
+[Install]
+WantedBy=default.target
+```
+
+```bash
+systemctl --user daemon-reload
+systemctl --user enable --now bentopdf
+```
+
+See [Docker deployment guide](/self-hosting/docker) for full Quadlet documentation.
+
## Building from Source
```bash
@@ -45,6 +78,7 @@ npm run build
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
@@ -56,7 +90,7 @@ Simple Mode is designed for internal organizational use where you want to hide a
SIMPLE_MODE=true npm run build
# Or use the pre-built Docker image
-docker run -p 3000:8080 bentopdf/bentopdf-simple:latest
+docker run -p 3000:8080 bentopdfteam/bentopdf-simple:latest
```
See [SIMPLE_MODE.md](https://github.com/alam00000/bentopdf/blob/main/SIMPLE_MODE.md) for full details.
@@ -85,11 +119,11 @@ Choose your platform:
## System Requirements
-| Requirement | Minimum |
-|-------------|---------|
-| Storage | ~500 MB (with all WASM modules) |
-| RAM | 512 MB |
-| CPU | Any modern processor |
+| Requirement | Minimum |
+| ----------- | ------------------------------- |
+| Storage | ~500 MB (with all WASM modules) |
+| RAM | 512 MB |
+| CPU | Any modern processor |
::: tip
BentoPDF is a static siteβthere's no database or backend server required!
diff --git a/scripts/release.js b/scripts/release.js
index 696024a..de257ae 100644
--- a/scripts/release.js
+++ b/scripts/release.js
@@ -80,7 +80,9 @@ function main() {
execSync('npm run update-version', { stdio: 'inherit' });
// 3. Add and commit changes
- execSync('git add package.json *.html src/pages/*.html', { stdio: 'inherit' });
+ execSync('git add package.json *.html src/pages/*.html', {
+ stdio: 'inherit',
+ });
execSync(`git commit -m "Release v${newVersion}"`, { stdio: 'inherit' });
console.log(`πΎ Committed version change`);
@@ -98,7 +100,7 @@ function main() {
execSync(`git push origin ${tagName}`, { stdio: 'inherit' });
console.log(`π Release v${newVersion} complete!`);
- console.log(`π¦ Docker image: bentopdf/bentopdf:${newVersion}`);
+ console.log(`π¦ Docker image: bentopdfteam/bentopdf:${newVersion}`);
console.log(`π¦ Distribution: dist-${newVersion}.zip`);
console.log(
`π·οΈ GitHub release: https://github.com/alam00000/bentopdf/releases/tag/${tagName}`
diff --git a/unraid_bentopdf.xml b/unraid_bentopdf.xml
index 9d48d1f..bb716b2 100644
--- a/unraid_bentopdf.xml
+++ b/unraid_bentopdf.xml
@@ -1,8 +1,8 @@
bentopdf
- bentopdf/bentopdf
- https://hub.docker.com/r/bentopdf/bentopdf/
+ bentopdfteam/bentopdf
+ https://hub.docker.com/r/bentopdfteam/bentopdf/
bridge
sh
@@ -12,7 +12,7 @@
Uploaded on behalf of creator: alam00000
BentoPDF is a privacy first PDF Toolkit
-https://hub.docker.com/r/bentopdf/bentopdf/
+https://hub.docker.com/r/bentopdfteam/bentopdf/
Tools:
http://[IP]:[PORT:8080]/