Package Information
Documentation
n8n-nodes-universal-archive
Universal Archive is a self-contained n8n Community Node that extracts files
from common archive formats. It runs the archive engine in a worker so archive
processing does not block the node's main JavaScript event loop.
Self-contained distribution
- No 7-Zip, WinRAR, or other system executable is required.
- No runtime download is performed.
- No environment variable is required.
- The JavaScript/WebAssembly runtime and its licenses are included in the npm
package.
The package contains the MIT-licensed node code, the bundled 7z-wasm
JavaScript/WASM runtime, the upstream LGPL notice, and the unRAR restriction
notice. Review LICENSE.md and
THIRD_PARTY_NOTICES.md before redistribution.
Installation
This package is for self-hosted n8n. In n8n, open Settings > Community
Nodes, choose Install, enter n8n-nodes-universal-archive, acknowledge
the community-node warning, and complete the installation. Restart n8n if the
instance asks you to do so. The node then appears as Universal Archive in the
node picker.
Community Nodes installation requires the package to be published to npm. For
pre-publication testing, install the generated local tarball in the n8n user
folder's nodes package directory and restart that disposable n8n instance.
Parameters
| Parameter | Default | Meaning |
|---|---|---|
| Operation | Extract |
Extract the regular files in one archive layer. |
| Input Binary Field | file |
Binary property on the incoming item that holds the archive. You may instead supply an expression that resolves to a binary object from another node, e.g. {{ $('Get file').item.binary.file }}, when intermediate nodes have dropped the binary. |
| Password | Empty | Password for an encrypted archive; expressions are supported. |
| Output Binary Field | data |
Binary property created for each extracted file. |
| Max Files | 0 |
Maximum number of extracted files. |
| Max Single File MB | 0 |
Maximum size of one extracted file. |
| Max Total Size MB | 0 |
Maximum combined extracted size. |
For every resource setting, 0 means unlimited. Set finite limits for
untrusted input. With unlimited decompression, a large or highly compressed
archive can exhaust the n8n worker's memory or other resources before the node
can return a structured error.
Input and output
The node expects an n8n item with an archive in the configured binary field.
For example, with the default file field:
{
"json": {
"source": "upload",
"archivePassword": "secret"
},
"binary": {
"file": {
"fileName": "documents.zip",
"mimeType": "application/zip",
"data": "<binary data managed by n8n>"
}
}
}
Use an expression instead of hard-coding a password when it is supplied by
the workflow, for example:
{{ $json.archivePassword }}
or from a specifically named upstream node:
{{ $('Archive Secrets').item.json.password }}
The expression is evaluated separately for each input item. An empty password
is valid for an unencrypted archive.
Each extracted regular file becomes one output item. The input JSON is
preserved, archive and entry metadata are added, and the file is placed in the
configured output binary field:
{
"json": {
"source": "upload",
"archivePassword": "secret",
"archive": {
"fileName": "documents.zip",
"format": "zip",
"encrypted": true
},
"entry": {
"path": "reports/summary.txt",
"fileName": "summary.txt",
"extension": "txt",
"size": 128
}
},
"binary": {
"data": {
"fileName": "summary.txt",
"mimeType": "text/plain",
"data": "<binary data managed by n8n>"
}
}
}
Directory entries do not produce output items. When Continue On Fail is
enabled, a failed input produces one item whose JSON containserror: { code, message } instead of extracted binary data.
Tested formats
Support claims are limited to the compatibility matrix exercised by the
package's integration tests:
| Format | Tested variants |
|---|---|
| ZIP | Store, Deflate, AES-128, AES-256 (method 99), mixed UTF-8 and legacy Chinese filenames |
| 7z | Plain, encrypted with encrypted headers |
| RAR | RAR4 plain, RAR5 plain, RAR5 encrypted |
| TAR | Plain TAR |
| TAR.GZ | GZIP containing a TAR archive |
| GZIP | Single compressed stream |
| BZIP2 | Single compressed stream |
| XZ | Single compressed stream |
Recognition is based on archive content rather than the input filename
extension; the matrix also verifies these cases with a .bin filename.
Distribution verification used n8n 2.32.6, Node.js 24.14.1, and7z-wasm 1.2.0. The verified n8n-nodes-universal-archive-0.1.0.tgz
SHA256 isA8EBF389209D187CCAB50D58F70BEC23E0FCF7DEA3AFEE35A4B0FC7A3AFDBAF6.
Stable error codes
| Code | Meaning |
|---|---|
INPUT_BINARY_MISSING |
The configured input binary field is absent. |
ARCHIVE_FORMAT_UNSUPPORTED |
The bytes do not identify a supported archive, or the runtime cannot handle the format. |
ARCHIVE_PASSWORD_REQUIRED |
The archive is encrypted and no password was supplied. |
ARCHIVE_PASSWORD_INVALID |
The supplied password cannot decrypt the archive. |
ARCHIVE_CORRUPT |
The archive is damaged or extraction output does not match its listing. |
ARCHIVE_PATH_UNSAFE |
An entry has an absolute, traversal, duplicate, symbolic-link, hard-link, or otherwise unsafe path/type. |
ARCHIVE_LIMIT_EXCEEDED |
A configured file-count, single-file-size, or total-size limit was exceeded. |
ARCHIVE_ENGINE_FAILED |
The bundled archive engine failed unexpectedly. |
Without Continue On Fail, the code is exposed as the n8n node error
description. With Continue On Fail, it is returned in json.error.code.
Limitations and safety behavior
- Split and multi-volume archives are not supported. Supply one complete
archive as one binary item. - Symbolic links, hard links, unsafe paths, duplicate normalized paths, and
unsafe extracted file types are rejected rather than emitted. - Extraction is non-recursive. One node execution extracts one archive layer.
For example, extractingbundle.tar.gzemitsbundle.tar; add anotherUniversal Archivenode if the workflow should extract the TAR layer. - ZIP filenames use the UTF-8 flag or Info-ZIP Unicode Path metadata when
available. For legacy entries without Unicode metadata, standard CP437 is
preserved and GB18030/GBK names with a strong Chinese signal are recovered
from the central directory. When 7-Zip's listing and extracted filesystem
spell such a path differently, files are correlated by validated size and
CRC rather than by filename alone. - Files are materialized in memory by the JS/WASM runtime and then returned as
n8n binary data. Configure finite limits and worker resources accordingly. - Password diagnostics are redacted before unexpected engine failures are
exposed, but workflows should still avoid placing secrets in ordinary JSON
unless that handling is intentional.
Development
npm install
npm test
npm run build
npm run lint
Create and inspect a local release artifact without publishing it:
npm pack --dry-run --json
npm pack
Running npm publish is a separate, explicitly authorized release action.