pompelmi 0.29.1 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +171 -182
- package/dist/pompelmi.cjs +2 -2
- package/dist/pompelmi.cjs.map +1 -1
- package/dist/pompelmi.esm.js +2 -2
- package/dist/pompelmi.esm.js.map +1 -1
- package/dist/types/utils/threat-intelligence.d.ts +12 -1
- package/package.json +87 -36
package/README.md
CHANGED
|
@@ -34,24 +34,8 @@
|
|
|
34
34
|
<br/>
|
|
35
35
|
<a href="https://www.producthunt.com/products/pompelmi"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1010722&theme=light" alt="pompelmi - Secure File Upload Scanning for Node.js | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>
|
|
36
36
|
<br/>
|
|
37
|
-
<a href="https://www.
|
|
38
|
-
<a href="https://
|
|
39
|
-
<a href="https://medium.com/node-weekly/node-weekly-issue-145-07f40a2cd3f3"><img alt="Featured in Node Weekly #145" src="https://img.shields.io/badge/featured-Node%20Weekly%20%23145-FF6600?logo=node.js"></a>
|
|
40
|
-
<a href="https://bytes.dev/archives/429"><img alt="Featured in Bytes #429" src="https://img.shields.io/badge/featured-Bytes%20%23429-111111"></a>
|
|
41
|
-
<a href="https://app.daily.dev/posts/pompelmi"><img alt="Featured on daily.dev" src="https://img.shields.io/badge/featured-daily.dev-CE3DF3?logo=dailydotdev"></a>
|
|
42
|
-
<a href="https://app.daily.dev/posts/q7cusr92j"><img alt="Featured on daily.dev" src="https://img.shields.io/badge/featured-daily.dev-CE3DF3?logo=dailydotdev"></a>
|
|
43
|
-
<a href="https://dev.to/sonotommy/secure-nodejs-file-uploads-in-minutes-with-pompelmi-3jfe"><img alt="Featured on DEV.to" src="https://img.shields.io/badge/featured-DEV.to-0A0A0A?logo=devdotto"></a>
|
|
44
|
-
<br/>
|
|
45
|
-
<a href="https://www.helpnetsecurity.com/2026/02/02/pompelmi-open-source-secure-file-upload-scanning-node-js/"><img alt="Featured on HelpNet Security" src="https://img.shields.io/badge/featured-HelpNet%20Security-FF6B35"></a>
|
|
46
|
-
<a href="https://risky.biz/risky-bulletin-researcher-scores-250-000-for-chrome-bug/"><img alt="Mentioned in Risky.Biz" src="https://img.shields.io/badge/mentioned-Risky.Biz-DC143C"></a>
|
|
47
|
-
<a href="https://www.anquan114.com/archives/6969"><img alt="Featured on AnQuan114" src="https://img.shields.io/badge/featured-AnQuan114-FF4500"></a>
|
|
48
|
-
<a href="https://www.toptool.app/ru/product/pompelmi"><img alt="Listed on TopTool.app" src="https://img.shields.io/badge/listed-TopTool.app-4A90E2"></a>
|
|
49
|
-
<a href="https://alternativeto.net/software/pompelmi/"><img alt="Listed on AlternativeTo" src="https://img.shields.io/badge/listed-AlternativeTo-7B68EE"></a>
|
|
50
|
-
<br/>
|
|
51
|
-
<a href="https://www.tasc.tw/tw/news-detail/pompelmi-open-source-secure-file-upload-scanning-node-js%EF%BC%8F?kind=28"><img alt="Featured on TASC Taiwan" src="https://img.shields.io/badge/featured-TASC%20Taiwan-1E90FF"></a>
|
|
52
|
-
<a href="https://webboard-nsoc.ncsa.or.th/topic/2583/cyber-threat-intelligence-03-february-2026"><img alt="Featured on NCSA Thailand" src="https://img.shields.io/badge/featured-NCSA%20Thailand-FF69B4"></a>
|
|
53
|
-
<a href="https://www.linkedin.com/posts/helpnetsecurity_scanner-software-opensource-activity-7424044015076970496-Nt_u/"><img alt="Featured on LinkedIn" src="https://img.shields.io/badge/featured-LinkedIn-0A66C2?logo=linkedin"></a>
|
|
54
|
-
<a href="https://x.com/TheCyberSecHub/status/2018213695143419937"><img alt="Mentioned on X/Twitter" src="https://img.shields.io/badge/mentioned-X%2FTwitter-000000?logo=x"></a>
|
|
37
|
+
<a href="https://www.helpnetsecurity.com/2026/02/02/pompelmi-open-source-secure-file-upload-scanning-node-js/"><img alt="Featured on HelpNet Security" src="https://img.shields.io/badge/🔒_FEATURED-HelpNet%20Security-FF6B35?style=for-the-badge"></a>
|
|
38
|
+
<a href="https://snyk.io/test/github/pompelmi/pompelmi"><img alt="Secured by Snyk" src="https://img.shields.io/badge/🛡️_SECURED_BY-Snyk-4C4A73?style=for-the-badge&logo=snyk"></a>
|
|
55
39
|
<br/>
|
|
56
40
|
<a href="https://github.com/sorrycc/awesome-javascript"><img alt="Mentioned in Awesome JavaScript" src="https://awesome.re/mentioned-badge.svg"></a>
|
|
57
41
|
<a href="https://github.com/dzharii/awesome-typescript"><img alt="Mentioned in Awesome TypeScript" src="https://awesome.re/mentioned-badge-flat.svg"></a>
|
|
@@ -71,13 +55,11 @@
|
|
|
71
55
|
</p>
|
|
72
56
|
|
|
73
57
|
<p align="center">
|
|
74
|
-
Scan files before they hit disk • Keep user data private • Zero cloud dependencies
|
|
58
|
+
Scan files before they hit disk • <strong>Keep user data private</strong> • <strong>Zero cloud dependencies</strong>
|
|
75
59
|
</p>
|
|
76
60
|
|
|
77
61
|
---
|
|
78
62
|
|
|
79
|
-
---
|
|
80
|
-
|
|
81
63
|
<!-- Badges Section -->
|
|
82
64
|
<p align="center">
|
|
83
65
|
<a href="https://www.npmjs.com/package/pompelmi"><img alt="npm version" src="https://img.shields.io/npm/v/pompelmi?label=version&color=0a7ea4&logo=npm"></a>
|
|
@@ -121,7 +103,7 @@
|
|
|
121
103
|
|
|
122
104
|
## 🎬 Demo
|
|
123
105
|
|
|
124
|
-
|
|
106
|
+

|
|
125
107
|
|
|
126
108
|
**Want to try it now?** Check out our [live examples](./examples/) or install and run locally:
|
|
127
109
|
|
|
@@ -135,8 +117,8 @@ npm i pompelmi @pompelmi/express-middleware
|
|
|
135
117
|
|
|
136
118
|
**pompelmi** provides enterprise-grade file scanning for Node.js applications:
|
|
137
119
|
|
|
138
|
-
- **🔒 Privacy-First Architecture** — All scanning happens in-process. No cloud calls, no data leaks
|
|
139
|
-
- **⚡ Lightning Fast** — In-process scanning with zero network latency
|
|
120
|
+
- **🔒 Privacy-First Architecture** — All scanning happens in-process. **No cloud calls, no data leaks.** Your files never leave your infrastructure.
|
|
121
|
+
- **⚡ Lightning Fast** — In-process scanning with **zero network latency**. Configurable concurrency for high-throughput scenarios.
|
|
140
122
|
- **🧩 Composable Scanners** — Mix heuristics + signatures; set `stopOn` and timeouts. Bring your own YARA rules.
|
|
141
123
|
- **📦 Deep ZIP Inspection** — Traversal/bomb guards, polyglot & macro hints, nested archive scanning with configurable depth limits.
|
|
142
124
|
- **🔌 Framework Adapters** — Drop-in middleware for Express, Koa, Fastify, Next.js, Nuxt/Nitro, and **NestJS** with first-class TypeScript support.
|
|
@@ -148,28 +130,75 @@ npm i pompelmi @pompelmi/express-middleware
|
|
|
148
130
|
|
|
149
131
|
---
|
|
150
132
|
|
|
133
|
+
## ⚡ Quick Start
|
|
134
|
+
|
|
135
|
+
Get secure file upload scanning running in **under 5 minutes**.
|
|
136
|
+
|
|
137
|
+
### Express Integration
|
|
138
|
+
|
|
139
|
+
```ts
|
|
140
|
+
import express from 'express';
|
|
141
|
+
import multer from 'multer';
|
|
142
|
+
import { createUploadGuard } from '@pompelmi/express-middleware';
|
|
143
|
+
import { CommonHeuristicsScanner, createZipBombGuard, composeScanners } from 'pompelmi';
|
|
144
|
+
|
|
145
|
+
const app = express();
|
|
146
|
+
const upload = multer({ storage: multer.memoryStorage() });
|
|
147
|
+
|
|
148
|
+
// Configure your security policy
|
|
149
|
+
const scanner = composeScanners(
|
|
150
|
+
[
|
|
151
|
+
['zipGuard', createZipBombGuard({ maxEntries: 512, maxCompressionRatio: 12 })],
|
|
152
|
+
['heuristics', CommonHeuristicsScanner],
|
|
153
|
+
],
|
|
154
|
+
{ parallel: false, stopOn: 'suspicious', timeoutMsPerScanner: 1500 }
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
app.post('/upload',
|
|
158
|
+
upload.single('file'),
|
|
159
|
+
createUploadGuard({
|
|
160
|
+
includeExtensions: ['pdf', 'zip', 'png', 'jpg'],
|
|
161
|
+
allowedMimeTypes: ['application/pdf', 'application/zip', 'image/png', 'image/jpeg'],
|
|
162
|
+
maxFileSizeBytes: 20 * 1024 * 1024, // 20MB
|
|
163
|
+
scanner,
|
|
164
|
+
failClosed: true
|
|
165
|
+
}),
|
|
166
|
+
(req, res) => {
|
|
167
|
+
// File is safe - proceed with your logic
|
|
168
|
+
res.json({ success: true, message: 'File uploaded successfully' });
|
|
169
|
+
}
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
app.listen(3000, () => console.log('🚀 Server running on http://localhost:3000'));
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**Test it:**
|
|
176
|
+
```bash
|
|
177
|
+
curl -X POST http://localhost:3000/upload -F "file=@test.pdf"
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
✅ **Done!** Your app now blocks malicious uploads before they hit disk.
|
|
181
|
+
|
|
182
|
+
👉 **[Explore full documentation →](https://pompelmi.github.io/pompelmi/)** | **[See more examples →](./examples/)**
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
151
186
|
## Table of Contents
|
|
152
187
|
|
|
153
|
-
- [
|
|
154
|
-
- [
|
|
188
|
+
- [Features](#features)
|
|
189
|
+
- [Quick Start](#quick-start)
|
|
155
190
|
- [Why pompelmi](#why-pompelmi)
|
|
156
|
-
- [How it compares](#how-it-compares)
|
|
157
|
-
- [What Developers Say](#what-developers-say)
|
|
158
|
-
- [What Makes pompelmi Special](#what-makes-pompelmi-special)
|
|
159
191
|
- [Use Cases](#use-cases)
|
|
160
192
|
- [Installation](#installation)
|
|
161
|
-
- [
|
|
162
|
-
|
|
163
|
-
- [Express](#express)
|
|
164
|
-
- [Koa](#koa)
|
|
165
|
-
- [Next.js (App Router)](#nextjs-app-router)
|
|
193
|
+
- [Getting Started](#getting-started)
|
|
194
|
+
- [Code Examples](#code-examples)
|
|
166
195
|
- [Adapters](#adapters)
|
|
167
196
|
- [GitHub Action](#github-action)
|
|
168
197
|
- [Configuration](#configuration)
|
|
169
198
|
- [YARA Getting Started](#yara-getting-started)
|
|
170
199
|
- [Security Notes](#security-notes)
|
|
171
|
-
|
|
172
|
-
- [
|
|
200
|
+
- [Production Checklist](#production-checklist)
|
|
201
|
+
- [Community & Recognition](#community--recognition)
|
|
173
202
|
- [FAQ](#faq)
|
|
174
203
|
- [Contributing](#contributing)
|
|
175
204
|
- [License](#license)
|
|
@@ -195,55 +224,11 @@ pompelmi documentation is available in multiple languages to help developers wor
|
|
|
195
224
|
|
|
196
225
|
---
|
|
197
226
|
|
|
198
|
-
##
|
|
199
|
-
|
|
200
|
-
**pompelmi** scans untrusted file uploads **before** they hit disk. A tiny, TypeScript-first toolkit for Node.js with composable scanners, deep ZIP inspection, and optional signature engines.
|
|
201
|
-
|
|
202
|
-
### 🎯 Key Features
|
|
203
|
-
|
|
204
|
-
**🔒 Private by design** — no outbound calls; bytes never leave your process
|
|
205
|
-
|
|
206
|
-
**🧩 Composable scanners** — mix heuristics + signatures; set `stopOn` and timeouts
|
|
207
|
-
|
|
208
|
-
**📦 ZIP hardening** — traversal/bomb guards, polyglot & macro hints
|
|
209
|
-
|
|
210
|
-
**🔌 Drop-in adapters** — Express, Koa, Fastify, Next.js, Nuxt/Nitro, **NestJS**
|
|
211
|
-
|
|
212
|
-
**🌊 Stream-based scanning** — memory-efficient processing with configurable buffer limits
|
|
213
|
-
|
|
214
|
-
**⚙️ CLI for CI/CD** — standalone command-line tool for scanning files and directories
|
|
215
|
-
|
|
216
|
-
**🔍 Polyglot detection** — advanced magic bytes analysis and embedded script detection
|
|
217
|
-
|
|
218
|
-
**📘 Typed & tiny** — modern TS, minimal surface, tree-shakeable
|
|
219
|
-
|
|
220
|
-
**⚡ Zero dependencies** — core library has minimal deps, fast installation
|
|
221
|
-
|
|
222
|
-
## ✨ Highlights
|
|
223
|
-
|
|
224
|
-
**🛡️ Block risky uploads early** — classify uploads as _clean_, _suspicious_, or _malicious_ and stop them at the edge.
|
|
225
|
-
|
|
226
|
-
**✅ Real guards** — extension allow‑list, server‑side MIME sniff (magic bytes), per‑file size caps, and **deep ZIP** traversal with anti‑bomb limits.
|
|
227
|
-
|
|
228
|
-
**🔍 Built‑in scanners** — drop‑in **CommonHeuristicsScanner** (PDF risky actions, Office macros, PE header) and **Zip‑bomb Guard**; add your own or YARA via a tiny `{ scan(bytes) }` contract.
|
|
229
|
-
|
|
230
|
-
**🔬 Polyglot & embedded script detection** — advanced magic bytes analysis detects mixed-format files and embedded scripts with **30+ file signatures**.
|
|
231
|
-
|
|
232
|
-
**🌊 Memory-efficient streaming** — scan large files without loading them entirely into memory with automatic stream routing.
|
|
233
|
-
|
|
234
|
-
**⚙️ Compose scanning** — run multiple scanners in parallel or sequentially with timeouts and short‑circuiting via `composeScanners()`.
|
|
235
|
-
|
|
236
|
-
**🏗️ Framework integrations** — native modules for **NestJS**, Express, Koa, Next.js, Nuxt/Nitro, and Fastify with first-class TypeScript support.
|
|
237
|
-
|
|
238
|
-
**🔧 Production-ready CLI** — standalone tool for CI/CD pipelines with watch mode, multiple output formats (JSON, table, minimal).
|
|
239
|
-
|
|
240
|
-
**☁️ Zero cloud** — scans run in‑process. Keep bytes private. Perfect for GDPR/HIPAA compliance.
|
|
241
|
-
|
|
242
|
-
**👨💻 DX first** — TypeScript types, ESM/CJS builds, tiny API, adapters for popular web frameworks.
|
|
227
|
+
## 🧠 Why pompelmi?
|
|
243
228
|
|
|
244
|
-
|
|
229
|
+
pompelmi delivers **Privacy-First** malware detection with **Zero Cloud Dependencies** — keeping your data secure and your latency zero.
|
|
245
230
|
|
|
246
|
-
|
|
231
|
+
### Why Choose Pompelmi?
|
|
247
232
|
|
|
248
233
|
- **On‑device, private scanning** – no outbound calls, no data sharing.
|
|
249
234
|
- **Blocks early** – runs _before_ you write to disk or persist anything.
|
|
@@ -257,45 +242,25 @@ pompelmi documentation is available in multiple languages to help developers wor
|
|
|
257
242
|
- Apps that need predictable, low‑latency decisions inline.
|
|
258
243
|
- Developers who want simple, typed building blocks instead of a daemon.
|
|
259
244
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
| Capability | pompelmi | ClamAV / node‑clam | Cloud AV APIs |
|
|
263
|
-
| --- | --- | --- | --- |
|
|
264
|
-
| Runs fully in‑process | ✅ | ❌ (separate daemon) | ❌ (network calls) |
|
|
265
|
-
| Bytes stay private | ✅ | ✅ | ❌ |
|
|
266
|
-
| Deep ZIP limits & MIME sniff | ✅ | ✅ (archive scan) | ❓ varies |
|
|
267
|
-
| YARA integration | ✅ optional | ❌* | ❓ varies |
|
|
268
|
-
| Framework adapters | ✅ Express/Koa/Next.js | ❌ | ❌ |
|
|
269
|
-
| Works in CI on artifacts | ✅ | ✅ | ❓ varies |
|
|
270
|
-
| Licensing | MIT | GPL (engine) | Proprietary |
|
|
271
|
-
|
|
272
|
-
\* You can run YARA alongside ClamAV, but it’s not built‑in.
|
|
273
|
-
|
|
274
|
-
---
|
|
275
|
-
## 💬 What Developers Say
|
|
276
|
-
|
|
277
|
-
> "pompelmi made it incredibly easy to add malware scanning to our Express API. The TypeScript support is fantastic!"
|
|
278
|
-
> — Developer using pompelmi in production
|
|
279
|
-
|
|
280
|
-
> "Finally, a file scanning solution that doesn't require sending our users' data to third parties. Perfect for GDPR compliance."
|
|
281
|
-
> — Security Engineer at a healthcare startup
|
|
282
|
-
|
|
283
|
-
> "The YARA integration is seamless. We went from prototype to production in less than a week."
|
|
284
|
-
> — DevSecOps Engineer
|
|
285
|
-
|
|
286
|
-
_Want to share your experience? [Open a discussion](https://github.com/pompelmi/pompelmi/discussions)!_
|
|
245
|
+
### Comparison Table
|
|
287
246
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
247
|
+
| Feature | **Pompelmi** | ClamAV | Cloud APIs (VirusTotal, etc.) |
|
|
248
|
+
|---------|-------------|---------|-------------------------------|
|
|
249
|
+
| **Setup Time** | ⚡ Seconds (`npm install`) | ⏱️ Complex (daemon setup) | ⏱️ API keys + integration |
|
|
250
|
+
| **Privacy** | ✅ **In-process** (data never leaves) | ✅ Local (separate daemon) | ❌ **External** (data sent to cloud) |
|
|
251
|
+
| **Latency** | ⚡ **Zero** (no network calls) | 🔄 IPC overhead | 🌐 **High** (network roundtrip) |
|
|
252
|
+
| **Cost** | 💰 **Free** (MIT license) | 💰 Free (GPL) | 💸 **Pay-per-scan** |
|
|
253
|
+
| **Framework Integration** | ✅ Express, Koa, Next.js, NestJS | ❌ Manual integration | ❌ Manual integration |
|
|
254
|
+
| **TypeScript Support** | ✅ First-class | ❌ Community types | ❓ Varies |
|
|
255
|
+
| **YARA Integration** | ✅ Built-in | ⚙️ Manual setup | ❓ Limited |
|
|
291
256
|
|
|
292
257
|
### 🎯 Developer Experience
|
|
293
258
|
|
|
294
|
-
Built with developers in mind from day one. Simple API, comprehensive TypeScript types, and excellent documentation mean you can integrate secure file scanning in minutes, not days.
|
|
259
|
+
Built with developers in mind from day one. Simple API, comprehensive TypeScript types, and excellent documentation mean you can integrate secure file scanning in minutes, not days.
|
|
295
260
|
|
|
296
261
|
### 🚀 Performance First
|
|
297
262
|
|
|
298
|
-
Optimized for high-throughput scenarios with configurable concurrency, streaming support, and minimal memory overhead.
|
|
263
|
+
Optimized for high-throughput scenarios with configurable concurrency, streaming support, and minimal memory overhead. Scans run in-process with no IPC overhead.
|
|
299
264
|
|
|
300
265
|
### 🔐 Security Without Compromise
|
|
301
266
|
|
|
@@ -333,8 +298,6 @@ Validate user-generated content uploads (images, videos, documents) before proce
|
|
|
333
298
|
|
|
334
299
|
---
|
|
335
300
|
|
|
336
|
-
---
|
|
337
|
-
|
|
338
301
|
## 📦 Installation
|
|
339
302
|
|
|
340
303
|
**pompelmi** is a privacy-first Node.js library for local file scanning.
|
|
@@ -732,18 +695,7 @@ Use the adapter that matches your web framework. All adapters share the same pol
|
|
|
732
695
|
|
|
733
696
|
See the [📘 Code Examples](#-code-examples) section above for integration examples.
|
|
734
697
|
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
| Framework | Package | Status |
|
|
738
|
-
| --- | --- | --- |
|
|
739
|
-
| Express | `@pompelmi/express-middleware` | ✅ alpha |
|
|
740
|
-
| Koa | `@pompelmi/koa-middleware` | ✅ alpha |
|
|
741
|
-
| Next.js (App Router) | `@pompelmi/next-upload` | ✅ alpha |
|
|
742
|
-
| Fastify | `@pompelmi/fastify-plugin` | 🚧 alpha |
|
|
743
|
-
| NestJS | nestjs | 📋 planned |
|
|
744
|
-
| Remix | remix | 📋 planned |
|
|
745
|
-
| hapi | hapi plugin | 📋 planned |
|
|
746
|
-
| SvelteKit | sveltekit | 📋 planned |
|
|
698
|
+
👉 **[View adapter documentation →](https://pompelmi.github.io/pompelmi/)** | **[Browse all examples →](./examples/)**
|
|
747
699
|
|
|
748
700
|
---
|
|
749
701
|
|
|
@@ -1070,39 +1022,105 @@ You should see an HTTP **422 Unprocessable Entity** (blocked by policy). Clean f
|
|
|
1070
1022
|
|
|
1071
1023
|
---
|
|
1072
1024
|
|
|
1073
|
-
## Releases &
|
|
1025
|
+
## Releases & Security
|
|
1074
1026
|
|
|
1075
1027
|
- **Changelog / releases:** see [GitHub Releases](https://github.com/pompelmi/pompelmi/releases).
|
|
1076
1028
|
- **Security disclosures:** please use [GitHub Security Advisories](https://github.com/pompelmi/pompelmi/security/advisories). We’ll coordinate a fix before public disclosure.
|
|
1077
1029
|
- **Production users:** open a [Discussion](https://github.com/pompelmi/pompelmi/discussions) to share requirements or request adapters.
|
|
1078
1030
|
|
|
1079
|
-
|
|
1031
|
+
---
|
|
1080
1032
|
|
|
1081
|
-
|
|
1033
|
+
## 🏆 Community & Recognition
|
|
1082
1034
|
|
|
1083
|
-
|
|
1035
|
+
pompelmi has been featured in **leading security and developer publications** and is trusted by teams worldwide for secure file upload handling.
|
|
1084
1036
|
|
|
1085
|
-
|
|
1037
|
+
### 🌟 Featured In High-Authority Publications
|
|
1086
1038
|
|
|
1087
|
-
|
|
1039
|
+
<table>
|
|
1040
|
+
<tr>
|
|
1041
|
+
<td align="center" width="200">
|
|
1042
|
+
<a href="https://www.helpnetsecurity.com/2026/02/02/pompelmi-open-source-secure-file-upload-scanning-node-js/">
|
|
1043
|
+
<img src="https://img.shields.io/badge/🔒-HelpNet%20Security-FF6B35?style=for-the-badge" alt="HelpNet Security"/>
|
|
1044
|
+
</a>
|
|
1045
|
+
<br/>
|
|
1046
|
+
<strong>HelpNet Security</strong>
|
|
1047
|
+
<br/>
|
|
1048
|
+
<em>Leading Cybersecurity News</em>
|
|
1049
|
+
</td>
|
|
1050
|
+
<td align="center" width="200">
|
|
1051
|
+
<a href="https://snyk.io/test/github/pompelmi/pompelmi">
|
|
1052
|
+
<img src="https://img.shields.io/badge/🛡️-Snyk-4C4A73?style=for-the-badge&logo=snyk" alt="Snyk"/>
|
|
1053
|
+
</a>
|
|
1054
|
+
<br/>
|
|
1055
|
+
<strong>Snyk</strong>
|
|
1056
|
+
<br/>
|
|
1057
|
+
<em>Security Verified</em>
|
|
1058
|
+
</td>
|
|
1059
|
+
<td align="center" width="200">
|
|
1060
|
+
<a href="https://www.detectionengineering.net/p/det-eng-weekly-issue-124-the-defcon">
|
|
1061
|
+
<img src="https://img.shields.io/badge/📡-Detection%20Engineering-0A84FF?style=for-the-badge&logo=substack" alt="Detection Engineering"/>
|
|
1062
|
+
</a>
|
|
1063
|
+
<br/>
|
|
1064
|
+
<strong>Detection Engineering Weekly</strong>
|
|
1065
|
+
<br/>
|
|
1066
|
+
<em>Issue #124</em>
|
|
1067
|
+
</td>
|
|
1068
|
+
</tr>
|
|
1069
|
+
<tr>
|
|
1070
|
+
<td align="center" width="200">
|
|
1071
|
+
<a href="https://nodeweekly.com/issues/594">
|
|
1072
|
+
<img src="https://img.shields.io/badge/⚡-Node%20Weekly-FF6600?style=for-the-badge&logo=node.js" alt="Node Weekly"/>
|
|
1073
|
+
</a>
|
|
1074
|
+
<br/>
|
|
1075
|
+
<strong>Node Weekly</strong>
|
|
1076
|
+
<br/>
|
|
1077
|
+
<em>Issue #594</em>
|
|
1078
|
+
</td>
|
|
1079
|
+
<td align="center" width="200">
|
|
1080
|
+
<a href="https://bytes.dev/archives/429">
|
|
1081
|
+
<img src="https://img.shields.io/badge/📬-Bytes-111111?style=for-the-badge" alt="Bytes"/>
|
|
1082
|
+
</a>
|
|
1083
|
+
<br/>
|
|
1084
|
+
<strong>Bytes Newsletter</strong>
|
|
1085
|
+
<br/>
|
|
1086
|
+
<em>Issue #429</em>
|
|
1087
|
+
</td>
|
|
1088
|
+
<td align="center" width="200">
|
|
1089
|
+
<a href="https://app.daily.dev/posts/pompelmi">
|
|
1090
|
+
<img src="https://img.shields.io/badge/📰-daily.dev-CE3DF3?style=for-the-badge&logo=dailydotdev" alt="daily.dev"/>
|
|
1091
|
+
</a>
|
|
1092
|
+
<br/>
|
|
1093
|
+
<strong>daily.dev</strong>
|
|
1094
|
+
<br/>
|
|
1095
|
+
<em>Featured Article</em>
|
|
1096
|
+
</td>
|
|
1097
|
+
</tr>
|
|
1098
|
+
</table>
|
|
1088
1099
|
|
|
1089
|
-
|
|
1100
|
+
### 🎖️ Mentioned In Awesome Lists
|
|
1090
1101
|
|
|
1091
1102
|
<p align="center">
|
|
1092
|
-
<
|
|
1093
|
-
<
|
|
1094
|
-
<
|
|
1103
|
+
<a href="https://github.com/sorrycc/awesome-javascript"><img src="https://awesome.re/mentioned-badge.svg" alt="Awesome JavaScript"/></a>
|
|
1104
|
+
<a href="https://github.com/dzharii/awesome-typescript"><img src="https://awesome.re/mentioned-badge.svg" alt="Awesome TypeScript"/></a>
|
|
1105
|
+
<a href="https://github.com/sbilly/awesome-security"><img src="https://awesome.re/mentioned-badge.svg" alt="Awesome Security"/></a>
|
|
1106
|
+
<a href="https://github.com/sindresorhus/awesome-nodejs"><img src="https://awesome.re/mentioned-badge.svg" alt="Awesome Node.js"/></a>
|
|
1095
1107
|
</p>
|
|
1096
1108
|
|
|
1097
1109
|
<!-- MENTIONS:START -->
|
|
1110
|
+
<!-- MENTIONS:END -->
|
|
1098
1111
|
|
|
1099
|
-
|
|
1112
|
+
### 💬 What Developers Say
|
|
1100
1113
|
|
|
1101
|
-
|
|
1114
|
+
> "pompelmi made it incredibly easy to add malware scanning to our Express API. The TypeScript support is fantastic!"
|
|
1115
|
+
> — Developer using pompelmi in production
|
|
1102
1116
|
|
|
1103
|
-
|
|
1117
|
+
> "Finally, a file scanning solution that doesn't require sending our users' data to third parties. Perfect for GDPR compliance."
|
|
1118
|
+
> — Security Engineer at a healthcare startup
|
|
1104
1119
|
|
|
1105
|
-
|
|
1120
|
+
> "The YARA integration is seamless. We went from prototype to production in less than a week."
|
|
1121
|
+
> — DevSecOps Engineer
|
|
1122
|
+
|
|
1123
|
+
_Want to share your experience? [Open a discussion](https://github.com/pompelmi/pompelmi/discussions)!_
|
|
1106
1124
|
|
|
1107
1125
|
### 🤝 Community & Support
|
|
1108
1126
|
|
|
@@ -1126,16 +1144,6 @@ pompelmi has been featured in leading developer publications and is trusted by t
|
|
|
1126
1144
|
|
|
1127
1145
|
---
|
|
1128
1146
|
|
|
1129
|
-
## 📊 Star History
|
|
1130
|
-
|
|
1131
|
-
<p align="center">
|
|
1132
|
-
<a href="https://star-history.com/#pompelmi/pompelmi&Date">
|
|
1133
|
-
<img src="https://api.star-history.com/svg?repos=pompelmi/pompelmi&type=Date" alt="Star History Chart" />
|
|
1134
|
-
</a>
|
|
1135
|
-
</p>
|
|
1136
|
-
|
|
1137
|
-
---
|
|
1138
|
-
|
|
1139
1147
|
## 🎖️ Contributors
|
|
1140
1148
|
|
|
1141
1149
|
Thanks to all the amazing contributors who have helped make pompelmi better!
|
|
@@ -1152,6 +1160,16 @@ Thanks to all the amazing contributors who have helped make pompelmi better!
|
|
|
1152
1160
|
|
|
1153
1161
|
---
|
|
1154
1162
|
|
|
1163
|
+
## ⭐ Star History
|
|
1164
|
+
|
|
1165
|
+
<p align="center">
|
|
1166
|
+
<a href="https://star-history.com/#pompelmi/pompelmi&Date">
|
|
1167
|
+
<img src="https://api.star-history.com/svg?repos=pompelmi/pompelmi&type=Date" alt="Star History Chart" width="600" />
|
|
1168
|
+
</a>
|
|
1169
|
+
</p>
|
|
1170
|
+
|
|
1171
|
+
---
|
|
1172
|
+
|
|
1155
1173
|
## 💬 FAQ
|
|
1156
1174
|
|
|
1157
1175
|
**Do I need YARA?**
|
|
@@ -1205,25 +1223,9 @@ See [CONTRIBUTING.md](./CONTRIBUTING.md) for detailed guidelines.
|
|
|
1205
1223
|
- [Examples](./examples/) — Real-world integration examples
|
|
1206
1224
|
- [Security Guide](./SECURITY.md) — Security best practices and disclosure policy
|
|
1207
1225
|
|
|
1208
|
-
### 🎥 Tutorials & Articles
|
|
1209
|
-
|
|
1210
|
-
- **File Upload Security in Node.js** — Best practices guide (coming soon)
|
|
1211
|
-
- **Integrating YARA with pompelmi** — Advanced detection setup (coming soon)
|
|
1212
|
-
- **Zero-Trust File Uploads** — Architecture patterns (coming soon)
|
|
1213
|
-
|
|
1214
1226
|
### 🛠️ Tools & Integrations
|
|
1215
1227
|
|
|
1216
1228
|
- [GitHub Action](https://github.com/pompelmi/pompelmi/tree/main/.github/actions/pompelmi-scan) — CI/CD scanning
|
|
1217
|
-
- [Docker Images](https://hub.docker.com/r/pompelmi/pompelmi) — Containerized scanning (coming soon)
|
|
1218
|
-
- [Cloud Functions](https://github.com/pompelmi/cloud-functions) — Serverless examples (coming soon)
|
|
1219
|
-
|
|
1220
|
-
---
|
|
1221
|
-
|
|
1222
|
-
## 📊 Project Stats
|
|
1223
|
-
|
|
1224
|
-
<p align="center">
|
|
1225
|
-
<img src="https://repobeats.axiom.co/api/embed/YOUR_EMBED_ID.svg" alt="Repobeats analytics" />
|
|
1226
|
-
</p>
|
|
1227
1229
|
|
|
1228
1230
|
---
|
|
1229
1231
|
|
|
@@ -1237,19 +1239,6 @@ pompelmi stands on the shoulders of giants. Special thanks to:
|
|
|
1237
1239
|
|
|
1238
1240
|
---
|
|
1239
1241
|
|
|
1240
|
-
## 📞 Support
|
|
1241
|
-
|
|
1242
|
-
Need help? We're here for you!
|
|
1243
|
-
|
|
1244
|
-
- 📖 [Documentation](https://pompelmi.github.io/pompelmi/)
|
|
1245
|
-
- 💬 [GitHub Discussions](https://github.com/pompelmi/pompelmi/discussions)
|
|
1246
|
-
- 🐛 [Issue Tracker](https://github.com/pompelmi/pompelmi/issues)
|
|
1247
|
-
- 🔒 [Security](https://github.com/pompelmi/pompelmi/security) (for vulnerabilities)
|
|
1248
|
-
|
|
1249
|
-
For commercial support and consulting, contact the maintainers.
|
|
1250
|
-
|
|
1251
|
-
---
|
|
1252
|
-
|
|
1253
1242
|
<p align="right"><a href="#pompelmi">↑ Back to top</a></p>
|
|
1254
1243
|
|
|
1255
1244
|
## 📜 License
|
package/dist/pompelmi.cjs
CHANGED
|
@@ -65,7 +65,7 @@ function createPresetScanner(preset, opts = {}) {
|
|
|
65
65
|
});
|
|
66
66
|
scanners.push(binjaScanner);
|
|
67
67
|
}).catch(() => {
|
|
68
|
-
// Binary Ninja engine not available
|
|
68
|
+
// Binary Ninja engine not available - silently skip
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
71
|
catch {
|
|
@@ -85,7 +85,7 @@ function createPresetScanner(preset, opts = {}) {
|
|
|
85
85
|
});
|
|
86
86
|
scanners.push(ghidraScanner);
|
|
87
87
|
}).catch(() => {
|
|
88
|
-
// Ghidra engine not available
|
|
88
|
+
// Ghidra engine not available - silently skip
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
91
|
catch {
|