How to gzip to zip wrapper online for free
- Step 1Open the tool — Visit /archive-tools/gzip-to-zip — no account is required to start the free tier.
- Step 2Confirm you have a single-file .gz — This tool is for one-stream GZIP — a
.log.gz,.sql.gz,.json.gz, or.csv.gz. If your file is a.tar.gzor.tgz(a TAR wrapped in GZIP), stop here and use tar-gz-to-zip instead so the inner files unpack properly. - Step 3Drop the file — Drop the
.gzonto the dropzone or click to browse. The dropzone accepts a single file — if you drop several, only the first is kept. The Free-tier cap of 50 MB per file is checked before any work begins. - Step 4Click Process — fflate decompresses the GZIP stream in WebAssembly, the FNAME header is read for the inner filename, and the payload is re-zipped at level 6. For a typical log file this completes in well under a second.
- Step 5Review the metrics — The result panel shows Source (GZIP), Target (ZIP), the recovered Inner filename, plus Original and Output sizes. Entry count is always 1 — a single-file GZIP carries exactly one payload.
- Step 6Download the ZIP — Click Download ZIP to save the archive locally. The file is named after your input's stem (e.g.
access.zipforaccess.log.gz) and contains one entry under the recovered inner name.
What this tool reads and writes
The GZIP → ZIP wrapper has exactly one input shape and one output shape. Anything outside this is handled by a sibling tool.
| Aspect | Behaviour | Engine / source |
|---|---|---|
| Accepted input | A single-stream GZIP file (.gz) — one compressed payload, no directory | fflate gunzipSync |
| Inner filename | Read from the GZIP FNAME header (FLG bit 0x08); falls back to input name minus .gz | readGzipFilename() in archive-processor |
| Output format | ZIP 2.0 archive with exactly one entry, DEFLATE level 6 | fflate zipSync({...}, { level: 6 }) |
| Output filename | Input stem + .zip (e.g. report.csv.gz → report.csv.zip named report.csv inside) | getStemName() |
| Entry count | Always 1 — a single-file GZIP holds one payload | metrics: entryCount: 1 |
| Options | None — no password, no compression-level control, no glob | SCHEMAS["gzip-to-zip"] = [] |
Free-tier limits vs the upgrade path
Per-job archive limits enforced before processing. The entry-count cap rarely matters here because GZIP-to-ZIP always produces one entry.
| Tier | Max file size | Max entries per archive | Batch files |
|---|---|---|---|
| Free | 50 MB | 500 | 1 |
| Pro | 500 MB | 50,000 | 20 |
| Pro + Media | 2 GB | 500,000 | 100 |
| Developer | 2 GB | 500,000 | unlimited |
Cookbook
Real single-file GZIP inputs and the ZIP they produce. Filenames anonymised; sizes illustrative.
Server log with FNAME header preserved
A rotated nginx log compressed by logrotate, which writes the FNAME field. The tool reads access.log straight from the header, so the ZIP entry keeps the real name even though the upload was renamed in transit.
Input: access.log.2026-06-08.gz (4.1 MB) GZIP FNAME header: "access.log" Process → result metrics: Source: GZIP Target: ZIP Inner: access.log Entries: 1 Output: access.log.2026-06-08.zip └─ access.log (38 MB uncompressed, re-DEFLATEd)
Database dump with no FNAME field
A .sql.gz produced with gzip -n (the -n flag omits the original name). With no FNAME header, the tool strips the .gz suffix from the upload filename instead — you still get a clean inner name.
Input: nightly-dump.sql.gz (12 MB) GZIP FNAME header: (absent — gzip -n) Fallback: strip ".gz" → "nightly-dump.sql" Output: nightly-dump.sql.zip └─ nightly-dump.sql
Already-compressed payload barely shrinks
GZIP and ZIP both use DEFLATE, so re-zipping a payload that was already near its entropy floor gives almost no size change — and ZIP's per-entry headers add a few bytes. This is expected, not a bug.
Input: metrics.json.gz (2.0 MB compressed, 9.4 MB raw JSON) Output: metrics.json.zip (~2.0 MB) Original (the .gz): 2.0 MB Output (the .zip): 2.0 MB + small ZIP overhead → Same DEFLATE algorithm; the size is dominated by the data, not the container.
A .tar.gz dropped here by mistake
This is the single most common misuse. A .tar.gz gunzips to a TAR blob — the tool treats that blob as the one payload and zips it whole, so you get a ZIP containing a .tar, not the individual files. Route these to the TAR.GZ converter instead.
Input: project.tar.gz (a TAR inside a GZIP)
GZIP decompresses to: project.tar (one blob)
Output: project.zip
└─ project.tar ← NOT the inner files!
Fix: use /archive-tools/tar-gz-to-zip → unpacks the TAR
into individual entries inside the ZIP.Renamed file that isn't actually GZIP
If a file ends in .gz but its first two bytes are not the GZIP magic 1F 8B, fflate's gunzipSync throws and the run fails with an error. Confirm the true format first.
Input: data.gz (actually a renamed ZIP) fflate.gunzipSync → throws "invalid gzip data" Result: error in the red panel. Diagnose: run /archive-tools/auto-format-detector → reports magic bytes "50 4B 03 04" = ZIP, not GZIP.
Edge cases and what actually happens
Input is a single-file .gz with FNAME header
SupportedThe canonical happy path. fflate decompresses the stream and the inner ZIP entry takes its name from the GZIP FNAME field. Output is a one-entry ZIP. This is exactly what the tool is built for.
GZIP produced with gzip -n (no inner name)
PreservedWhen the FNAME header is absent, the tool derives the entry name by stripping the .gz suffix from the upload filename — dump.sql.gz becomes dump.sql. If even that yields an empty string, the entry is named data. Nothing fails; you just get the fallback name.
A .tar.gz or .tgz dropped in
By design (wrong tool)A .tar.gz gunzips to a single TAR blob, which this tool zips as one entry — so the ZIP contains a .tar, not the individual files. This is correct behaviour for a single-stream wrapper but almost never what you want. Use tar-gz-to-zip, which parses the TAR and writes each file as its own ZIP entry.
File over the tier size cap
Rejected (tier limit)The client checks size before processing. On Free, any .gz over 50 MB is blocked with a message naming the tier and limit. Raise the cap to 500 MB (Pro) or 2 GB (Pro+Media/Developer). Note the limit is on the compressed .gz you upload, not the decompressed payload.
File ends in .gz but isn't GZIP
Invalid inputfflate's gunzipSync validates the GZIP magic bytes (1F 8B). A renamed ZIP/RAR/7Z hitting this tool throws "invalid gzip data" and the run errors out. Run auto-format-detector to confirm the true format, then pick the matching tool.
Truncated or partially-downloaded .gz
ErrorGZIP carries a CRC32 and length trailer. If the stream was cut off mid-download, decompression fails or the trailer check mismatches and the run errors. Re-download the file; there is no partial-recovery path for GZIP in this tool.
Re-zipping already-compressed data shows no savings
ExpectedGZIP and ZIP both use DEFLATE, so a payload already near its entropy floor will not shrink further — and ZIP's local + central headers add a small fixed overhead. The output can be marginally larger than the input .gz. That is normal and not an error.
Multiple files dropped at once
First file onlyThis is a single-file tool. If you drop several files, the dropzone keeps only the first and discards the rest. To convert many .gz files in one run, this tool is not the right fit — there is no batch mode here for conversion.
Frequently asked questions
Does the GZIP → ZIP wrapper upload my file?
No. The .gz is read with the browser File API and decompressed in WebAssembly inside your tab. Open DevTools → Network during a run — there are zero outbound requests carrying the file. The result panel even shows a "0 bytes uploaded" badge.
What is the maximum file size?
Free: 50 MB. Pro: 500 MB. Pro + Media: 2 GB. Developer: 2 GB. The cap applies to the compressed .gz you upload, checked before processing begins. There is also a per-archive entry-count limit (500 Free, up to 500,000 on higher tiers), but it never bites here because GZIP-to-ZIP always produces exactly one entry.
What if my .gz is actually a .tar.gz?
Use tar-gz-to-zip instead. This tool treats the GZIP as a single stream, so a .tar.gz ends up as a ZIP containing one .tar blob rather than the individual files. The TAR.GZ converter unpacks the TAR and writes each file as its own ZIP entry.
What name does the file get inside the ZIP?
The tool reads the inner name from the GZIP FNAME header. If that field is missing (common with gzip -n), it strips the .gz suffix from your upload's filename instead — so report.csv.gz becomes report.csv inside the ZIP.
Are there any options to configure?
No. This tool has an empty options schema — no password, no compression-level slider, no glob filter. Compression is fixed at DEFLATE level 6, the universal speed/size sweet spot. You just drop and click Process.
Why convert at all instead of just decompressing the .gz?
Some upload forms, ticketing systems, and Windows users only accept .zip. Wrapping the decompressed payload as a ZIP keeps it a single, double-clickable attachment that opens natively in Explorer and Finder without a .gz handler installed.
Will the output open everywhere?
Yes. The output is a standard ZIP 2.0 archive — filenames stored UTF-8, paths with forward slashes, a normal central directory. Windows Explorer, macOS Archive Utility, 7-Zip, Keka, and unzip all read it. There is no JAD-specific wrapper or metadata.
Will the ZIP be smaller than the original .gz?
Usually not. GZIP and ZIP both compress with DEFLATE, so re-zipping already-compressed data gives almost identical size, and ZIP's headers add a few bytes of overhead. Use compression-ratio-calculator if you want a per-file ratio breakdown of the result.
Which browsers are supported?
Any browser with WebAssembly and the File API — Chrome, Edge, Firefox, Safari, Brave, and Opera, on desktop and mobile. Very large files on mobile may exceed device memory; for those, run on desktop or upgrade for the streaming-friendly tiers.
Can I verify the output is intact?
Yes. Run archive-integrity-tester on the resulting ZIP to confirm every entry's stored CRC32 matches, or checksum-generator to produce a SHA-256 manifest of the contents.
Does this work offline once loaded?
Once the page and its WASM chunks have loaded, the conversion itself needs no network — everything runs locally. A fresh page load still requires fetching the app assets.
What if I have many .gz files to convert?
This conversion tool handles one file per run. If you need to bundle many local files into one archive, folder-to-zip or smart-archive-compressor accept multiple files; for converting between archive formats, archive-format-converter covers ZIP, TAR.GZ, and GZIP in any direction.
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.