JSZip
Create, read, and edit ZIP files directly in JavaScript, in the browser or Node.js.
Repository Health
Technical Analysis
JSZip is a JavaScript library for creating, reading, and editing ZIP archives without any server-side dependency. It exposes a chainable file/folder API for building an archive in memory, plus Promise- and stream-based methods for generating the final ZIP as a blob, base64 string, typed array, or Node buffer/stream.
The same API also reads existing ZIP files back into that file/folder tree, with optional CRC32 integrity checking, so archives can be created, inspected, and re-packaged using one consistent interface across browser and Node.js environments.
What You Get
- A dependency-light JSZip class for building ZIP archives in-memory from strings, binary data, base64, ArrayBuffers, Blobs, or Node streams
- A loadAsync() reader that parses existing ZIP files, including nested folders and CRC32 verification, back into the same file/folder API
- Multiple output formats — blob, base64, Uint8Array, ArrayBuffer, or Node Buffer/stream — via generateAsync()/generateNodeStream()
- Bundled TypeScript type definitions (index.d.ts) for editor autocomplete with no separate @types package required
- A prebuilt browser bundle (dist/jszip.min.js) alongside the Node/CommonJS entry point
Common Use Cases
- Bundling multiple generated files (reports, exports, images) into a single downloadable ZIP in the browser
- Reading uploaded ZIP archives client-side to preview or extract their contents without a server round-trip
- Packaging build artifacts or generated documents as ZIPs in Node.js scripts and CI pipelines
- Implementing “export all as ZIP” features in web apps, such as downloading a folder of user files at once
Under The Hood
Architecture The JSZip constructor (lib/index.js) creates an instance with a null-prototype files map; prototype methods from lib/object.js (file, folder, forEach, filter, remove, generateInternalStream/generateAsync/generateNodeStream) operate on that tree. Loading an existing archive flows through lib/load.js, which uses lib/reader/* (ArrayReader, Uint8ArrayReader, NodeBufferReader, StringReader, dispatched via readerFor.js) to parse ZipEntries (lib/zipEntries.js, zipEntry.js) and optionally verify CRC32 via lib/stream/Crc32Probe.js. Output generation runs through lib/generate/index.js and ZipFileWorker.js, which chain GenericWorker-derived stream stages (lib/stream/GenericWorker.js, DataWorker.js, DataLengthProbe.js, ConvertWorker.js, StreamHelper.js) via .pipe() — a hand-rolled stream abstraction that mirrors Node streams but works unmodified back to IE6, ultimately exposed through StreamHelper’s accumulate()/toNodejsStream() for Promise or stream consumption.
Tech Stack Runtime dependencies are minimal: pako (~1.0.2) for DEFLATE/INFLATE compression, lie (~3.3.0) as an ES5-safe Promise polyfill exposed via lib/external.js, readable-stream (~2.3.6) for the Node stream shim (swapped for a browser-specific file via the package.json browser field), and setimmediate. Build tooling is Grunt plus Browserify for the bundled browser build (dist/jszip.min.js), with hand-written TypeScript declarations (index.d.ts) checked via tsc in the test script rather than the library itself being authored in TypeScript. The source is CommonJS, ES5-style (var, no destructuring) — a reflection of the library’s long history (created 2009) rather than neglect, though it does mean there’s no native ESM entry point.
Code Quality Test coverage is broad: test/asserts/ holds one file per feature area (file.js alone has 76 assertions, plus generate.js, load.js, stream.js, permissions.js, unicode.js, and more), run via QUnit in both Node (test-node) and real browsers through Playwright (test-browser), plus a tsc pass validating the type definitions against the JS API. ESLint runs with eslint:recommended plus stricter rules (eqeqeq, curly, no-caller, guard-for-in, 4-space indent, double quotes), enforced in CI on every push/PR (.github/workflows/main.yml). Error handling is consistent but dated — explicit Error throws with upgrade-guide messages for removed 2.x methods, Promise .catch/worker error events rather than typed errors — and the project’s own health signals show low recent commit and maintenance activity despite the large existing test surface.
API Design The public API is small and chainable: new JSZip(), .file()/.folder()/.remove() for the tree, .generateAsync()/.generateNodeStream() for output, and static JSZip.loadAsync() for reading — all reachable from a single default export with almost no setup ceremony (three lines to zip a file and produce a blob, per the README example). Type definitions ship inside the package (index.d.ts), giving IDE autocomplete with no separate @types install. The main friction is legacy holdovers: removed synchronous .generate()/constructor-with-args paths throw pointed but easy-to-miss errors directing users to the upgrade guide, and the full documentation lives on an external GitHub Pages site (stuk.github.io/jszip) rather than in the README, so newcomers need to leave the package to find anything past the basic example.
Used by 66 apps in this directory
Papra
Bookmarks Archiving
Self-hosted document archiving with email ingestion, OCR full-text search, and pluggable storage — store once, find anything.
PeerTube
Social Media
A federated, ActivityPub-based video hosting platform built by Framasoft — self-hostable instances interconnect into a network with no vendor lock-in, P2P-assisted streaming, and no ads.
qm
AI Agents · AI Assistants · Automation
An open-source, multiplayer agent harness that gives every employee and every room in a company its own scoped memory, sandbox, and AI agent — in Slack and on the web.
Rivet
AI Agents · Developer Tools
Stateful actors as a primitive for AI agents, real-time collaboration, and durable execution — with in-memory state, WebSockets, queues, and scheduling built in.
Rowy
Databases · Low Code Platforms
Manage Firestore data in an Airtable-like spreadsheet UI and build Cloud Functions workflows directly in your browser—on your own GCP project.
Rybbit
Analytics
Open-source, privacy-friendly web and product analytics with cookieless tracking, session replays, funnels, and real-time dashboards — a self-hostable alternative to Google Analytics.
Screenity
Productivity · Video Editors
Free, privacy-first Chrome screen recorder with real-time annotation, AI camera blur, and a built-in video editor — no sign-in or limits required.
Skrun
AI Agents
An open, self-hostable, multi-model agent runtime that deploys any agent skill as an API via POST /run — an open-source alternative to Claude Managed Agents and Google's Gemini Enterprise Agent Platform.
Stirling PDF
Digital Signiture · Productivity
The open-source PDF platform you can run anywhere — edit, convert, sign, and automate PDFs without sending files to external servers.