tar

The battle-tested tar archive library that powers npm itself, with hardened extraction against path-traversal and symlink attacks.

Library
npm
v7.5.22
924 stars
BlueOak-1.0.0

Repository Health

Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum. How we score it →
49 /100 Fair
Development Activity 16
Maintenance 20
Community 80
Maturity 60
Momentum 20

Technical Analysis

AI-assessed by reading the actual repository — architecture, code quality, innovation, and documentation. How we score it →
81 /100 Excellent
Architecture 82
Code Quality 85
Innovation 78
Learning Curve 80

tar (published to npm as tar, developed as node-tar) is a fast, full-featured implementation of the tar archive format for Node.js. It mirrors the behavior of the Unix tar(1) command, exposing the same five core operations — create, extract, list, replace, and update — through both a low-level streaming API and a high-level convenience API with single-letter aliases familiar to anyone who has used the command line tool.

Because it is the archive library underneath npm’s own package installation pipeline, tar has been hardened over more than a decade against a wide range of filesystem attacks: path-traversal entries, symlink-based writes outside the extraction target, absolute path abuse, and malicious device/FIFO entries are all rejected or neutralized by default. It supports gzip, brotli, and zstd compression natively via minizlib, and every operation can run synchronously, asynchronously with callbacks, as a Promise, or as a raw stream depending on how it’s invoked.

What You Get

  • Five core operations — create (c), extract (x), list (t), replace (r), and update (u) — each usable as sync, async/Promise, or stream, mirroring tar(1) CLI semantics
  • Security-hardened extraction: rejected .. path traversal, blocked symlink/hardlink escapes outside the extraction root, absolute paths rewritten to relative, and device/FIFO entries never extracted
  • Built-in gzip, brotli, and zstd compression/decompression via minizlib, auto-detected on read and configurable on write
  • A path-reservation system that safely serializes conflicting filesystem operations during parallel extraction (e.g. a file being swapped for a symlink mid-write)
  • Granular warn/error event system with typed error codes (TAR_ENTRY_INVALID, TAR_BAD_ARCHIVE, etc.) so callers can distinguish recoverable per-entry issues from fatal archive corruption
  • Full TypeScript types for every option surface, published as dual ESM/CJS builds via tshy

Common Use Cases

  • Packaging and unpacking npm-style package tarballs during install/publish workflows
  • Backing up or archiving directory trees to a .tgz/.tar file from a Node.js build or deploy script
  • Extracting third-party or user-uploaded tarballs safely in a server context where the archive source isn’t trusted
  • Streaming tar creation directly into an HTTP response or another pipe without touching disk
  • Replacing or appending entries in an existing archive without a full rebuild

Under The Hood

Architecture — tar is organized as a set of composable Minipass transform/writable streams rather than a monolithic library: Pack/PackSync (src/pack.ts) turn a list of paths into a tar byte stream by walking the filesystem and delegating each entry to WriteEntry (src/write-entry.ts); Parser (src/parse.ts) is the inverse, a writable stream that consumes tar bytes and emits ReadEntry objects (src/read-entry.ts) as it decodes 512-byte headers via the Header/Pax classes (src/header.ts, src/pax.ts); Unpack/UnpackSync (src/unpack.ts, ~1,100 lines) subclass the parser and materialize entries onto the filesystem, coordinating a PathReservations queue (src/path-reservations.ts) so concurrent async writes to related paths don’t race. The five public verbs in create.ts, extract.ts, list.ts, replace.ts, and update.ts are thin orchestrators built with a shared makeCommand helper (src/make-command.ts) that normalizes the sync/async/callback/Promise/stream calling conventions into one implementation per verb.

Tech Stack — Written entirely in TypeScript (44.7% of source, compiled JS 55.2%) and built with tshy to publish dual ESM/CommonJS output plus .d.ts types from a single source tree. Runtime dependencies are all from the same maintainer’s ecosystem: minipass (the stream primitive everything is built on), minizlib (gzip/brotli/zstd via Node’s zlib bindings), @isaacs/fs-minipass (filesystem streams), chownr (recursive ownership changes), and yallist (linked-list queue used internally). No external framework dependencies; targets Node.js >=18.

Code Quality — Tested with tap across 30+ dedicated test files (141+ individual test cases found in test/), including targeted regression tests for named security advisories (ghsa-8qq5-rm4j-mr97.ts, ghsa-r6q2-hw4h-h46w.ts), fixture-driven header/parse tests, and a .taprc configured with typecheck: true and a coverage map (map.js). Linting is enforced via oxlint plus oxlint-tsgolint for type-aware rules, formatting via prettier, and the codebase uses symbol-keyed private-ish fields (Symbol('...')) throughout its stream classes for encapsulation instead of relying on TS private alone — a defensive pattern consistent with the project’s security-first posture.

API Design — The library deliberately mirrors tar(1) CLI semantics: every high-level function accepts (options, paths, callback?), single-letter aliases (c/x/t/r/u) map directly to Unix tar flags, and the same option object supports sync: true, a file path, or neither (returning a stream) — one mental model covers all five operations. The cost of that flexibility is a large, densely-typed TarOptions interface (500+ lines in options.ts) with many optional fields and overload variants, which raises the learning curve for anyone who wants more than the common create/extract path shown in the README’s copy-paste examples.

Used by 52 apps in this directory

TypeScript
62%
EPL-2.0

Huly Platform

Collaboration · Project Management · Team Chat

27,978

Open-source all-in-one workspace that replaces Linear, Jira, Slack, and Notion for product and engineering teams.

View details
90
Repo Health
86
Technical
62
Dependency
Built with
TypeScript 62%
Svelte 34%
Updated 1 weeks ago
TypeScript
91%
Apache 2.0

HyperFrames

AI Design Tools · AI Development

70,938

Turn plain HTML and CSS into deterministic, pixel-perfect MP4 videos — authored by humans or AI agents, rendered by headless Chrome and FFmpeg.

View details
84
Repo Health
83
Technical
65
Dependency
Built with
TypeScript 91%
Updated 6 days ago
Rust
56%
Other

Jan

AI Assistants

45,052

Run LLMs 100% locally with full privacy, or connect to cloud AI — your machine, your data, your control.

View details
90
Repo Health
81
Technical
65
Dependency
Built with
Rust 56%
TypeScript 40%
Updated 6 days ago
TypeScript
66%
MIT

Jitsu

Data Engineering

5,110

Open-source, fully-scriptable data ingestion engine that streams events from web, apps, and APIs to any data warehouse in real time.

View details
89
Repo Health
79
Technical
66
Dependency
Built with
TypeScript 66%
Go 32%
Updated 1 weeks ago
TypeScript
77%
Other

Joplin

Note Taking

56,853

The privacy-first, open-source note-taking app with end-to-end encrypted sync, AI assistance, and a powerful plugin ecosystem across every platform.

View details
93
Repo Health
87
Technical
60
Dependency
Built with
TypeScript 77%
JavaScript 14%
Updated 1 weeks ago
TypeScript
98%
Other

Kibana

Analytics · Monitoring

21,338

Your open source window into the Elastic Stack — query, visualize, and act on data stored in Elasticsearch with real-time dashboards, AI-assisted search, and automated alerting.

View details
98
Repo Health
87
Technical
63
Dependency
Built with
TypeScript 98%
Updated 6 days ago
TypeScript
98%
MIT

Kimi Code CLI

AI Agents · AI Code Assistants · Developer Tools

7,983

A single-binary, terminal-native coding agent that reads, edits, and runs code end to end, built by Moonshot AI for Kimi models but pluggable with Anthropic, OpenAI, and Google providers too.

View details
83
Repo Health
87
Technical
67
Dependency
Built with
TypeScript 98%
Updated 1 weeks ago
TypeScript
98%
MPL 2.0

Logto

Authentication

14,769

Open-source auth infrastructure for SaaS and AI apps with OIDC, SAML, and RBAC

View details
92
Repo Health
83
Technical
63
Dependency
Built with
TypeScript 98%
Updated 1 weeks ago
JavaScript
55%
Other

Lokus

Knowledge Management · Note Taking

829

Local-first note-taking with graph view, canvas & AI plugins—your Markdown files, zero telemetry, blazing-fast Rust performance.

View details
75
Repo Health
75
Technical
64
Dependency
Built with
JavaScript 55%
HTML 21%
Rust 12%
Updated 2 months ago

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack
Join 750+ subscribers