How to selective zipper online for free
- Step 1Open the tool — Visit /archive-tools/selective-zipper — no account needed for the free tier. Nothing is uploaded; the page loads the fflate engine into your browser.
- Step 2Drop your folder (or files) — Use the folder picker / drop zone. Because the picker sets
webkitdirectory, you can drop an entire directory and every file is read with its relative path (e.g.project/src/index.ts). You can also drop loose files; the tool accepts multiple inputs in one run. - Step 3Type one glob pattern — Enter a single positive glob in the
globPatternfield (default*= everything). Examples:*.svg,src/**/*.ts,components/Button/**,assets/icon-?.png. The pattern is matched against each file's full relative path; for slash-free patterns like*.txtit also falls back to matching just the basename. - Step 4Run and check the match count — Click Process. fflate builds the ZIP in-tab. The result panel reports
Pattern,Matched(how many files the glob caught), andTotal considered(how many you dropped). IfMatchedis 0 you get a clearNo files matched patternerror — refine the glob and retry. - Step 5Download filtered.zip — Click Download to save
filtered.ziplocally. The archive contains only the matched files, with paths relative to the folder you dropped, compressed with DEFLATE level 6. - Step 6Need the inverse, or no glob? — To zip an entire folder with no filter, use folder-to-zip. To pull matching entries out of an existing archive instead of building one, use selective-extractor. To tune compression level, see compression-level-optimizer.
Glob syntax the Selective Zipper actually supports
The matcher compiles your pattern to a RegExp. These are the only metacharacters with special meaning; everything else (including { } [ ] | . + ( )) is treated as a literal character. Patterns are matched against the full relative path, with a basename fallback for slash-free patterns.
| Token | Meaning | Matches | Does NOT match |
|---|---|---|---|
* | Any run of characters within a single path segment (no /) | *.svg → logo.svg; basename fallback so logo.svg matches even at icons/logo.svg | *.svg does not match a/b.svg as a full-path test — it relies on the basename fallback |
** | Any characters including / (crosses directories); a following / is absorbed | src/**/*.ts → src/app/main.ts, src/index.ts | src/**/*.ts → lib/util.ts (wrong prefix) |
? | Exactly one character that is not / | icon-?.png → icon-1.png | icon-?.png → icon-10.png (two chars) |
{a,b} | Brace expansion is NOT supported — braces are literal | Nothing useful — *.{ts,tsx} looks for a literal {ts,tsx} | *.{ts,tsx} → app.ts (run two passes or use src/** instead) |
!pattern | Negative / exclude globs are NOT supported | n/a — only one positive pattern is applied | Use the inverse workflow: zip all, then extract a keep-pattern |
Tier limits for the Selective Zipper (archive family)
The documented archive-family caps per tier. Note the per-run ENTRY count, not just total size — a folder with thousands of small files is governed by the entry cap as much as the byte cap. The practical ceiling is your browser's memory, since everything runs in-tab via fflate.
| Tier | Max input size | Max entries | 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
Concrete glob patterns and the exact files each one catches from a sample project tree. The matcher is positive-only and segment-aware, so the cookbook focuses on getting the pattern right the first time.
Ship every SVG from an icon folder
A *.svg pattern catches SVGs at any depth thanks to the basename fallback (slash-free patterns also test the file's basename). The output ZIP keeps the original relative paths.
Dropped folder: icons/brand/logo.svg icons/ui/close.svg icons/ui/close.png icons/readme.md Pattern: *.svg filtered.zip: icons/brand/logo.svg icons/ui/close.svg Result panel: Pattern=*.svg Matched=2 Total considered=4
Ship only the TypeScript under src/
src/**/*.ts anchors the prefix to src/, crosses any number of subdirectories with **, and ends in a .ts file. Files outside src/ and non-.ts files are excluded.
Dropped folder: src/index.ts src/app/main.ts src/app/styles.css lib/util.ts README.md Pattern: src/**/*.ts filtered.zip: src/index.ts src/app/main.ts Result panel: Matched=2 Total considered=5
Ship one component directory
components/Button/** grabs everything under one folder — useful for handing off a single component with its styles, tests, and stories.
Pattern: components/Button/** filtered.zip: components/Button/Button.tsx components/Button/Button.test.tsx components/Button/Button.module.css components/Button/index.ts (components/Input/** and others are skipped)
Two extensions = two runs (no brace expansion)
Because {ts,tsx} is treated literally, you cannot write *.{ts,tsx}. Either run the tool twice and combine the ZIPs with archive-merger, or widen the pattern to a directory glob if the folder only contains the files you want.
WRONG: *.{ts,tsx} → Matched=0 (looks for a literal {ts,tsx})
RIGHT (option A — two passes):
Run 1: src/**/*.ts → ts.zip
Run 2: src/**/*.tsx → tsx.zip
Merge with archive-merger
RIGHT (option B):
src/** → everything under src (if that's acceptable)No-match diagnosis
An empty result is almost always a path-prefix mismatch. The matcher tests the full relative path; if you dropped a parent folder, that folder name is part of the path and must be in the pattern.
Dropped folder 'myapp' (so paths are myapp/src/...): Pattern: src/**/*.ts → Matched=0 (paths start with myapp/) Fix: myapp/src/**/*.ts → Matched=2 Or use: **/*.ts (** absorbs any prefix)
Edge cases and what actually happens
No files matched the pattern
ErrorIf zero files match, the tool throws No files matched pattern "<glob>" instead of producing an empty ZIP. The usual cause is a missing path prefix (you dropped a parent folder, so every path starts with that folder name). Use **/*.ext to ignore the prefix, or include the folder name in the pattern.
Dropped an empty selection
ErrorIf no files are provided the tool throws Drop files or a folder first. Re-drop the folder; on some browsers an empty subfolder yields no File entries, which can look like nothing was dropped.
Brace pattern *.{ts,tsx} returns nothing
By designBrace expansion is not implemented; {, }, , are literal characters in the compiled RegExp. *.{ts,tsx} searches for a file literally ending in {ts,tsx}, which never exists. Run two passes or use a directory glob.
Negative/exclude glob like !*.test.ts
By designOnly one positive pattern is applied — there is no exclude syntax. To exclude, do the inverse: zip everything with folder-to-zip, then run selective-extractor with a keep-pattern over that ZIP.
`*` does not cross directories
ExpectedA single * matches within one segment only — it is compiled to [^/]*. src/*.ts matches src/index.ts but not src/app/main.ts. Use ** to cross directories: src/**/*.ts.
Input near the tier cap
Tier capThe free archive tier is documented at 50 MB / 500 entries; Pro is 500 MB / 50,000. Because everything runs in-tab via fflate, the real ceiling is browser memory — a very large matched set can stall or fail the tab. A folder of many small files is governed by the entry count as much as the byte size. Narrow the glob so fewer files are read, or split into several runs and combine with archive-merger.
Relative paths preserved in the ZIP
PreservedBecause the picker uses webkitdirectory, each file carries its webkitRelativePath, which becomes its path inside the ZIP. Drop project/, and entries start at project/..., so the archive round-trips back to the same layout on extract.
Output is always a ZIP named filtered.zip
By designThis tool only writes ZIP via fflate (zipSync, level 6). It does not emit TAR.GZ, GZIP, or 7z. To convert afterward use archive-format-converter or zip-to-tar-gz.
Timestamps reflect processing time
Expectedfflate writes default entry timestamps; original file mtimes are not preserved by this build path. For reproducible/normalised timestamps, post-process with timestamp-normalizer.
Frequently asked questions
Is the Selective Zipper really free and fully in-browser?
Yes. The free tier processes up to 50 MB / 500 entries with no account. Files are read with the browser File API and zipped with fflate inside the tab — nothing is uploaded. Only an anonymous counter (one tool run, no content) is recorded for signed-in dashboard stats, which you can opt out of.
What glob syntax can I use?
* (any chars within one path segment), ** (any chars including /, crosses directories), and ? (one non-slash char). There is no brace {a,b} expansion and no negative/exclude pattern. Other characters — including { } [ ] | . + — are matched literally.
How do I match two extensions like .ts and .tsx?
Run the tool twice — once with src/**/*.ts, once with src/**/*.tsx — and combine the two ZIPs with archive-merger. Brace expansion (*.{ts,tsx}) is not supported and will match zero files.
Why did my pattern match nothing?
Almost always a prefix mismatch. If you dropped a parent folder, every path begins with that folder's name, so src/**/*.ts fails because the real paths are myapp/src/.... Use **/*.ts to ignore the prefix or include the folder name in the pattern.
Does it read an existing ZIP and pull files out?
No — that is the opposite tool. Selective Zipper BUILDS a new ZIP from your local files. To pull matching entries OUT of an existing archive, use selective-extractor with the same glob filter.
What format is the output?
A standard ZIP named filtered.zip, compressed with DEFLATE level 6 via fflate. It opens in Windows Explorer, macOS Finder, unzip, 7-Zip, and any ZIP library.
Are the folder paths preserved inside the ZIP?
Yes. The folder picker captures each file's relative path, which becomes its path in the ZIP. Drop project/, and the archive starts at project/..., so extracting it reproduces your original folder structure.
Can I exclude files instead of including them?
Not directly — only one positive pattern is supported. Do the inverse: zip the whole folder with folder-to-zip, then run selective-extractor with a keep-pattern on that ZIP.
How large a folder can I zip?
Free: 50 MB / 500 entries. Pro: 500 MB / 50,000 entries. Pro-media: 2 GB / 500,000 entries. Developer: 2 GB / 500,000 entries / unlimited batch files. The entry-count limit often binds first for folders of many small files.
Can I set the compression level?
Not in this tool — it uses a fixed DEFLATE level 6. To benchmark or pick a different level, use compression-level-optimizer, or smart-archive-compressor for automatic tuning.
Does it work offline?
Yes — once the page has loaded, the fflate engine is in your browser and the zipping happens locally, so you can disconnect and still process files.
Can I automate it?
GET /api/v1/tools/selective-zipper returns the tool's option schema (just globPattern). Direct server execution is not available (apiAvailable: false); archive tools run browser-only, so automation goes through the paired @jadapps/runner, which drives the tool in a local headless browser. Files never reach JAD servers.
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.