How to build a multi-gb zip online without loading it all into memory
- Step 1Open the tool — Visit /archive-tools/streaming-zip-builder. The Streaming ZIP Builder requires a Pro plan or higher — on Free the Generate action is gated and you'll be prompted to upgrade.
- Step 2Drop your files — Use the Drop files to process zone — it accepts any file type (
accept="*") and multiple files at once. Drag a folder in a Chromium browser to bring its tree in with relative paths; otherwise select individual files. - Step 3Check you're under the tier caps — Each input file must be within your per-job size cap (500 MB Pro, 2 GB Pro+Media / Developer) and the combined entry count under the entry limit (50,000 Pro, 500,000 Pro+Media / Developer). An oversized single file is rejected before packing starts.
- Step 4Click Generate — The button reads Generate (not Process) because this tool builds a new archive. While it runs you'll see a spinning Processing… state; fflate reads each file with
arrayBuffer(), deflates it, and pushes it into the streaming Zip. - Step 5Review the metrics — The result panel shows Files (entry count), Streaming chunks (how many output chunks fflate emitted), original vs output size, and compression percent. Already-compressed inputs (JPEG, MP4, PNG) will show a near-zero or even slightly negative ratio — that's expected.
- Step 6Download streaming.zip — Click Download. The output is always named
streaming.zipwith MIME typeapplication/zip. Rename it after download if you need a specific filename; the tool does not expose an output-name field.
What this tool does — and doesn't
Grounded in lib/archive/archive-processor.ts (streamingZip) and the empty option schema in archive-tool-schemas.ts. The Streaming ZIP Builder has zero configurable options.
| Capability | Supported? | Detail |
|---|---|---|
| Build a ZIP from local files | Yes | Generative tool: reads dropped files, deflates each, writes one streaming.zip |
| Compression level control | No | Fixed at DEFLATE level 6 (fflate.ZipDeflate(..., { level: 6 })). For a tunable level use the Smart Archive Compressor |
| Password / AES encryption | No | fflate has no encryption path here. Use encrypted-zip-creator for AES-256 |
| Output format choice (7z, tar.gz) | No | Always a DEFLATE ZIP. Convert afterward with zip-to-tar-gz if you need a tarball |
| Folder structure | Preserved | Entry path = webkitRelativePath || name — relative paths kept when present |
| Custom output filename | No | Always streaming.zip; rename after download |
| Server upload | No | Browser-only (execution.browserOnly: true); no server-side path exists |
Per-tier limits for the Streaming ZIP Builder
From lib/tier-limits.ts (archive family). minTier is 'pro', so the Free row shows the archive cap that would apply but the tool itself is gated on Free.
| Tier | Per-file size cap | Entries per archive | Files per job (batch) |
|---|---|---|---|
| Free (tool gated) | 50 MB | 500 | 1 |
| Pro | 500 MB | 50,000 | 20 |
| Pro+Media | 2 GB | 500,000 | 100 |
| Developer | 2 GB | 500,000 | unlimited |
Cookbook
Concrete builds with the metrics you should expect. The tool always outputs streaming.zip at DEFLATE level 6.
Pack a directory of logs into one ZIP
Drag a folder of rotated log files into the dropzone. In Chromium each file arrives with its relative path, so the ZIP keeps the folder layout. Text logs compress hard at level 6.
Input (folder dragged in): logs/app-2026-06-10.log 42 MB logs/app-2026-06-11.log 39 MB logs/app-2026-06-12.log 41 MB Result panel: Files: 3 Streaming chunks: 7 Original: 122 MB -> Output: 18.9 MB Compression: 84.5% Download: streaming.zip (entries: logs/app-2026-06-10.log, ...)
Bundle already-compressed media (near-zero ratio is normal)
JPEG, MP4, and MP3 are already entropy-dense, so DEFLATE can't shrink them. The ZIP still bundles them into one downloadable file — useful for handoff — but expect a compression percent close to zero.
Input: clip-01.mp4 210 MB clip-02.mp4 180 MB cover.jpg 4 MB Result panel: Files: 3 Original: 394 MB -> Output: 393.6 MB Compression: 0.1% This is expected — the value here is bundling, not shrinking.
Confirm no upload happens
Open DevTools, switch to the Network tab, then Generate. You will see no outbound request carrying your file bytes — packing is entirely local.
Steps: 1. F12 -> Network tab -> clear 2. Drop files, click Generate 3. Observe: no POST/PUT carrying file data The only network traffic is the lazy-loaded fflate chunk on first use.
Rename the download for delivery
The tool always writes streaming.zip. If your recipient expects a specific name, rename the downloaded file in your OS — the archive contents are unchanged.
Downloaded: streaming.zip Rename to: release-assets-2026-06-12.zip Contents and CRCs are identical; only the filename changed.
Then convert to a tarball if your pipeline needs one
Linux deploy pipelines often want tar.gz. Build the ZIP here, then feed it to the converter — the Streaming ZIP Builder itself only emits ZIP.
Streaming ZIP Builder -> streaming.zip then /archive-tools/zip-to-tar-gz -> streaming.tar.gz Use this two-step path; do not expect a format dropdown here.
Edge cases and what actually happens
Opened on the Free tier
Upgrade requiredThe Streaming ZIP Builder has minTier: "pro". On Free the Generate action is gated behind an upgrade prompt — the older claim that this tool is 'free up to 50 MB' is incorrect; the 50 MB archive cap exists but the tool itself is Pro-and-up.
A single input file exceeds the per-job size cap
RejectedEach file is checked against your tier cap (500 MB Pro, 2 GB Pro+Media / Developer) before packing. An oversized file throws a per-job limit error naming the file and the cap, and nothing is packed. Split the input or upgrade.
Combined entry count over the archive entry limit
Limit exceededThe entry limit is per-archive: 50,000 on Pro, 500,000 on Pro+Media / Developer. Packing tens of thousands of tiny files can hit this before you hit the size cap. Group into fewer entries or move to a higher tier.
No files dropped
RejectedIf you click Generate with an empty dropzone, the processor throws 'Drop one or more files to stream-pack.' Add at least one file.
Output is held in browser memory before download
By designDespite the name, this build accumulates fflate's output chunks into one merged byte array and a single Blob before download — it is not a zero-RAM stream-to-disk writer. Entries are compressed incrementally (so peak compression memory is bounded per entry), but the assembled ZIP still occupies memory. Very large jobs are limited by available browser memory, not just the tier cap.
Re-zipping already-compressed inputs gives ~0% savings
ExpectedJPEG, PNG, MP4, MP3, and existing ZIPs are already compressed; DEFLATE at level 6 can't shrink them and may add a few bytes of overhead. The compression percent near zero is correct behaviour, not a fault.
Folder structure missing in the ZIP
Browser-dependentEntry paths come from webkitRelativePath, which is only populated when the browser supplies it (e.g. dragging a folder in Chromium). Selecting individual files yields flat entries named by file name. This tool is not a dedicated folder picker — for a guaranteed folder tree use folder-to-zip.
Duplicate file names collapse or collide
CautionTwo files that resolve to the same entry path (same name, no distinguishing relative path) produce duplicate entries in the ZIP. Some unzippers keep both, others overwrite. Drop files with distinct relative paths to avoid ambiguity.
Expecting a password prompt
Not supportedThere is no encryption option. The generated ZIP is plaintext. For an AES-256 password-protected archive, use encrypted-zip-creator instead.
Frequently asked questions
Does the Streaming ZIP Builder upload my files?
No. Files are read locally with the File API and packed by fflate in your browser. Open DevTools -> Network and click Generate — you'll see no request carrying your file bytes. The only network call is the one-time lazy load of the fflate library chunk.
Is this tool free?
No. It requires a Pro plan or higher (minTier: "pro"). On Free the Generate action is gated. Pro packs up to 500 MB / 50,000 entries per job; Pro+Media and Developer up to 2 GB / 500,000 entries.
Can I choose the compression level?
No. The Streaming ZIP Builder is fixed at DEFLATE level 6 and exposes no options. If you need to tune the level (0 for stored, up to 9 for maximum), use the Smart Archive Compressor, which has a compressionLevel control.
Can I password-protect the ZIP?
Not with this tool — it produces a plaintext ZIP. For AES-256 encryption use the Encrypted ZIP Creator, which takes a password and applies it via @zip.js/zip.js.
Can it output 7z, RAR, or tar.gz?
No — it only writes a DEFLATE ZIP. To get a tarball, build the ZIP here then convert with zip-to-tar-gz. There is no in-browser writer for true 7z or RAR.
Why is the output always called streaming.zip?
The output filename is hard-coded to streaming.zip (MIME application/zip). There's no output-name field. Rename the file after download if you need a different name — the contents are unaffected.
Does it really keep RAM low?
Partly. It uses fflate's streaming Zip class so entries are compressed one at a time rather than all at once, which keeps per-entry memory bounded. But the assembled output chunks are merged into a single in-memory Blob before download, so the finished ZIP still lives in memory. It is not a stream-to-disk writer — very large jobs are bounded by browser memory.
How many files can I pack at once?
It depends on tier batch limits and the per-archive entry limit: Pro allows 20 files per job and 50,000 entries; Pro+Media 100 files and 500,000 entries; Developer unlimited files and 500,000 entries. The entry limit, not just file count, is the usual ceiling for many small files.
Will my folder structure survive?
Yes when the browser supplies relative paths — entry paths use webkitRelativePath first, then the file name. Dragging a folder in Chromium keeps the tree; selecting loose files produces flat entries. For a guaranteed folder tree, folder-to-zip is purpose-built for it.
Is the output a standard ZIP?
Yes. It's a normal DEFLATE ZIP produced by fflate — open it with unzip, 7-Zip, macOS Archive Utility, Windows Explorer, or any consumer. There's no JAD-specific format or metadata.
Which browsers work?
Any modern browser with WebAssembly-free fflate support — Chrome, Edge, Firefox, Safari, Brave, Opera. fflate is pure JavaScript here, so there's no WASM module to block. Folder drag-drop with relative paths is most reliable in Chromium-based browsers.
Can I call this from a script or CI?
Archive tools are browser-only with no public HTTP API (apiAvailable: false). On paid tiers, runs can be dispatched through the @jadapps/runner (a short-lived headless browser session). For scripted ZIP creation today, the closest local equivalent is fflate in Node.
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.