Introduces a new directory containing a small standalone CLI tool () that converts PDFs to Markdown using PyMuPDF and pymupdf4llm. When installed, it replaces the slower pdftohtml-based converter with a significantly faster path. The tool is invoked as an OS subprocess, following the same pattern already used for LibreOffice and Tesseract. A new service handles discovery (PATH probe, cached 30 s), temp file I/O, and process execution via the existing infrastructure. Auto-detected at startup via — no configuration flag required. Falls back transparently to the bundled pdftohtml converter if not found. is baked into the Docker base image via the existing Python venv build stage and symlinked onto PATH, so all Docker users get the faster path automatically with no manual steps. AGPL notice: is licensed under AGPL-3.0-or-later because it depends on PyMuPDF (AGPL-3.0 / Artifex commercial). It is a SEPARATE program from the rest of Stirling PDF and shares no source code with the MIT-licensed core or the proprietary engine. The subprocess boundary ensures the AGPL copyleft attaches to this tool alone and does not extend to Stirling PDF. The LICENSE file and pymupdf-worker/LICENSE document this separation explicitly. Do not replace the subprocess invocation with an in-process import of PyMuPDF.
Docker Setup for Stirling-PDF
This directory contains the organized Docker configurations for the split frontend/backend architecture.
Using Taskfile (Recommended)
All Docker commands can be run from the project root using Task:
task docker:build # Build standard image
task docker:build:fat # Build fat image (all features)
task docker:build:ultra-lite # Build ultra-lite image
task docker:build:frontend # Build frontend-only image
task docker:build:engine # Build engine image
task docker:up # Start standard compose stack
task docker:up:fat # Start fat compose stack
task docker:up:ultra-lite # Start ultra-lite compose stack
task docker:down # Stop all running stacks
task docker:logs # Tail compose logs
Directory Structure
docker/
├── backend/ # Backend Docker files
│ ├── Dockerfile # Standard backend
│ ├── Dockerfile.ultra-lite # Minimal backend
│ └── Dockerfile.fat # Full-featured backend
├── frontend/ # Frontend Docker files
│ ├── Dockerfile # React/Vite frontend with nginx
│ ├── nginx.conf # Nginx configuration
│ └── entrypoint.sh # Dynamic backend URL setup
└── compose/ # Docker Compose files
├── docker-compose.yml # Standard setup
├── docker-compose.ultra-lite.yml # Ultra-lite setup
└── docker-compose.fat.yml # Full-featured setup
Usage
Separate Containers (Recommended)
From the project root directory:
# Standard version
docker-compose -f docker/compose/docker-compose.yml up --build
# Ultra-lite version
docker-compose -f docker/compose/docker-compose.ultra-lite.yml up --build
# Fat version
docker-compose -f docker/compose/docker-compose.fat.yml up --build
Access Points
- Frontend: http://localhost:3000
- Backend API (debugging): http://localhost:8080 (TODO: Remove in production)
- Backend API (via frontend): http://localhost:3000/api/*
Configuration
- Backend URL: Set
VITE_API_BASE_URLenvironment variable for custom backend locations - Custom Ports: Modify port mappings in docker-compose files
- Memory Limits: Adjust memory limits per variant (2G ultra-lite, 4G standard, 6G fat)
Google Drive Integration
- VITE_GOOGLE_DRIVE_CLIENT_ID: OAuth 2.0 Client ID
- VITE_GOOGLE_DRIVE_API_KEY: Create New API
- VITE_GOOGLE_DRIVE_APP_ID: This is your project number in the GoogleCloud Settings
Development vs Production
- Development: Keep backend port 8080 exposed for debugging
- Production: Remove backend port exposure, use only frontend proxy