loginAttemptCount:5# lock user account after 5 tries; when using e.g. Fail2Ban you can deactivate the function with -1
loginResetTimeMinutes:120# lock account for 2 hours after x attempts
loginMethod:all# Accepts values like 'all' and 'normal'(only Login with Username/Password), 'oauth2'(only Login with OAuth2) or 'saml2'(only Login with SAML2)
scopes:openid, profile, email# scopes for Keycloak OAuth2
useAsUsername:preferred_username# field to use as the username for Keycloak OAuth2. Available options are: [email | name | given_name | family_name | preferred_name]
autoCreateUser:true# set to 'true' to allow auto-creation of non-existing users
blockRegistration:false# set to 'true' to deny login with SSO without prior registration by an admin
registrationId:stirling# The name of your Service Provider (SP) app name. Should match the name in the path for your SSO & SLO URLs
idpMetadataUri:https://dev-XXXXXXXX.okta.com/app/externalKey/sso/saml/metadata# The uri for your Provider's metadata
idpSingleLoginUrl:https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/sso/saml# The URL for initiating SSO. Provided by your Provider
idpSingleLogoutUrl:https://dev-XXXXXXXX.okta.com/app/dev-XXXXXXXX_stirlingpdf_1/externalKey/slo/saml# The URL for initiating SLO. Provided by your Provider
# IMPORTANT: For SAML setup, download your SP metadata from the BACKEND URL: http://localhost:8080/saml2/service-provider-metadata/{registrationId}
# Do NOT use the frontend dev server URL (localhost:5173) as it will generate incorrect ACS URLs. Always use the backend URL (localhost:8080) for SAML configuration.
defaultTsaUrl:http://timestamp.digicert.com# Default TSA server for RFC 3161 document timestamps
customTsaUrls:[]# Admin-configured additional TSA URLs (e.g. ['https://internal-tsa.corp.com/timestamp']). Users can only select from built-in presets and these URLs.
xFrameOptions:DENY# X-Frame-Options header value. Options: 'DENY' (default, prevents all framing), 'SAMEORIGIN' (allows framing from same domain), 'DISABLED' (no X-Frame-Options header sent). Note: automatically set to DISABLED when login is disabled
enabled:true# Enable audit logging for security and compliance tracking
level:2# Audit logging level: 0=OFF, 1=BASIC (compress/split/merge/etc and settings), 2=STANDARD (BASIC + user actions, excludes polling), 3=VERBOSE (everything including polling).
retentionDays:90# Number of days to retain audit logs (0 or negative = infinite retention)
captureFileHash:false# Capture SHA-256 hash of uploaded/processed files. Warning: adds 50-200ms per file depending on size. Only enabled independently of audit level.
capturePdfAuthor:false# Capture author metadata from PDF documents. Warning: requires PDF parsing which increases processing time. Only enabled independently of audit level.
captureOperationResults:false# Capture operation return values and responses in audit log. Warning: not recommended, significantly increases log volume and disk usage. Use only for debugging.
termsAndConditions:https://www.stirlingpdf.com/terms# URL to the terms and conditions of your application (e.g. https://example.com/terms). Empty string to disable or filename to load from local file in static folder
privacyPolicy:https://www.stirlingpdf.com/privacy-policy# URL to the privacy policy of your application (e.g. https://example.com/privacy). Empty string to disable or filename to load from local file in static folder
accessibilityStatement:""# URL to the accessibility statement of your application (e.g. https://example.com/accessibility). Empty string to disable or filename to load from local file in static folder
cookiePolicy:""# URL to the cookie policy of your application (e.g. https://example.com/cookie). Empty string to disable or filename to load from local file in static folder
impressum:""# URL to the impressum of your application (e.g. https://example.com/impressum). Empty string to disable or filename to load from local file in static folder
defaultLocale:en-US# set the default language (e.g. 'de-DE', 'fr-FR', etc)
googlevisibility:false# 'true' to allow Google visibility (via robots.txt), 'false' to disallow
enableAlphaFunctionality:false# set to enable functionality which might need more testing before it fully goes live (this feature might make no changes)
showUpdate:false# see when a new update is available
showUpdateOnlyAdmin:false# only admins can see when a new update is available, depending on showUpdate it must be set to 'true'
customHTMLFiles:false# enable to have files placed in /customFiles/templates override the existing template HTML files
tessdataDir:/usr/share/tessdata# path to the directory containing the Tessdata files. This setting is relevant for Windows systems. For Windows users, this path should be adjusted to point to the appropriate directory where the Tessdata files are stored.
enableAnalytics:true# Master toggle for analytics: set to 'true' to enable all analytics, 'false' to disable all analytics, or leave as 'null' to prompt admin on first launch
enablePosthog:null# Enable PostHog analytics (open-source product analytics): set to 'true' to enable, 'false' to disable, or 'null' to enable by default when analytics is enabled
enableScarf:null# Enable Scarf tracking pixel: set to 'true' to enable, 'false' to disable, or 'null' to enable by default when analytics is enabled
corsAllowedOrigins:[]# List of allowed origins for CORS (e.g. ['http://localhost:5173', 'https://app.example.com']). Leave empty to disable CORS. For local development with frontend on port 5173, add 'http://localhost:5173'
backendUrl:""# Backend base URL for SAML/OAuth/API callbacks (e.g. 'http://localhost:8080' for dev, 'https://api.example.com' for production). REQUIRED for SSO authentication to work correctly. This is where your IdP will send SAML responses and OAuth callbacks. Leave empty to default to 'http://localhost:8080' in development.
frontendUrl:""# Frontend URL for invite email links (e.g. 'https://app.example.com'). Optional - if not set, will use backendUrl. This is the URL users click in invite emails.
enableMobileScanner:true# Enable mobile phone QR code upload feature. Requires frontendUrl to be configured.
mobileScannerSettings:
convertToPdf:true# Automatically convert uploaded images to PDF format. If false, images are kept as-is.
imageResolution:full# Image resolution for mobile uploads: 'full' (original size) or 'reduced' (max 1200px on longest side). Only applies when convertToPdf is true.
pageFormat:A4# Page format for converted PDFs: 'keep' (original image dimensions), 'A4' (A4 page size), or 'letter' (US Letter page size). Only applies when convertToPdf is true.
stretchToFit:false# Whether to stretch images to fill the entire page (may distort aspect ratio). If false, images are centered with preserved aspect ratio. Only applies when convertToPdf is true.
customDatabaseUrl:""# eg jdbc:postgresql://localhost:5432/postgres, set the url for your own custom database connection. If provided, the type, hostName, port and name are not necessary and will not be used
type:postgresql# the type of the database to set (e.g. 'h2', 'postgresql')
hostName:localhost# the host name to use for the database url. Set to 'localhost' when running the app locally. Set to match the name of the container name of your database container when running the app on a server (Docker configuration)
port:5432# set the port number of the database. Ensure this matches the port the database is listening to
name:postgres# set the name of your database. Should match the name of the database you create
weasyprint:""# Defaults to /opt/venv/bin/weasyprint
unoconvert:""# Defaults to /opt/venv/bin/unoconvert
calibre:""# Defaults to /usr/bin/ebook-convert
ocrmypdf:""# Defaults to /usr/bin/ocrmypdf
soffice:""# Defaults to /usr/bin/soffice
fileUploadLimit:""# Defaults to "". No limit when string is empty. Set a number, between 0 and 999, followed by one of the following strings to set a limit. "KB", "MB", "GB".
enabled:false# set to 'true' to allow users to store files on the server (requires security.enableLogin) [ALPHA]
provider:local# storage provider: 'local' for filesystem storage, 'database' for DB-backed storage
local:
basePath:'./storage'# base directory for stored files
quotas:
maxStorageMbPerUser:-1# Max storage per user in MB; -1 disables per-user cap
maxStorageMbTotal:-1# Max storage across all users in MB; -1 disables total cap
maxFileMb:-1# Max size per stored file (including history/audit) in MB; -1 disables limit
sharing:
enabled:false# set to 'true' to enable file sharing features [ALPHA]
linkEnabled:true# set to 'false' to disable share links (requires system.frontendUrl)
emailEnabled:false# set to 'true' to allow sharing by email (requires mail.enabled)
linkExpirationDays:3# Number of days before share links expire
signing:
enabled:false# set to 'true' to enable group signing workflow (requires storage.enabled) [ALPHA]
autoPipeline:
outputFolder:""# Output folder for processed pipeline files (leave empty for default)
fileReadiness:
enabled:true# Set to 'false' to skip all readiness checks and process files immediately (legacy behaviour)
settleTimeMillis:5000# How long (ms) a file must be unmodified before it is considered fully written and stable. Default: 5000 (5 seconds)
sizeCheckDelayMillis:500# Pause (ms) between two file-size reads used to detect active writes (Linux/macOS mid-copy detection). Default: 500
allowedExtensions:[]# Optional extension allow-list (case-insensitive, without the leading dot). Empty list = accept all extensions. Example: ["pdf", "tiff"]
languages:[]# If empty, all languages are enabled. To restrict to specific languages, use a whitelist like ["de_DE", "pl_PL", "sv_SE"]. Empty list or not restricting any languages will enable all available languages.
defaultHideUnavailableTools:false# Default user preference: hide disabled tools instead of greying them out
defaultHideUnavailableConversions:false# Default user preference: hide disabled conversion options instead of greying them out
hideDisabledTools:
googleDrive:false# Hide Google Drive button when not enabled
mobileQRScanner:false# Hide mobile QR scanner button when not enabled