How to batch compression report for developers
- Step 1Collect the artefacts — Download the release ZIPs or CI artefacts you want to compare. The tool reads from disk in the browser, so nothing is uploaded — fine for pre-release or internal artefacts.
- Step 2Open the tool (Pro plan) — Go to /archive-tools/batch-compression-report. It requires Pro or higher; Free shows an upgrade prompt. There are no options to configure — behaviour is fixed, which keeps comparisons consistent across runs.
- Step 3Drop the whole set — Drag every artefact onto the dropzone in one go. Pro accepts 20 files per batch (500 MB each), Pro-media 100 (2 GB each), Developer unlimited count.
- Step 4Read for regressions — Sort the CSV by
sizeBytesto spot a size jump, byratioPercentto find artefacts that stopped compressing (often a binary or media file crept in), and checkentryCountfor an unexpected change in the number of bundled files. - Step 5Diff against a baseline — Keep last release's
batch-compression-report.csvand diff the new one against it. A growinglargestEntryor a flippedencryptedflag is immediately visible in the diff. - Step 6Drop the CSV into the PR — Download
batch-compression-report.csvand paste the relevant rows into the PR comment, or attach it. It's plain CSV, so it renders or imports anywhere your team already works.
Developer questions the report answers
What each column tells you during code review, release prep, or artefact triage.
| Column | Dev question | Caveat |
|---|---|---|
sizeBytes | Did the artefact grow vs last release? | On-disk file size; always populated |
entryCount | Did the number of bundled files change? | ZIP only; 0 for tar.gz/7z |
ratioPercent | Is something uncompressible now in the bundle? | ZIP only; — for non-ZIP |
largestEntry / largestEntrySize | What single file dominates the artefact? | ZIP only; uncompressed size |
encrypted | Did a release ZIP ship encrypted by mistake? | true if any entry's GP flag bit 0 set |
format | Is this a ZIP, jar, or a renamed tarball? | Magic-byte detection, all formats |
error | Did the artefact fail to read? | Holds the exception message |
Browser tool vs scripting it yourself
The batch report has no API. Here's when to use the page vs roll your own with fflate or zipinfo.
| Situation | Use the browser report | Script it (fflate / zipinfo) |
|---|---|---|
| Ad-hoc PR/release check | Yes — fastest path | Overkill |
| CI gate on artefact size | No API to call | Yes — fflate in a Node step |
| Comparing a handful of ZIPs | Yes — drop and sort | Possible but slower to set up |
| tar.gz / 7z entry detail | Detected, not entry-counted | Yes — tar -t / 7z l |
| Files over 2 GB | Over the cap | Yes — disk-bound |
| Reproducible nightly report | No scheduling | Yes — cron + script |
Plan limits
Per-file and per-batch limits. This tool requires Pro; there is no Free path.
| Plan | Per-file cap | Entries/archive | Files/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 |
Cookbook
Developer-shaped scenarios and the CSV rows they produce.
Catching a release-ZIP size regression in review
A PR ships a new release ZIP. Drop both the old and new artefact to see the jump and what caused it — no build checkout needed.
Dropped: release-1.4.0.zip, release-1.5.0.zip filename,format,sizeBytes,compressedSize,entryCount,ratioPercent,largestEntry,largestEntrySize,encrypted,error release-1.4.0.zip,zip,12582912,9000000,84,28.5%,bundle.js,4194304,false, release-1.5.0.zip,zip,41943040,38000000,85,9.4%,bundle.js.map,29360128,false, Diagnosis: one new entry (85 vs 84), ratio dropped, and largestEntry is now a 28 MB sourcemap that shouldn't ship to production. Reject the PR or exclude the .map from the release bundle.
Accidental encryption on a public release
A release ZIP shouldn't be password-protected. The encrypted column catches it before users hit a password prompt.
release-2.0.0.zip,zip,8388608,7000000,40,16.5%,app,2097152,true, encrypted=true on a public release → broken download for everyone. Re-package without encryption, then re-run the report to confirm encrypted=false. (To see the cipher: /archive-tools/encrypted-archive-detector)
tar.gz artefacts from the pipeline
If your CI emits .tar.gz, the report identifies them but won't enumerate entries — a reminder that ZIP and tarball artefacts give different depth here.
service-a.tar.gz,gz,5242880,0,0,—,,0,false, service-b.tar.gz,gz,6291456,0,0,—,,0,false, frontend.zip,zip,3145728,2400000,310,23.7%,vendor.js,524288,false, The .zip gets full numbers; the tarballs get format+size only. For tarball internals in CI, use tar -tzvf in the pipeline step.
Triaging CI cache bloat across builds
Several cached artefacts are filling the runner. Drop them, sort by sizeBytes, and find the worst offender and what's inside it.
Sort batch-compression-report.csv by sizeBytes desc: build-987.zip,zip,524288000,...,node_modules.tar,... ← 500 MB, bundled deps build-986.zip,zip,104857600,...,dist.js,... build-987 bundled node_modules into the artefact. Fix the cache key or exclude node_modules. Confirm the extension mix with /archive-tools/file-type-breakdown.
The CI-equivalent you'd script (no API)
Because there's no API, here's the Node equivalent for a CI gate — the report is for humans; this is for the pipeline.
// CI artefact-size gate (Node + fflate) — the scriptable equivalent
import { unzipSync } from 'fflate';
import { readFileSync } from 'fs';
const buf = readFileSync('release.zip');
const entries = unzipSync(buf);
const total = Object.values(entries).reduce((n, d) => n + d.length, 0);
if (total > 30 * 1024 * 1024) {
console.error('Artefact too large:', total);
process.exit(1);
}
// Use the browser report for review; use this for the gate.Edge cases and what actually happens
Looking for an API endpoint to call from CI
Not availableThere is no programmatic API for the batch report — it's an interactive page only. For CI gates, script the equivalent with fflate (Node) for ZIP/GZIP or zipinfo/7z l in a shell step. The browser tool is for review-time triage, not pipeline automation.
tar.gz / 7z artefact shows 0 entries
By designEntry stats are read from the ZIP central directory. A .tar.gz or .7z artefact is detected and named (format=gz / 7z) but shows 0 entries and a — ratio. If your release pipeline emits tarballs and you need entry-level numbers, list them with tar -t / 7z l instead.
jar / apk / docx artefacts
SupportedThese are ZIP containers under the hood, so they're detected as zip and get full entry stats — handy for inspecting a built .jar's class count or an .apk's contents. The filename keeps its real extension; the format column reads zip.
Malformed artefact from a failed build
errorA truncated or corrupt artefact (e.g. a build that died mid-write) throws and becomes an error row with the reason, while the rest of the batch completes. That row is itself a signal that the build step produced a bad archive.
Free-tier developer
Pro requiredThe batch report requires a Pro plan; Free shows an upgrade prompt. For an individual dev wanting CI-grade checks for free, scripting fflate yourself is the no-cost route. The browser tool's value is convenience and privacy at review time.
Artefact over 2 GB
400 too largePer-file caps are 500 MB (Pro) and 2 GB (Pro-media/Developer). A multi-GB monorepo artefact exceeds the cap — analyse it with zipinfo on the build host. Most release ZIPs are well under the cap.
Reproducible report across machines
SupportedThe report has no options and runs with fixed behaviour, so the same archive yields the same row on any machine. Note the report describes archives; it doesn't normalise them. If you need reproducible artefact bytes, normalise timestamps first with /archive-tools/timestamp-normalizer, then report.
Comparing artefacts across many subfolders
ManualThe tool reports the files you drop, not a directory tree. Collect the artefacts into one selection. There's no recursive discovery — that's a job for a shell glob feeding a script.
Encrypted dependency bundle
SupportedThe report flags encrypted=true from the central directory without needing the password — useful to catch a bundle that shouldn't be encrypted. It never decrypts. For the cipher, use /archive-tools/encrypted-archive-detector.
Huge entry count (>65,535) or ZIP64
PartialAn artefact with tens of thousands of files that relies on ZIP64 may report a short entryCount or size, because the parser reads 32-bit EOCD fields. For node_modules-style artefacts with enormous file counts, verify with a tool that fully supports ZIP64.
Frequently asked questions
Is there an API or CLI for the batch report?
No — it's an interactive page with no programmatic API. For CI or scripted use, write a small Node script with fflate (ZIP/GZIP) or loop zipinfo/7z l in the shell. The browser tool is best for review-time, human-in-the-loop triage.
Can I use it to gate artefact size in CI?
Not directly, since there's no API to call from a pipeline. Use the scriptable equivalent (fflate computing total entry size) for the gate, and the browser report when a human is reviewing a PR or release.
Does it work on .jar, .apk, or .docx?
Yes — those are ZIP containers, so they're detected as zip and get full entry stats (count, sizes, ratio, largest entry, encryption flag). The filename keeps its real extension; the format column reads zip.
Why does my .tar.gz artefact show 0 entries?
Per-entry numbers come from the ZIP central directory. A tar.gz is detected and named (format=gz) and its sizeBytes is reported, but it has no ZIP central directory, so entryCount, compressedSize, ratioPercent, and largestEntry are empty. List tarball contents with tar -tzvf instead.
Can I diff two releases' reports?
Yes — run the report for each release, download both CSVs, and diff them. A change in sizeBytes, entryCount, largestEntry, or a flipped encrypted flag shows up immediately. Keeping the previous report as a baseline makes regressions obvious.
Will my pre-release artefacts be uploaded?
No. The tool runs in your browser via WebAssembly; artefact bytes never leave your machine. That's safe for internal or unreleased builds — verify with DevTools → Network.
How do I find what's making an artefact big?
Check the largestEntry and largestEntrySize columns for the single biggest file, then use /archive-tools/file-type-breakdown for a by-extension view and /archive-tools/compression-ratio-calculator for per-entry ratios inside that one archive.
Does it need a plan?
Yes — Pro or higher. On Free you'll see an upgrade prompt. Pro covers 20 artefacts per batch at 500 MB each; Pro-media and Developer go to 2 GB per file and 100 / unlimited files.
Is the output stable enough to commit as a baseline?
Yes — the report has no options and fixed behaviour, so the same archive produces the same row. You can commit a known-good report.csv and diff future builds against it. (The tool reports archives; it doesn't modify them.)
Can it catch a sourcemap or binary that snuck into a release?
Often, yes — a sudden drop in ratioPercent (uncompressible binary) or a largestEntry pointing at a .map or vendored binary is the tell. The report surfaces the symptom; you decide whether the file belongs.
What about encrypted artefacts — can it read them?
It reads the central directory and flags encrypted=true without the password, and reports sizes/counts. It never decrypts. To distinguish ZipCrypto from AES, follow up with /archive-tools/encrypted-archive-detector.
Can I make artefacts reproducible with this?
The report describes archives; it doesn't normalise them. For bit-identical artefacts across machines, normalise entry timestamps with /archive-tools/timestamp-normalizer (e.g. to 1980-01-01) and pair with a SHA manifest from /archive-tools/checksum-generator, then run the report to confirm.
How big a batch can I review at once?
20 files on Pro, 100 on Pro-media, unlimited count on Developer — each within the per-file cap (500 MB / 2 GB). The total is bounded by browser memory, so very large batches of large files may be better split.
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.