How to generate a compression report across many archives, in-browser
- Step 1Open the tool on a Pro plan — Visit /archive-tools/batch-compression-report. The page requires a Pro plan or higher — on Free you will see an upgrade prompt instead of the dropzone, because batch analysis is gated to Pro and above.
- Step 2Drop your archives — Select or drag multiple files onto the dropzone. There are no per-tool controls to set — the report runs with fixed behaviour. Pro accepts up to 20 files per batch; Pro-media up to 100; Developer is unbounded on count.
- Step 3Let it read each central directory — For each file the tool sniffs the format from the first bytes, then parses the ZIP End-Of-Central-Directory and central directory records to collect per-entry sizes. No archive is fully extracted — only its index is read, which keeps memory bounded.
- Step 4Read the per-archive stats —
compressedSizeis the sum of central-directory compressed sizes;largestEntryis the entry with the biggest uncompressed size;ratioPercentis(1 − compressed ÷ uncompressed) × 100to one decimal, or—when there is no uncompressed total to divide by. - Step 5Scan the result panel — The page shows an "Archives analysed" metric and a preview of the CSV (truncated to the first 4,000 characters on screen). The preview is for a quick sanity check — the full report is in the download.
- Step 6Download the CSV — Click Download to save
batch-compression-report.csv. Open it in Excel, Numbers, or Google Sheets, or feed it to a script — it is plain CSV with a header row and no JAD-specific wrapper.
Every column in the report
The exact CSV header the tool emits, in order, with how each value is derived. These ten columns are fixed — there are no options that add, remove, or reorder them.
| Column | What it holds | How it is derived |
|---|---|---|
filename | The name of the dropped file | Taken from the browser File object; CSV-escaped so commas/quotes in the name don't break the row |
format | Detected container type | Magic-byte sniff: zip, gz, bz2, xz, 7z, rar, tar, or unknown (or error if the file couldn't be read) |
sizeBytes | On-disk size of the file | File.size — the actual bytes of the archive as it sits on your machine |
compressedSize | Sum of stored compressed sizes | Total of every entry's compressed size from the ZIP central directory (0 for non-ZIP containers) |
entryCount | Number of entries inside | Count of central-directory records (0 for non-ZIP containers, since only ZIP indexes are parsed) |
ratioPercent | Space saved by compression | (1 − compressed ÷ uncompressed) × 100, one decimal + %; — when uncompressed total is 0 |
largestEntry | Name of the biggest file inside | The entry with the largest uncompressed size; empty for non-ZIP containers |
largestEntrySize | Size of that biggest entry | Uncompressed bytes of largestEntry (0 when none was found) |
encrypted | Whether any entry is encrypted | true if any central-directory entry has general-purpose flag bit 0 set, else false |
error | Failure reason, if any | Empty on success; the thrown error message (CSV-escaped) when the file couldn't be analysed |
Which formats yield full stats vs format-only
The report identifies many container types by magic bytes, but per-entry numbers come from the ZIP central-directory parser. Use this to read the output correctly.
| Detected format | `format` column | Entry stats (count/sizes/ratio/largest) | `encrypted` flag |
|---|---|---|---|
ZIP (.zip, and ZIP-based like .docx/.jar/.apk) | zip | Full — read from the central directory | Populated from the GP flag |
gzip (.gz) | gz | Empty (0 / —) — gzip has no central directory | false |
tar (.tar) | tar | Empty — tar is detected but not entry-parsed here | false |
bzip2 (.bz2) / xz (.xz) | bz2 / xz | Empty — identified, not entry-parsed | false |
7-Zip (.7z) / RAR (.rar) | 7z / rar | Empty — identified, not entry-parsed | false |
| Unrecognised bytes | unknown | Empty | false |
| File that threw while reading | error | Empty — message lands in the error column | false |
Plan limits for the batch report
This tool requires a Pro plan; there is no Free tier. Caps are per archive file (size and entry count) and per batch (file count).
| Plan | Per-file size cap | Entries per archive | Files per batch |
|---|---|---|---|
| Free | Not available — Pro required | — | — |
| Pro | 500 MB | 50,000 | 20 |
| Pro-media | 2 GB | 500,000 | 100 |
| Developer | 2 GB | 500,000 | Unlimited |
| Enterprise | Unlimited | Unlimited | Unlimited |
Cookbook
Concrete inputs and the CSV rows they produce. Each shows the header plus the rows you'd see in the downloaded batch-compression-report.csv.
A folder of nightly backup ZIPs
The everyday case: several backup ZIPs dropped together. Each ZIP yields full stats because the central directory is present and parseable.
Dropped: db-2026-06-10.zip, db-2026-06-11.zip, db-2026-06-12.zip batch-compression-report.csv: filename,format,sizeBytes,compressedSize,entryCount,ratioPercent,largestEntry,largestEntrySize,encrypted,error db-2026-06-10.zip,zip,48211904,48102220,3,2.1%,dump.sql,210763776,false, db-2026-06-11.zip,zip,48355072,48244910,3,2.1%,dump.sql,211402240,false, db-2026-06-12.zip,zip,48590336,48477001,3,2.1%,dump.sql,212074496,false, Reading it: ratio is only ~2% because the .sql dump was already gzipped before being put in the ZIP — re-zipping compressed data barely helps.
Mixed formats in one drop
When the batch mixes ZIP with gzip/7z/tar, the non-ZIP rows are correctly identified but their entry columns are empty — there is no central directory to read.
Dropped: site.zip, logs.tar.gz, vault.7z, notes.txt filename,format,sizeBytes,compressedSize,entryCount,ratioPercent,largestEntry,largestEntrySize,encrypted,error site.zip,zip,1048576,734003,42,30.0%,index.html,98304,false, logs.tar.gz,gz,5242880,0,0,—,,0,false, vault.7z,7z,2097152,0,0,—,,0,false, notes.txt,unknown,1234,0,0,—,,0,false, Reading it: site.zip got full numbers. logs.tar.gz is correctly labelled 'gz' but has no entry stats. notes.txt isn't an archive → 'unknown'.
Spotting an encrypted archive in the batch
The encrypted column flips to true whenever any entry in a ZIP has the encryption bit set — useful when you're auditing a share for password-protected files.
filename,format,sizeBytes,compressedSize,entryCount,ratioPercent,largestEntry,largestEntrySize,encrypted,error public.zip,zip,524288,401408,12,23.4%,report.pdf,131072,false, confidential.zip,zip,786432,710000,5,9.7%,secrets.pdf,262144,true, Reading it: confidential.zip → encrypted=true. To learn whether it's legacy ZipCrypto or AES, open it in the Encryption Type Detector: /archive-tools/encrypted-archive-detector
One corrupt file doesn't stop the batch
If a file throws while being read, it gets an error row and the run continues with the remaining files. Nothing is lost.
filename,format,sizeBytes,compressedSize,entryCount,ratioPercent,largestEntry,largestEntrySize,encrypted,error good.zip,zip,262144,200000,8,23.7%,data.csv,65536,false, truncated.zip,error,131072,0,0,,,0,false,Invalid or truncated central directory next.zip,zip,393216,310000,10,21.2%,app.js,98304,false, Reading it: truncated.zip failed but the batch finished. To attempt recovery, send it to the Corrupted ZIP repair tool: /archive-tools/corrupted-zip-repair
Triaging which archives are worth re-compressing
Sort the downloaded CSV by ratioPercent: archives near 0% are already-compressed payloads (media, nested gzip) where re-zipping is wasted effort.
Sort batch-compression-report.csv by ratioPercent ascending: media.zip,zip,...,1.2%,... ← already JPEG/MP4, leave alone archive-of-zips.zip,zip,...,0.4%, ← ZIPs inside a ZIP, no-op source.zip,zip,...,71.8%,... ← text/source, compresses well For per-entry ratios inside a single ZIP, follow up with: /archive-tools/compression-ratio-calculator
Edge cases and what actually happens
Non-ZIP archive shows 0 entries and a — ratio
By designgzip, tar, bzip2, xz, 7z, and rar are detected and named in the format column, but per-entry stats come only from the ZIP central directory. So a real .tar.gz or .7z correctly shows its format with entryCount 0, compressedSize 0, and ratioPercent —. This is expected, not a failure — the row tells you the format and on-disk size, just not the internal breakdown.
A `.zip` that is actually a 7z (renamed)
PreservedFormat detection ignores the extension and reads the magic bytes, so a file named backup.zip whose first bytes are 37 7A BC AF 27 1C is reported with format=7z. The filename column keeps the misleading name; the format column tells the truth. To confirm any single file's true type, use /archive-tools/auto-format-detector.
ZIP with a long global comment
SupportedThe End-Of-Central-Directory record is located by scanning the last 65,557 bytes (the maximum comment length plus the EOCD size), so ZIPs with a large global comment are still parsed correctly. If a comment is so corrupt that the EOCD signature can't be found, the file is treated as having no central directory and the entry columns come back empty.
ZIP64 archive (over 4 GB or 65,535+ entries)
PartialThe parser reads the standard 32-bit EOCD fields. Archives that rely on the ZIP64 extension for size or count (entries above 65,535, or sizes above 4 GB) may report truncated entryCount or sizes from the 32-bit fields. For multi-GB archives this is also a practical concern because the per-file cap is 2 GB on Pro-media and Developer.
Encrypted ZIP entries
SupportedThe report reads the central directory, not the encrypted payload, so it can flag encrypted=true and still report sizes and entry count without the password. It does not decrypt anything and does not need a password. To distinguish ZipCrypto from AES-128/192/256, run /archive-tools/encrypted-archive-detector.
File over the per-file size cap
400 too largeEach archive must fit your tier's per-file cap (Pro 500 MB, Pro-media and Developer 2 GB). A file beyond the cap can't be processed on that plan — split it or upgrade. Note this is a per-file limit; the total across the batch is bounded mainly by available browser memory.
Free user opens the page
Pro requiredBatch analysis is a Pro-minimum tool. On the Free tier the page shows an upgrade prompt rather than a dropzone — you cannot run a batch report on Free even for small files. For a single-archive size breakdown, the /archive-tools/archive-size-analyzer and /archive-tools/compression-ratio-calculator tools may be available on lower tiers.
Corrupt or truncated file in the batch
errorIf reading a file throws (truncated download, garbage bytes, unreadable central directory), that file gets a row with format=error and the exception text in the error column, then the batch continues with the next file. Check the error column to see which files failed and why.
Empty file or non-archive dropped
ExpectedA zero-byte file or a plain document that isn't an archive is detected as unknown (or error if it can't be read at all), with empty entry stats. The report still lists it so you can see what was in the folder — it just won't have archive numbers.
ratioPercent looks negative or is —
By designWhen compressed bytes exceed uncompressed (stored-only or already-compressed entries), the ratio can be small or even slightly negative; when there is no uncompressed total to divide by, the cell is —. Both are honest reflections of the central-directory numbers, not bugs.
Frequently asked questions
Does the Batch Report upload my archives?
No. Everything runs in your browser tab using fflate, @zip.js/zip.js, and libarchive WASM. Open DevTools → Network during a run and you'll see no outbound request carrying your file bytes. Backups and artefacts stay on your machine.
What format is the output?
A single CSV file named batch-compression-report.csv with one header row and one row per archive. The columns are filename, format, sizeBytes, compressedSize, entryCount, ratioPercent, largestEntry, largestEntrySize, encrypted, error. There is no JSON output option from this tool.
Why do my 7z / tar.gz files show 0 entries?
Per-entry numbers (count, compressed size, largest entry, ratio) are read from the ZIP central directory. Non-ZIP containers like 7z, rar, tar, gz, bz2, and xz are correctly detected and named in the format column, but they don't have a ZIP central directory, so their entry columns are empty by design.
Is this tool free?
No — it requires a Pro plan or higher. On Free you'll see an upgrade prompt instead of the dropzone. Pro allows up to 20 files per batch at 500 MB each; Pro-media up to 100 files at 2 GB; Developer is unbounded on file count.
How is the compression ratio calculated?
ratioPercent is (1 − compressedSize ÷ uncompressedSize) × 100, rounded to one decimal place, with a percent sign. When the uncompressed total is zero (e.g. a non-ZIP container, or an empty ZIP), the value is the em dash —.
What does the `encrypted` column mean?
It's true when any entry in the ZIP has general-purpose flag bit 0 set, which marks the entry as encrypted. It's a yes/no signal across the whole archive — it doesn't tell you the cipher. For ZipCrypto-vs-AES detail, use the Encryption Type Detector at /archive-tools/encrypted-archive-detector.
Can I drop a folder?
You drop multiple files onto the dropzone. The batch report accepts many files at once (multi-file input). The number you can include per batch is set by your plan: 20 on Pro, 100 on Pro-media, unlimited count on Developer.
Does it open the archives or extract them?
No extraction. It reads each file's header bytes for format detection and, for ZIPs, parses the central directory index to gather sizes and counts. The compressed payloads are never decompressed, which is why it's fast and memory-light even on large archives.
What happens if one file in the batch is corrupt?
That file gets a row with format set to error and the failure message in the error column, then the run continues. You get a complete report for every file you dropped, with the failures clearly marked so you can act on them (e.g. send them to /archive-tools/corrupted-zip-repair).
Why is sizeBytes different from compressedSize?
sizeBytes is the whole file on disk — central directory, local headers, and all entry payloads. compressedSize is just the sum of the entries' stored compressed bytes from the central directory, so it's a bit smaller than the file size for ZIPs and 0 for non-ZIP containers.
Can I see the report before downloading?
Yes. The result panel shows an "Archives analysed" count and a preview of the CSV, truncated to the first 4,000 characters for display. The Download button gives you the complete file regardless of how long it is.
Which browsers work?
Any modern browser with WebAssembly — Chrome, Edge, Firefox, Safari, Brave, Opera — on desktop. Mobile browsers work too, but very large archives can exceed device memory, so desktop is recommended for big batches.
I need per-file ratios inside one archive, not per-archive summaries.
This tool summarises each archive as a single row. For a per-entry breakdown within one ZIP, use /archive-tools/compression-ratio-calculator; for a by-extension view use /archive-tools/file-type-breakdown; and for an overall size map use /archive-tools/archive-size-analyzer.
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.