-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
237 lines (223 loc) · 11.5 KB
/
Copy pathindex.html
File metadata and controls
237 lines (223 loc) · 11.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="theme-color" content="#0d0f0c" />
<meta name="format-detection" content="telephone=no, date=no, address=no, email=no" />
<link rel="preload" href="vendor/fonts/ibmplexmono-400.woff2" as="font" type="font/woff2" crossorigin />
<link rel="preload" href="vendor/fonts/fraunces-normal-300.woff2" as="font" type="font/woff2" crossorigin />
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data: blob:; font-src 'self'; connect-src 'self' https://api.counterapi.dev https://formsubmit.co; object-src 'none'; base-uri 'self'; form-action 'self' https://formsubmit.co;" />
<meta name="referrer" content="strict-origin-when-cross-origin" />
<title>ClientPDF — Merge PDFs without uploading them anywhere</title>
<meta name="description" content="Merge PDF files entirely in your browser. Nothing is uploaded, ever. Free, fast, private." />
<link rel="canonical" href="https://abyworkings-coder.github.io/clientpdf/" />
<meta property="og:type" content="website" />
<meta property="og:title" content="ClientPDF — Merge PDFs without uploading them anywhere" />
<meta property="og:description" content="Merge PDF files entirely in your browser. Nothing is uploaded, ever. Free, fast, private." />
<meta property="og:url" content="https://abyworkings-coder.github.io/clientpdf/" />
<meta property="og:site_name" content="ClientPDF" />
<meta property="og:image" content="https://abyworkings-coder.github.io/clientpdf/og-image.jpg" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="ClientPDF — Merge PDFs without uploading them anywhere" />
<meta name="twitter:description" content="Merge PDF files entirely in your browser. Nothing is uploaded, ever. Free, fast, private." />
<meta name="twitter:image" content="https://abyworkings-coder.github.io/clientpdf/og-image.jpg" />
<link rel="icon" href="./logo.svg" type="image/svg+xml" />
<link rel="icon" href="./favicon-32.png" sizes="32x32" type="image/png" />
<link rel="icon" href="./favicon-16.png" sizes="16x16" type="image/png" />
<link rel="apple-touch-icon" href="./apple-touch-icon.png" />
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "ClientPDF",
"url": "https://abyworkings-coder.github.io/clientpdf/",
"applicationCategory": "UtilitiesApplication",
"operatingSystem": "Any (runs in browser)",
"description": "Merge PDF files entirely in your browser. Nothing is uploaded, ever. Free, fast, private.",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
}
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://abyworkings-coder.github.io/clientpdf/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Merge PDF",
"item": "https://abyworkings-coder.github.io/clientpdf/"
}
]
}
</script>
<script type="application/ld+json">{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to merge PDF files online without uploading them",
"description": "Combine multiple PDF files into one, entirely in your browser.",
"datePublished": "2026-07-27",
"dateModified": "2026-08-04",
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Drop your PDF files",
"text": "Drag and drop two or more PDF files onto the page, or click the dropzone to browse and select them."
},
{
"@type": "HowToStep",
"position": 2,
"name": "Arrange the file order",
"text": "Reorder the loaded file list into the sequence you want pages to appear in — the merged file follows this order exactly."
},
{
"@type": "HowToStep",
"position": 3,
"name": "Click Merge PDFs",
"text": "ClientPDF concatenates every file's pages, in order, into one new PDF using pdf-lib's page-copying API. Text stays selectable and nothing is re-rendered."
},
{
"@type": "HowToStep",
"position": 4,
"name": "Download the merged file",
"text": "Save the combined PDF to your device. It was assembled entirely in this browser tab."
}
]
}</script>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<a class="skip-link" href="#main-content">Skip to main content</a>
<noscript><div class="noscript-banner">ClientPDF requires JavaScript — all files are processed locally in your browser and never uploaded. Please enable JavaScript to use these tools.</div></noscript>
<div class="grain"></div>
<header class="topbar">
<div class="wrap topbar-inner">
<div class="brand">
<span class="brand-mark">◆</span>
<span class="brand-name">Client<em>PDF</em></span>
</div>
<nav class="toolnav" aria-label="Tools">
<a href="./index.html" aria-current="page">Merge</a>
<a href="./split.html">Split</a>
<a href="./delete-pages.html">Delete Pages</a>
<a href="./duplicate-pages.html">Duplicate Pages</a>
<a href="./insert-pages.html">Insert Blank Pages</a>
<a href="./rotate.html">Rotate</a>
<a href="./reorder.html">Reorder</a>
<a href="./compress.html">Compress</a>
<a href="./page-numbers.html">Page Numbers</a>
<a href="./images-to-pdf.html">Images to PDF</a>
<a href="./extract-images.html">Extract Images</a>
<a href="./pdf-to-jpg.html">PDF to JPG</a>
<a href="./watermark.html">Watermark</a>
<a href="./metadata.html">Metadata</a>
<a href="./crop.html">Crop Pages</a>
<a href="./resize.html">Resize Pages</a>
<a href="./grayscale.html">Grayscale PDF</a>
<a href="./border.html">Page Borders</a>
<a href="./image-watermark.html">Image Watermark</a>
<a href="./flatten.html">Flatten Form Fields</a>
<a href="./fill-form.html">Fill Form Fields</a>
<a href="./bookmarks.html">Add Bookmarks</a>
<a href="./split-by-bookmarks.html">Split by Bookmarks</a>
<a href="./pages-per-sheet.html">Pages per Sheet</a>
<a href="./redact.html">Redact</a>
<a href="./tools.html">All Tools</a>
<a href="./guide.html">Guide</a>
</nav>
<div class="topbar-status">
<span class="dot" aria-hidden="true"></span>
<span>running locally in this tab — nothing uploaded</span>
</div>
</div>
</header>
<main class="wrap" id="main-content" tabindex="-1">
<section class="hero">
<h1>Open DevTools.<br />Merge these PDFs.<br />Watch nothing get sent anywhere.</h1>
<p class="lede">
Most "free" PDF mergers upload your file to a server you can't see,
in a country you didn't pick, under a privacy policy you didn't read.
This one has zero network requests after the page loads —
check the Network tab yourself, right now, before you trust it with anything.
</p>
<p class="article-meta">Don't take our word for it — <a href="./guide.html">here's how to verify it in 10 seconds</a>. Merging a file with bookmarks? <a href="./guide-merge-bookmarks.html">Here's what does and doesn't carry over</a>.</p>
</section>
<section class="tool" id="tool">
<div class="dropzone" id="dropzone" tabindex="0" role="button" aria-label="Add PDF files">
<input type="file" id="fileInput" accept="application/pdf" multiple hidden />
<div class="dropzone-inner">
<span class="dropzone-icon">⇣</span>
<p><strong>Drop PDF files here</strong> or click to browse</p>
<p class="dropzone-hint">Merge 2 or more PDFs · files stay on this device</p>
</div>
</div>
<ol class="file-list" id="fileList" aria-label="Files to merge"></ol>
<div class="actions" id="actions" hidden>
<button class="btn btn-ghost" id="clearBtn" type="button">Clear all</button>
<button class="btn btn-primary" id="mergeBtn" type="button">
<span id="mergeBtnLabel">Merge PDFs</span>
</button>
</div>
<div class="result" id="result" role="status" aria-live="polite" hidden></div>
</section>
<section class="proof">
<h2 class="sr-only">Why trust this tool</h2>
<div class="proof-live" id="proofLive">
<span class="proof-live-dot" aria-hidden="true"></span>
<span id="proofLiveText">0 network requests since page load · verified live, not our word for it</span>
</div>
<div class="proof-grid">
<div class="proof-item">
<h3>No accounts</h3>
<p>No signup, no email, no watermark. Use it and close the tab.</p>
</div>
<div class="proof-item">
<h3>No limits (for now)</h3>
<p>Merge as many files as your device's memory allows. No artificial 3-file caps.</p>
</div>
</div>
</section>
<section class="pro" id="pro">
<div class="pro-card">
<div class="pro-copy">
<h2>Splitting, rotating, reordering, compressing, and numbering PDFs? All live too.</h2>
<p><a href="./split.html">Extract pages or split every page into its own file</a>, <a href="./rotate.html">fix pages scanned sideways</a>, <a href="./reorder.html">drag pages into a new order</a>, <a href="./compress.html">shrink the file size</a>, or <a href="./page-numbers.html">stamp page numbers onto every page</a> — same rule: everything stays local. Leave your email and we'll let you know about a Pro batch mode.</p>
</div>
<form class="pro-form" id="proForm">
<input type="email" id="proEmail" placeholder="you@company.com" required aria-label="Email address" autocomplete="email" />
<button class="btn btn-primary" type="submit">Notify me</button>
</form>
<p class="pro-note" id="proNote" role="status" aria-live="polite" hidden>Thanks — saved locally for now, we'll be in touch once signups are live.</p>
</div>
</section>
<section class="about">
<h2>What merging actually does, and what it doesn't</h2>
<p>Merge takes every PDF you drop in, in the order you drop them, and concatenates their pages into one new file using <a href="https://github.com/Hopding/pdf-lib" target="_blank" rel="noopener">pdf-lib</a>'s page-copying API — it isn't re-rendering or flattening anything, so text stays selectable, links stay clickable, and vector graphics stay sharp. Reorder the file list before you merge; there's no way to reorder pages inside the combined output afterward without a second pass through <a href="./reorder.html">Reorder</a>.</p>
<p>Two things worth knowing before you rely on this for something official: bookmarks and outline entries from your source files don't automatically carry into the merged PDF — <a href="./guide-merge-bookmarks.html">here's what does and doesn't survive a merge, and how to add them back</a>. And dropping in a dozen large scans at once asks a lot of a browser tab with no server to offload to; if it stalls, <a href="./guide-large-file-freeze.html">this explains why and how to work around it</a>.</p>
</section>
</main>
<footer class="footer">
<div class="wrap footer-inner">
<span>ClientPDF — built by <a href="https://github.com/abyworkings-coder" target="_blank" rel="noopener">Auto Company</a></span>
<span>No servers were harmed in the making of this tool.</span>
<span class="footer-legal"><a href="./privacy.html">Privacy</a> · <a href="./terms.html">Terms</a></span>
</div>
</footer>
<script src="./counter.js"></script>
<script type="module" src="app.js"></script>
</body>
</html>