Portable Network Archive (PNA) is an open archive format and Rust-based toolchain for portable, streamable, compressible, encryptable, and splittable archives.
PNA is inspired by PNG's chunk-oriented data structure. It is designed to work as a practical archive format for command-line tools, libraries, WebAssembly demos, GUI applications, and virtual filesystem integrations.
Specification | CLI and library | Crates.io | Docs.rs | WebAssembly demo
- Portable archive structure: PNA is built around a well-specified chunk layout, making the format easier to extend and implement.
- Compression flexibility: PNA supports zlib, zstd, and xz, including per-file and archive-wide workflows.
- Strong encryption: PNA supports 256-bit AES and 256-bit Camellia for protecting archive contents.
- Splittable archives: The format is designed so large archives can be divided into smaller parts.
- Streamable processing: Archives can be read and written serially, making PNA suitable for streaming and transport-oriented use cases.
- Metadata-minimal by design: A PNA archive can omit everything except the entry name and payload when timestamps, permissions, owner IDs, comments, or other metadata are not needed.
- Attribute preservation when needed: The CLI can preserve permissions, timestamps, extended attributes, and experimental ACL data.
Install the CLI from Crates.io:
cargo install portable-network-archiveCreate, extract, and inspect a PNA archive:
pna create -f archive.pna file1.txt file2.txt
pna extract -f archive.pna
pna list -f archive.pnaPrefer a tar-like interface? The CLI also provides a bsdtar-compatible command surface:
pna compat bsdtar -cf archive.pna file1.txt file2.txt
pna compat bsdtar -xf archive.pna
pna compat bsdtar -tf archive.pna| Repository | What it provides |
|---|---|
| ChanTsune/Portable-Network-Archive | Main Rust workspace: CLI, pna crate, libpna encoding/decoding library, tests, and release tooling. |
| Portable-Network-Archive-Specification | The PNA file format specification, hosted on GitHub Pages. |
| fs | pnafs, a FUSE-based virtual filesystem for mounting PNA archives as disk-like filesystems. |
| wasm-demo | Browser demo for creating and extracting PNA archives with WebAssembly. |
| pna-gui | Tauri, React, and TypeScript GUI for working with PNA archives. |
The format specification covers the archive file structure, chunk ordering rules, compression algorithms, encryption modes, key derivation, data representation, and encoder/decoder recommendations.
Start with the hosted specification:
Contributions, bug reports, interoperability feedback, and implementation experiments are welcome. For code changes, start with the repository that matches the area you want to work on. For format-level questions or proposals, use the specification repository.