Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
8f42c96
Add browser-local qpdf compression dependency
surajverma Sep 5, 2026
0d8760a
Improve PDF merge editing and add local compression
surajverma Sep 5, 2026
1309e19
Temporarily refresh PDF compression dependency lockfile
surajverma Sep 5, 2026
41eb41d
Refresh PDF compression dependency lockfile
github-actions[bot] Sep 5, 2026
9938098
Remove temporary lockfile refresh workflow
surajverma Sep 5, 2026
0735d7a
Advertise PDF compression in tool catalog
surajverma Sep 5, 2026
8c2e2a6
Document local PDF compression
surajverma Sep 5, 2026
a994a05
Serve qpdf worker assets from same origin
surajverma Sep 5, 2026
0d32fe1
Prepare qpdf assets before dev and build
surajverma Sep 5, 2026
c6846a4
Work around Turbopack qpdf worker file URLs
surajverma Sep 5, 2026
83b5a47
Ignore generated qpdf public assets
surajverma Sep 5, 2026
0c91f20
Gate high severity runtime dependency vulnerabilities
surajverma Sep 5, 2026
0aaceac
Add PDF.js for raster compression
surajverma Sep 5, 2026
028e9d9
Prepare PDF.js worker for raster compression
surajverma Sep 5, 2026
a7f454a
Temporarily patch PDF raster compression
surajverma Sep 5, 2026
f9e4725
Use PDF.js for reliable lossy PDF compression
github-actions[bot] Sep 5, 2026
19d0318
Remove temporary PDF patch workflow
surajverma Sep 5, 2026
7292dce
Document PDF raster compression tradeoffs
surajverma Sep 5, 2026
d52f11a
Use typed PDF.js package entry
surajverma Sep 5, 2026
f1b0de6
Temporarily apply PDF.js 6 API fixes
surajverma Sep 5, 2026
5ca63e2
Fix PDF.js 6 rendering API usage
github-actions[bot] Sep 5, 2026
59956c1
Remove temporary PDF.js fix workflow
surajverma Sep 5, 2026
b2ffa32
Temporarily patch PDF selector UI
surajverma Sep 5, 2026
a4f9aed
Fix temporary PDF selector patch workflow
surajverma Sep 5, 2026
094e872
Improve PDF working-file selector UX
github-actions[bot] Sep 5, 2026
48acb04
Remove temporary PDF selector patch workflow
surajverma Sep 5, 2026
86cc7df
Prevent stale PWA cache during local development
surajverma Sep 5, 2026
3ecdda9
Temporarily patch PDF hydration boundary
surajverma Sep 5, 2026
6430d3f
Trigger PDF hydration patch workflow
surajverma Sep 5, 2026
c8749c6
Add hydration-safe PDF route boundary
surajverma Sep 5, 2026
0e4ebae
Wrap PDF toolkit in hydration-safe client boundary
surajverma Sep 5, 2026
ac2e19a
Remove temporary PDF hydration patch workflow
surajverma Sep 5, 2026
8aaa000
Handle development PWA cleanup failures
surajverma Sep 5, 2026
8b7da19
Ignore generated PDF.js browser assets
surajverma Sep 5, 2026
e74d0be
Make PDF removal state updates composable
surajverma Sep 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ jobs:
node-version: 24
cache: npm
- run: npm ci
- run: npm audit --omit=dev --audit-level=high
- run: npm run privacy-check
- run: npm run lint
- run: npm run typecheck
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@
/.next/
/out/

# generated browser runtime assets
/public/qpdf/
/public/pdfjs/

# production
/build

Expand Down
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ ToolStack is an open-source collection of utilities designed around a strict loc
## Highlights

### PDF & Documents
- PDF Toolkit: merge PDFs, reorder merge inputs, extract/reorder/delete/rotate pages, split every page to ZIP, edit basic metadata and turn images into a PDF.
- PDF operations run in-browser with bundled `pdf-lib`; ToolStack does not claim secure redaction or general PDF compression.
- PDF Toolkit: compress PDFs, merge and reorder merge inputs, remove accidental uploads, select which loaded PDF to edit, extract/reorder/delete/rotate pages, split every page to ZIP, edit basic metadata and turn images into a PDF.
- Lossless PDF compression runs in-browser with bundled qpdf WebAssembly and preserves document structure, selectable text, links and forms.
- Balanced and Strong compression use bundled PDF.js to render pages locally and rebuild them as JPEG-backed PDF pages. This can produce much larger reductions for scans/image-heavy files, but intentionally flattens the document: selectable text, links, forms, bookmarks, accessibility structure and digital signatures are not preserved.
- Other PDF editing operations use bundled `pdf-lib`. ToolStack does not claim secure redaction.

### Privacy & Security
Image Metadata Remover, Data Anonymizer, File Hash & Checksum, Tracking URL Cleaner, Password & Passphrase Generator, JWT Inspector, Browser Privacy Inspector, Text Privacy Cleaner, AES-GCM File Encryption, File Type & Signature Inspector, Content Credentials (C2PA) Inspector, and HMAC Generator & Verifier.
Expand Down
289 changes: 287 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 6 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
{
"name": "toolstack",
"version": "0.3.0",
"version": "0.3.1",
"private": true,
"scripts": {
"prepare-qpdf-assets": "node scripts/copy-qpdf-assets.mjs",
"predev": "npm run prepare-qpdf-assets",
"dev": "next dev",
"prebuild": "npm run prepare-qpdf-assets",
"build": "next build",
"start": "next start",
"lint": "eslint .",
Expand All @@ -23,8 +26,10 @@
"next": "16.3.4",
"papaparse": "^5.5.3",
"pdf-lib": "^1.17.1",
"pdfjs-dist": "^6.3.289",
"piexifjs": "^1.0.6",
"postcss-selector-parser": "^7.1.6",
"qpdf-run": "^0.2.1",
"react": "^19.2.8",
"react-dom": "^19.2.8",
"react-image-crop": "^11.0.10",
Expand Down
Loading
Loading