How to archive merger online for free
- Step 1Open the Archive Merger — Go to the Archive Merger tool page. The merge runs in your browser, so there is no account wall to clear before you can drop files. Merging requires the Pro tier or higher because it is a multi-file operation.
- Step 2Drop two or more archives — Drag two or more archive files onto the drop zone, or click to browse and multi-select. The drop zone reads one or more archive files — a single file will be rejected with
Drop at least two archives to merge.Accepted extensions include.zip,.tar,.tar.gz,.tgz,.gz,.bz2,.tar.bz2,.xz,.tar.xz,.7z,.rarand.iso. - Step 3Let each input be read in order — The tool processes inputs in the order you dropped them. For each archive it detects the format and extracts entries: ZIP/TAR/GZ through fflate, and 7z/RAR/bz2/xz/ISO through the libarchive WASM bridge. 7z and RAR inputs trigger a one-time WASM download on first use.
- Step 4Review the collision rule as it merges — As entries are added, the first archive that claims a given path keeps it. If a later archive carries the same path, that copy is stored under
<archive-stem>/<original-path>instead, and the collision is counted. Nothing is overwritten. - Step 5Read the result chips — When the merge finishes, the result panel shows small chips: Input archives (how many you dropped), Entries (total files in the output), and Collisions (how many entries were auto-renamed). Use the Collisions count as a sanity check.
- Step 6Download the merged ZIP — Click download to save
merged-N-archives.zip. It is a standard ZIP compressed at fflate level 6 — open it with any unzip tool. If you need TAR.GZ or 7z output instead, run the result through the archive format converter.
What the merger reads and what it writes
Input formats are detected by magic bytes, not file extension. The output is always ZIP regardless of the input mix. libarchive is read-only in the browser, so the merger never writes 7z, RAR, TAR or ISO.
| Capability | Formats | Engine | Notes |
|---|---|---|---|
| Read (ZIP family) | .zip | fflate (or @zip.js/zip.js if any entry is encrypted) | Standard DEFLATE ZIPs are read with fflate; if the central directory shows encrypted entries it falls back to zip.js. |
| Read (tar / gzip) | .tar, .gz | fflate | .tar is parsed into its member files. A plain .gz is gunzipped into a single inner file. |
| Read (via libarchive WASM) | .7z, .rar, .bz2, .xz, .tar.bz2, .tar.xz, .iso | libarchive WASM bridge | Read-only. First 7z/RAR/ISO input downloads the WASM module once per session. |
| Write (output) | .zip only | fflate zipSync level 6 | The merged result is always a ZIP named merged-N-archives.zip. There is no option to output 7z, TAR or RAR. |
Tier limits that apply to a merge
Archive-family limits from the JAD tier table. Limits are per archive: fileBytes is the per-file cap and entryLimit caps the entry count of an individual archive. Because merging needs at least two files, the Free tier (batchFiles: 1) cannot run it.
| Tier | Max file size | Max entries / archive | Max files per merge |
|---|---|---|---|
| Free | 50 MB | 500 | 1 (cannot merge — needs 2+) |
| Pro | 500 MB | 50,000 | 20 |
| Pro-media | 2 GB | 500,000 | 100 |
| Developer | 2 GB | 500,000 | unlimited |
Cookbook
Real merge scenarios with the exact entry paths the tool produces. The key rule to internalise: first writer wins the path, later duplicates get a <stem>/ prefix.
Two ZIPs, one colliding README
Both archives have a top-level README.md. The first archive dropped keeps the bare path; the second is prefixed with its filename stem. The Collisions chip reads 1.
Inputs (dropped in this order): release-v1.zip -> README.md, bin/app release-v2.zip -> README.md, bin/app2 merged-2-archives.zip: README.md (from release-v1.zip — first writer) bin/app release-v2/README.md (renamed; collided with README.md) bin/app2 Result chips: Input archives: 2 | Entries: 4 | Collisions: 1
Mixed formats in one merge
A ZIP, a TAR.GZ-style gzip, and a 7z are merged together. All are read; the output is a single ZIP. Note how a plain gzip contributes only one file.
Inputs: app.zip -> index.html, css/site.css notes.txt.gz -> notes.txt (gunzip yields one file) vendor.7z -> lib/a.dll, lib/b.dll (read via libarchive WASM) merged-3-archives.zip: index.html css/site.css notes.txt lib/a.dll lib/b.dll Result chips: Input archives: 3 | Entries: 5 | Collisions: 0
Single file rejected
Dropping just one archive is the most common mistake. The merger needs at least two inputs and stops immediately.
Input: bundle.zip Error: Drop at least two archives to merge. Fix: select a second archive (Ctrl/Cmd-click two files, or drag both onto the zone).
Three archives sharing a path
When three inputs all carry config.json, each later duplicate is prefixed with its own stem, so all three survive at distinct paths.
Inputs: base.zip -> config.json region-eu.zip -> config.json region-us.zip -> config.json merged-3-archives.zip: config.json (base.zip — first writer) region-eu/config.json (collision #1) region-us/config.json (collision #2) Result chips: Input archives: 3 | Entries: 3 | Collisions: 2
After merging, convert to TAR.GZ
The merger only writes ZIP. If your downstream needs a gzipped tarball, chain the converter on the merged file.
Step 1 (this tool): merge a.zip + b.zip -> merged-2-archives.zip Step 2 (Archive Format Converter): merged-2-archives.zip -> merged-2-archives.tar.gz See /archive-tools/archive-format-converter
Edge cases and what actually happens
Only one archive dropped
RejectedThe merge throws Drop at least two archives to merge. immediately. Inputs are gathered from the primary file plus any additional files; fewer than two stops the run before any extraction.
Top-level filename collision
PreservedNot a failure. The first archive to use a path keeps it; later duplicates are stored under <archive-stem>/<path>. The Collisions chip counts each rename, and every entry survives in the output.
Plain .gz input contributes one file
By designA .gz is detected by its gzip magic bytes and gunzipped to a single inner file (named from the gzip header or the filename minus .gz). It is not expanded into multiple members. To pull individual files out of an archive first, use a sibling extractor.
tar.gz inner name
ExpectedA .tar.gz carries gzip magic bytes, so it is gunzipped as a single stream. If the gzip stores an inner name of a tar, you may get one large .tar entry rather than its members. To merge tar members individually, extract the tarball first with a sibling tool, then re-merge.
Encrypted ZIP entries in an input
Fails to readIf an input ZIP has encrypted entries, the reader needs a password — but the merger forwards none, so password-protected content cannot be extracted and the merge will error on that archive. Decrypt or extract it first.
Corrupt or truncated input
ErrorIf an input cannot be parsed, extraction throws and the whole merge fails — there is no partial output. Test the suspect archive with the archive integrity tester before retrying.
Unknown format input
Last-resort retryIf magic-byte detection returns unknown, the reader makes a final attempt to parse it as a ZIP. If that also fails, the merge throws a 'could not detect or extract' error for that file.
Entry-count over tier cap
RejectedEach input is bounded by the per-archive entryLimit for your tier (Free 500, Pro 50,000, Pro-media/Developer 500,000). An archive exceeding it is rejected before merge.
Empty archive input
SupportedAn archive with zero files contributes nothing and does not error, but it still counts toward the two-input minimum. Two empty archives produce an empty merged ZIP.
Directory entries in inputs
PreservedFolder structure is kept: a file stored at src/lib/x.js lands at src/lib/x.js in the output. Only files are written into the merged map; explicit directory placeholder entries are not separately re-emitted.
Frequently asked questions
Is the Archive Merger really free and does it upload my files?
It runs entirely in your browser via WebAssembly — there is no server-side path for archive tools, so your files are never uploaded. Note that merging is a multi-file operation gated to the Pro tier and above, because the Free tier allows only one input file.
What output format do I get?
Always a ZIP, named merged-N-archives.zip where N is the number of inputs. It is compressed with fflate at level 6. There is no option to output 7z, TAR, RAR or ISO.
Can I merge 7z, RAR, or ISO files?
Yes, as inputs. The tool reads .7z, .rar, .bz2, .xz, .tar.bz2, .tar.xz and .iso through a libarchive WASM bridge. You cannot produce a 7z or RAR — output is ZIP only.
What happens when two archives have a file at the same path?
The first archive to claim that path keeps it. The second (and any later) copy is stored under <archive-stem>/<original-path> — for example README from build-2.zip becomes build-2/README. The Collisions chip shows how many entries were renamed.
Does it show me which files were renamed?
The result panel shows a Collisions count, not a per-file list. Every renamed entry is in the downloaded ZIP under its <stem>/ path, so you can see them by listing the output — try the file listing generator for a full manifest.
How many archives can I merge at once?
Two minimum. The upper bound is the per-merge file count for your tier: Pro allows 20, Pro-media 100, and Developer is unlimited. Free cannot merge because it permits only one file.
What is the maximum file size?
Per the archive tier limits: 50 MB on Free, 500 MB on Pro, and 2 GB on Pro-media and Developer — applied per input file. Each archive is also capped by entry count (500 / 50,000 / 500,000).
Can I set the compression level or add a password?
No. The merger exposes no options at all — it always writes ZIP at fflate level 6 with no encryption. For a password-protected ZIP, build it with the encrypted ZIP creator.
Why was my single archive rejected?
Merging needs at least two inputs. If you drop one file you get Drop at least two archives to merge. Select a second archive and retry.
Does merging re-compress files that were already compressed?
Yes — entries are extracted then re-zipped at fflate level 6, so the output size depends on fflate's compression of the raw bytes, not the input archives' original ratios.
Will it preserve folder structure inside each archive?
Yes. A file at docs/guide.md inside an input stays at docs/guide.md in the output, unless that exact path was already taken by an earlier archive (then it is prefixed with the stem).
What if I want each source kept in its own subfolder instead of flattened?
Use the batch extraction manager, which extracts each archive into its own subfolder and re-zips — the opposite of the merger's flatten-together behaviour.
Privacy first
Every JAD Archive tool runs entirely in your browser using fflate, @zip.js/zip.js, and the libarchive WASM bridge. Your archives never leave your device — verified by zero outbound network requests during processing.