locally hosted web application that allows you to perform various operations on PDF files
Go to file
Dario Ghunney Ware f5c67a3239
Login Refresh Fix (#4779)
Main Issues Fixed:

  1. Tools Disabled on Initial Login (Required Page Refresh)

Problem: After successful login, all PDF tools appeared grayed
out/disabled until the user refreshed the page.

Root Cause: Race condition where tools checked endpoint availability
before JWT was stored in localStorage.

  Fix:
- Implemented optimistic defaults in useEndpointConfig - assumes
endpoints are enabled when no JWT exists
- Added JWT availability event system (jwt-available event) to notify
components when authentication is ready
- Tools now remain enabled during auth initialization instead of
defaulting to disabled

  2. Session Lost on Page Refresh (Immediate Logout)

Problem: Users were immediately logged out when refreshing the page,
losing their authenticated session.

  Root Causes:
- Spring Security form login was redirecting API calls to /login with
302 responses instead of returning JSON
  - /api/v1/auth/me endpoint was incorrectly in the permitAll list
- JWT filter wasn't allowing /api/v1/config endpoints without
authentication

  Fixes:
- Backend: Disabled form login in v2/JWT mode by adding && !v2Enabled
condition to form login configuration
- Backend: Removed /api/v1/auth/me from permitAll list - it now requires
authentication
  - Backend: Added /api/v1/config to public endpoints in JWT filter
- Backend: Configured proper exception handling for API endpoints to
return JSON (401) instead of HTML redirects (302)

  3. Multiple Duplicate API Calls

Problem: After login, /app-config was called 5+ times,
/endpoints-enabled and /me called multiple times, causing unnecessary
network traffic.

Root Cause: Multiple React components each had their own instance of
useAppConfig and useEndpointConfig hooks, each fetching data
independently.

  Fix:
- Frontend: Created singleton AppConfigContext provider to ensure only
one global config fetch
- Frontend: Added global caching to useEndpointConfig with module-level
cache variables
- Frontend: Implemented fetch deduplication with fetchCount tracking and
globalFetchedSets
- Result: Reduced API calls from 5+ to 1-2 per endpoint (2 in dev due to
React StrictMode)

  Additional Improvements:

  CORS Configuration

  - Added flexible CORS configuration matching SaaS pattern
- Explicitly allows localhost development ports (3000, 5173, 5174, etc.)
  - No hardcoded URLs in application.properties

  Security Handlers Integration

  - Added IP-based account locking without dependency on form login
  - Preserved audit logging with @Audited annotations

  Key Code Changes:

  Backend Files:
- SecurityConfiguration.java - Disabled form login for v2, added CORS
config
- JwtAuthenticationFilter.java - Added /api/v1/config to public
endpoints
  - JwtAuthenticationEntryPoint.java - Returns JSON for API requests

  Frontend Files:
  - AppConfigContext.tsx - New singleton context for app configuration
  - useEndpointConfig.ts - Added global caching and deduplication
  - UseSession.tsx - Removed redundant config checking
- Various hooks - Updated to use context providers instead of direct
fetching

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: stirlingbot[bot] <stirlingbot[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ludy <Ludy87@users.noreply.github.com>
Co-authored-by: EthanHealy01 <80844253+EthanHealy01@users.noreply.github.com>
Co-authored-by: Ethan <ethan@MacBook-Pro.local>
Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
Co-authored-by: ConnorYoh <40631091+ConnorYoh@users.noreply.github.com>
Co-authored-by: Connor Yoh <connor@stirlingpdf.com>
2025-11-06 15:42:22 +00:00
.devcontainer chore: update development configs, formatting tools, and CI enhancements (#4130) 2025-08-08 12:52:51 +01:00
.github Update PR-Auto-Deploy-V2.yml 2025-11-05 23:33:53 +00:00
.vscode V2 Auto rename (#4244) 2025-09-05 17:12:52 +01:00
app Login Refresh Fix (#4779) 2025-11-06 15:42:22 +00:00
devGuide Feature/v2/filehistory (#4370) 2025-09-16 15:08:11 +01:00
devTools
docker V2 Tauri integration (#3854) 2025-11-05 11:44:59 +00:00
docs
exampleYmlFiles JWT Auth into V2 (#4187) 2025-08-15 14:13:45 +01:00
frontend Login Refresh Fix (#4779) 2025-11-06 15:42:22 +00:00
gradle/wrapper
images
scripts V2 Tauri integration (#3854) 2025-11-05 11:44:59 +00:00
testing test fixes 2025-11-04 10:24:00 +00:00
.editorconfig Add linting to frontend (#4341) 2025-09-04 14:08:28 +01:00
.git-blame-ignore-revs
.gitattributes
.gitignore Merge remote-tracking branch 'origin/V2' into mainToV2 2025-10-12 20:45:25 +01:00
.pre-commit-config.yaml 🤖 format everything with pre-commit by stirlingbot (#4075) 2025-08-02 23:18:48 +01:00
ADDING_TOOLS.md V2 flatten (#4358) 2025-09-05 11:25:30 +00:00
build.gradle Merge remote-tracking branch 'origin/V2' into mainToV2 2025-11-03 23:01:41 +00:00
CLAUDE.md Feature/viewer annotation toggle (#4557) 2025-10-02 10:40:18 +01:00
CONTRIBUTING.md
DATABASE.md feat(database): make backup schedule configurable via system keys (#4251) 2025-09-04 15:02:31 +01:00
DeveloperGuide.md V2 Tauri integration (#3854) 2025-11-05 11:44:59 +00:00
gradle.properties build(local): simplify writeVersion task with WriteProperties plugin and enable build caching (#4139) 2025-08-08 10:36:30 +01:00
gradlew
gradlew.bat
HowToUseOCR.md
launch4jConfig.xml ci: enhance GitHub Actions workflows with Gradle setup, caching improvements, and Docker image testing (#3956) 2025-07-16 17:17:11 +01:00
LICENSE
package-lock.json Feature/v2/improve sign (#4627) 2025-10-09 13:35:42 +01:00
README.md 🌐 [V2] Sync Translations + Update README Progress Table (#4683) 2025-10-27 13:06:11 +00:00
SECURITY.md
settings.gradle
test_globalsign.pdf V2 Validate PDF Signature tool (#4679) 2025-10-16 13:45:59 +01:00
test_irs_signed.pdf V2 Validate PDF Signature tool (#4679) 2025-10-16 13:45:59 +01:00

Stirling-PDF

Docker Pulls Discord OpenSSF Scorecard GitHub Repo stars

Stirling PDF - Open source locally hosted web PDF editor | Product Hunt Deploy to DO

Stirling-PDF is a robust, locally hosted web-based PDF manipulation tool using Docker. It enables you to carry out various operations on PDF files, including splitting, merging, converting, reorganizing, adding images, rotating, compressing, and more. This locally hosted web application has evolved to encompass a comprehensive set of features, addressing all your PDF requirements.

All files and PDFs exist either exclusively on the client side, reside in server memory only during task execution, or temporarily reside in a file solely for the execution of the task. Any file downloaded by the user will have been deleted from the server by that point.

Homepage: https://stirlingpdf.com

All documentation available at https://docs.stirlingpdf.com/

stirling-home

Features

  • 50+ PDF Operations
  • Parallel file processing and downloads
  • Dark mode support
  • Custom download options
  • Custom 'Pipelines' to run multiple features in a automated queue
  • API for integration with external scripts
  • Optional Login and Authentication support (see here for documentation)
  • Database Backup and Import (see here for documentation)
  • Enterprise features like SSO (see here for documentation)

PDF Features

Page Operations

  • View and modify PDFs - View multi-page PDFs with custom viewing, sorting, and searching. Plus, on-page edit features like annotating, drawing, and adding text and images. (Using PDF.js with Joxit and Liberation fonts)
  • Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages
  • Merge multiple PDFs into a single resultant file
  • Split PDFs into multiple files at specified page numbers or extract all pages as individual files
  • Reorganize PDF pages into different orders
  • Rotate PDFs in 90-degree increments
  • Remove pages
  • Multi-page layout (format PDFs into a multi-paged page)
  • Scale page contents size by set percentage
  • Adjust contrast
  • Crop PDF
  • Auto-split PDF (with physically scanned page dividers)
  • Extract page(s)
  • Convert PDF to a single page
  • Overlay PDFs on top of each other
  • PDF to a single page
  • Split PDF by sections

Conversion Operations

  • Convert PDFs to and from images
  • Convert any common file to PDF (using LibreOffice)
  • Convert PDF to Word/PowerPoint/others (using LibreOffice)
  • Convert HTML to PDF
  • Convert PDF to XML
  • Convert PDF to CSV
  • URL to PDF
  • Markdown to PDF

Security & Permissions

  • Add and remove passwords
  • Change/set PDF permissions
  • Add watermark(s)
  • Certify/sign PDFs
  • Sanitize PDFs
  • Auto-redact text

Other Operations

  • Add/generate/write signatures
  • Split by Size or PDF
  • Repair PDFs
  • Detect and remove blank pages
  • Compare two PDFs and show differences in text
  • Add images to PDFs
  • Compress PDFs to decrease their filesize (using qpdf)
  • Extract images from PDF
  • Remove images from PDF
  • Extract images from scans
  • Remove annotations
  • Add page numbers
  • Auto-rename files by detecting PDF header text
  • OCR on PDF (using Tesseract OCR)
  • PDF/A conversion (using LibreOffice)
  • Edit metadata
  • Flatten PDFs
  • Get all information on a PDF to view or export as JSON
  • Show/detect embedded JavaScript

📖 Get Started

Visit our comprehensive documentation at docs.stirlingpdf.com for:

  • Installation guides for all platforms
  • Configuration options
  • Feature documentation
  • API reference
  • Security setup
  • Enterprise features

Supported Languages

Stirling-PDF currently supports 40 languages!

Language Progress
Arabic (العربية) (ar_AR) 83%
Azerbaijani (Azərbaycan Dili) (az_AZ) 32%
Basque (Euskara) (eu_ES) 18%
Bulgarian (Български) (bg_BG) 35%
Catalan (Català) (ca_CA) 34%
Croatian (Hrvatski) (hr_HR) 31%
Czech (Česky) (cs_CZ) 34%
Danish (Dansk) (da_DK) 30%
Dutch (Nederlands) (nl_NL) 30%
English (English) (en_GB) 100%
English (US) (en_US) 100%
French (Français) (fr_FR) 82%
German (Deutsch) (de_DE) 84%
Greek (Ελληνικά) (el_GR) 34%
Hindi (हिंदी) (hi_IN) 34%
Hungarian (Magyar) (hu_HU) 38%
Indonesian (Bahasa Indonesia) (id_ID) 31%
Irish (Gaeilge) (ga_IE) 34%
Italian (Italiano) (it_IT) 84%
Japanese (日本語) (ja_JP) 62%
Korean (한국어) (ko_KR) 34%
Norwegian (Norsk) (no_NB) 32%
Persian (فارسی) (fa_IR) 34%
Polish (Polski) (pl_PL) 36%
Portuguese (Português) (pt_PT) 34%
Portuguese Brazilian (Português) (pt_BR) 83%
Romanian (Română) (ro_RO) 28%
Russian (Русский) (ru_RU) 83%
Serbian Latin alphabet (Srpski) (sr_LATN_RS) 37%
Simplified Chinese (简体中文) (zh_CN) 85%
Slovakian (Slovensky) (sk_SK) 26%
Slovenian (Slovenščina) (sl_SI) 36%
Spanish (Español) (es_ES) 84%
Swedish (Svenska) (sv_SE) 33%
Thai (ไทย) (th_TH) 31%
Tibetan (བོད་ཡིག་) (bo_CN) 65%
Traditional Chinese (繁體中文) (zh_TW) 38%
Turkish (Türkçe) (tr_TR) 37%
Ukrainian (Українська) (uk_UA) 36%
Vietnamese (Tiếng Việt) (vi_VN) 28%
Malayalam (മലയാളം) (ml_IN) 73%

Stirling PDF Enterprise

Stirling PDF offers an Enterprise edition of its software. This is the same great software but with added features, support and comforts. Check out our Enterprise docs

🤝 Looking to contribute?

Join our community: