pompelmi 0.29.1 โ 0.30.1
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 +191 -180
- 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 +91 -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>
|
|
@@ -100,6 +82,7 @@
|
|
|
100
82
|
<a href="https://github.com/pompelmi/pompelmi/network/members"><img alt="GitHub forks" src="https://img.shields.io/github/forks/pompelmi/pompelmi?style=social"></a>
|
|
101
83
|
<a href="https://github.com/pompelmi/pompelmi/watchers"><img alt="GitHub watchers" src="https://img.shields.io/github/watchers/pompelmi/pompelmi?style=social"></a>
|
|
102
84
|
<a href="https://github.com/pompelmi/pompelmi/issues"><img alt="open issues" src="https://img.shields.io/github/issues/pompelmi/pompelmi?color=orange"></a>
|
|
85
|
+
<a href="https://github.com/sponsors/pompelmi"><img alt="GitHub Sponsors" src="https://img.shields.io/github/sponsors/pompelmi?style=social&label=Sponsor"></a>
|
|
103
86
|
</p>
|
|
104
87
|
|
|
105
88
|
<p align="center">
|
|
@@ -121,7 +104,7 @@
|
|
|
121
104
|
|
|
122
105
|
## ๐ฌ Demo
|
|
123
106
|
|
|
124
|
-
|
|
107
|
+

|
|
125
108
|
|
|
126
109
|
**Want to try it now?** Check out our [live examples](./examples/) or install and run locally:
|
|
127
110
|
|
|
@@ -135,8 +118,8 @@ npm i pompelmi @pompelmi/express-middleware
|
|
|
135
118
|
|
|
136
119
|
**pompelmi** provides enterprise-grade file scanning for Node.js applications:
|
|
137
120
|
|
|
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
|
|
121
|
+
- **๐ Privacy-First Architecture** โ All scanning happens in-process. **No cloud calls, no data leaks.** Your files never leave your infrastructure.
|
|
122
|
+
- **โก Lightning Fast** โ In-process scanning with **zero network latency**. Configurable concurrency for high-throughput scenarios.
|
|
140
123
|
- **๐งฉ Composable Scanners** โ Mix heuristics + signatures; set `stopOn` and timeouts. Bring your own YARA rules.
|
|
141
124
|
- **๐ฆ Deep ZIP Inspection** โ Traversal/bomb guards, polyglot & macro hints, nested archive scanning with configurable depth limits.
|
|
142
125
|
- **๐ Framework Adapters** โ Drop-in middleware for Express, Koa, Fastify, Next.js, Nuxt/Nitro, and **NestJS** with first-class TypeScript support.
|
|
@@ -148,28 +131,75 @@ npm i pompelmi @pompelmi/express-middleware
|
|
|
148
131
|
|
|
149
132
|
---
|
|
150
133
|
|
|
134
|
+
## โก Quick Start
|
|
135
|
+
|
|
136
|
+
Get secure file upload scanning running in **under 5 minutes**.
|
|
137
|
+
|
|
138
|
+
### Express Integration
|
|
139
|
+
|
|
140
|
+
```ts
|
|
141
|
+
import express from 'express';
|
|
142
|
+
import multer from 'multer';
|
|
143
|
+
import { createUploadGuard } from '@pompelmi/express-middleware';
|
|
144
|
+
import { CommonHeuristicsScanner, createZipBombGuard, composeScanners } from 'pompelmi';
|
|
145
|
+
|
|
146
|
+
const app = express();
|
|
147
|
+
const upload = multer({ storage: multer.memoryStorage() });
|
|
148
|
+
|
|
149
|
+
// Configure your security policy
|
|
150
|
+
const scanner = composeScanners(
|
|
151
|
+
[
|
|
152
|
+
['zipGuard', createZipBombGuard({ maxEntries: 512, maxCompressionRatio: 12 })],
|
|
153
|
+
['heuristics', CommonHeuristicsScanner],
|
|
154
|
+
],
|
|
155
|
+
{ parallel: false, stopOn: 'suspicious', timeoutMsPerScanner: 1500 }
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
app.post('/upload',
|
|
159
|
+
upload.single('file'),
|
|
160
|
+
createUploadGuard({
|
|
161
|
+
includeExtensions: ['pdf', 'zip', 'png', 'jpg'],
|
|
162
|
+
allowedMimeTypes: ['application/pdf', 'application/zip', 'image/png', 'image/jpeg'],
|
|
163
|
+
maxFileSizeBytes: 20 * 1024 * 1024, // 20MB
|
|
164
|
+
scanner,
|
|
165
|
+
failClosed: true
|
|
166
|
+
}),
|
|
167
|
+
(req, res) => {
|
|
168
|
+
// File is safe - proceed with your logic
|
|
169
|
+
res.json({ success: true, message: 'File uploaded successfully' });
|
|
170
|
+
}
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
app.listen(3000, () => console.log('๐ Server running on http://localhost:3000'));
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**Test it:**
|
|
177
|
+
```bash
|
|
178
|
+
curl -X POST http://localhost:3000/upload -F "file=@test.pdf"
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
โ
**Done!** Your app now blocks malicious uploads before they hit disk.
|
|
182
|
+
|
|
183
|
+
๐ **[Explore full documentation โ](https://pompelmi.github.io/pompelmi/)** | **[See more examples โ](./examples/)**
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
151
187
|
## Table of Contents
|
|
152
188
|
|
|
153
|
-
- [
|
|
154
|
-
- [
|
|
189
|
+
- [Features](#features)
|
|
190
|
+
- [Quick Start](#quick-start)
|
|
155
191
|
- [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
192
|
- [Use Cases](#use-cases)
|
|
160
193
|
- [Installation](#installation)
|
|
161
|
-
- [
|
|
162
|
-
|
|
163
|
-
- [Express](#express)
|
|
164
|
-
- [Koa](#koa)
|
|
165
|
-
- [Next.js (App Router)](#nextjs-app-router)
|
|
194
|
+
- [Getting Started](#getting-started)
|
|
195
|
+
- [Code Examples](#code-examples)
|
|
166
196
|
- [Adapters](#adapters)
|
|
167
197
|
- [GitHub Action](#github-action)
|
|
168
198
|
- [Configuration](#configuration)
|
|
169
199
|
- [YARA Getting Started](#yara-getting-started)
|
|
170
200
|
- [Security Notes](#security-notes)
|
|
171
|
-
|
|
172
|
-
- [
|
|
201
|
+
- [Production Checklist](#production-checklist)
|
|
202
|
+
- [Community & Recognition](#community--recognition)
|
|
173
203
|
- [FAQ](#faq)
|
|
174
204
|
- [Contributing](#contributing)
|
|
175
205
|
- [License](#license)
|
|
@@ -195,55 +225,11 @@ pompelmi documentation is available in multiple languages to help developers wor
|
|
|
195
225
|
|
|
196
226
|
---
|
|
197
227
|
|
|
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.
|
|
228
|
+
## ๐ง Why pompelmi?
|
|
241
229
|
|
|
242
|
-
|
|
230
|
+
pompelmi delivers **Privacy-First** malware detection with **Zero Cloud Dependencies** โ keeping your data secure and your latency zero.
|
|
243
231
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
## ๐ง Why pompelmi?
|
|
232
|
+
### Why Choose Pompelmi?
|
|
247
233
|
|
|
248
234
|
- **Onโdevice, private scanning** โ no outbound calls, no data sharing.
|
|
249
235
|
- **Blocks early** โ runs _before_ you write to disk or persist anything.
|
|
@@ -257,45 +243,25 @@ pompelmi documentation is available in multiple languages to help developers wor
|
|
|
257
243
|
- Apps that need predictable, lowโlatency decisions inline.
|
|
258
244
|
- Developers who want simple, typed building blocks instead of a daemon.
|
|
259
245
|
|
|
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)!_
|
|
287
|
-
|
|
288
|
-
---
|
|
246
|
+
### Comparison Table
|
|
289
247
|
|
|
290
|
-
|
|
248
|
+
| Feature | **Pompelmi** | ClamAV | Cloud APIs (VirusTotal, etc.) |
|
|
249
|
+
|---------|-------------|---------|-------------------------------|
|
|
250
|
+
| **Setup Time** | โก Seconds (`npm install`) | โฑ๏ธ Complex (daemon setup) | โฑ๏ธ API keys + integration |
|
|
251
|
+
| **Privacy** | โ
**In-process** (data never leaves) | โ
Local (separate daemon) | โ **External** (data sent to cloud) |
|
|
252
|
+
| **Latency** | โก **Zero** (no network calls) | ๐ IPC overhead | ๐ **High** (network roundtrip) |
|
|
253
|
+
| **Cost** | ๐ฐ **Free** (MIT license) | ๐ฐ Free (GPL) | ๐ธ **Pay-per-scan** |
|
|
254
|
+
| **Framework Integration** | โ
Express, Koa, Next.js, NestJS | โ Manual integration | โ Manual integration |
|
|
255
|
+
| **TypeScript Support** | โ
First-class | โ Community types | โ Varies |
|
|
256
|
+
| **YARA Integration** | โ
Built-in | โ๏ธ Manual setup | โ Limited |
|
|
291
257
|
|
|
292
258
|
### ๐ฏ Developer Experience
|
|
293
259
|
|
|
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.
|
|
260
|
+
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
261
|
|
|
296
262
|
### ๐ Performance First
|
|
297
263
|
|
|
298
|
-
Optimized for high-throughput scenarios with configurable concurrency, streaming support, and minimal memory overhead.
|
|
264
|
+
Optimized for high-throughput scenarios with configurable concurrency, streaming support, and minimal memory overhead. Scans run in-process with no IPC overhead.
|
|
299
265
|
|
|
300
266
|
### ๐ Security Without Compromise
|
|
301
267
|
|
|
@@ -333,8 +299,6 @@ Validate user-generated content uploads (images, videos, documents) before proce
|
|
|
333
299
|
|
|
334
300
|
---
|
|
335
301
|
|
|
336
|
-
---
|
|
337
|
-
|
|
338
302
|
## ๐ฆ Installation
|
|
339
303
|
|
|
340
304
|
**pompelmi** is a privacy-first Node.js library for local file scanning.
|
|
@@ -732,18 +696,7 @@ Use the adapter that matches your web framework. All adapters share the same pol
|
|
|
732
696
|
|
|
733
697
|
See the [๐ Code Examples](#-code-examples) section above for integration examples.
|
|
734
698
|
|
|
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 |
|
|
699
|
+
๐ **[View adapter documentation โ](https://pompelmi.github.io/pompelmi/)** | **[Browse all examples โ](./examples/)**
|
|
747
700
|
|
|
748
701
|
---
|
|
749
702
|
|
|
@@ -1070,39 +1023,105 @@ You should see an HTTP **422 Unprocessable Entity** (blocked by policy). Clean f
|
|
|
1070
1023
|
|
|
1071
1024
|
---
|
|
1072
1025
|
|
|
1073
|
-
## Releases &
|
|
1026
|
+
## Releases & Security
|
|
1074
1027
|
|
|
1075
1028
|
- **Changelog / releases:** see [GitHub Releases](https://github.com/pompelmi/pompelmi/releases).
|
|
1076
1029
|
- **Security disclosures:** please use [GitHub Security Advisories](https://github.com/pompelmi/pompelmi/security/advisories). Weโll coordinate a fix before public disclosure.
|
|
1077
1030
|
- **Production users:** open a [Discussion](https://github.com/pompelmi/pompelmi/discussions) to share requirements or request adapters.
|
|
1078
1031
|
|
|
1079
|
-
|
|
1032
|
+
---
|
|
1080
1033
|
|
|
1081
|
-
|
|
1034
|
+
## ๐ Community & Recognition
|
|
1082
1035
|
|
|
1083
|
-
|
|
1036
|
+
pompelmi has been featured in **leading security and developer publications** and is trusted by teams worldwide for secure file upload handling.
|
|
1084
1037
|
|
|
1085
|
-
|
|
1038
|
+
### ๐ Featured In High-Authority Publications
|
|
1086
1039
|
|
|
1087
|
-
|
|
1040
|
+
<table>
|
|
1041
|
+
<tr>
|
|
1042
|
+
<td align="center" width="200">
|
|
1043
|
+
<a href="https://www.helpnetsecurity.com/2026/02/02/pompelmi-open-source-secure-file-upload-scanning-node-js/">
|
|
1044
|
+
<img src="https://img.shields.io/badge/๐-HelpNet%20Security-FF6B35?style=for-the-badge" alt="HelpNet Security"/>
|
|
1045
|
+
</a>
|
|
1046
|
+
<br/>
|
|
1047
|
+
<strong>HelpNet Security</strong>
|
|
1048
|
+
<br/>
|
|
1049
|
+
<em>Leading Cybersecurity News</em>
|
|
1050
|
+
</td>
|
|
1051
|
+
<td align="center" width="200">
|
|
1052
|
+
<a href="https://snyk.io/test/github/pompelmi/pompelmi">
|
|
1053
|
+
<img src="https://img.shields.io/badge/๐ก๏ธ-Snyk-4C4A73?style=for-the-badge&logo=snyk" alt="Snyk"/>
|
|
1054
|
+
</a>
|
|
1055
|
+
<br/>
|
|
1056
|
+
<strong>Snyk</strong>
|
|
1057
|
+
<br/>
|
|
1058
|
+
<em>Security Verified</em>
|
|
1059
|
+
</td>
|
|
1060
|
+
<td align="center" width="200">
|
|
1061
|
+
<a href="https://www.detectionengineering.net/p/det-eng-weekly-issue-124-the-defcon">
|
|
1062
|
+
<img src="https://img.shields.io/badge/๐ก-Detection%20Engineering-0A84FF?style=for-the-badge&logo=substack" alt="Detection Engineering"/>
|
|
1063
|
+
</a>
|
|
1064
|
+
<br/>
|
|
1065
|
+
<strong>Detection Engineering Weekly</strong>
|
|
1066
|
+
<br/>
|
|
1067
|
+
<em>Issue #124</em>
|
|
1068
|
+
</td>
|
|
1069
|
+
</tr>
|
|
1070
|
+
<tr>
|
|
1071
|
+
<td align="center" width="200">
|
|
1072
|
+
<a href="https://nodeweekly.com/issues/594">
|
|
1073
|
+
<img src="https://img.shields.io/badge/โก-Node%20Weekly-FF6600?style=for-the-badge&logo=node.js" alt="Node Weekly"/>
|
|
1074
|
+
</a>
|
|
1075
|
+
<br/>
|
|
1076
|
+
<strong>Node Weekly</strong>
|
|
1077
|
+
<br/>
|
|
1078
|
+
<em>Issue #594</em>
|
|
1079
|
+
</td>
|
|
1080
|
+
<td align="center" width="200">
|
|
1081
|
+
<a href="https://bytes.dev/archives/429">
|
|
1082
|
+
<img src="https://img.shields.io/badge/๐ฌ-Bytes-111111?style=for-the-badge" alt="Bytes"/>
|
|
1083
|
+
</a>
|
|
1084
|
+
<br/>
|
|
1085
|
+
<strong>Bytes Newsletter</strong>
|
|
1086
|
+
<br/>
|
|
1087
|
+
<em>Issue #429</em>
|
|
1088
|
+
</td>
|
|
1089
|
+
<td align="center" width="200">
|
|
1090
|
+
<a href="https://app.daily.dev/posts/pompelmi">
|
|
1091
|
+
<img src="https://img.shields.io/badge/๐ฐ-daily.dev-CE3DF3?style=for-the-badge&logo=dailydotdev" alt="daily.dev"/>
|
|
1092
|
+
</a>
|
|
1093
|
+
<br/>
|
|
1094
|
+
<strong>daily.dev</strong>
|
|
1095
|
+
<br/>
|
|
1096
|
+
<em>Featured Article</em>
|
|
1097
|
+
</td>
|
|
1098
|
+
</tr>
|
|
1099
|
+
</table>
|
|
1088
1100
|
|
|
1089
|
-
|
|
1101
|
+
### ๐๏ธ Mentioned In Awesome Lists
|
|
1090
1102
|
|
|
1091
1103
|
<p align="center">
|
|
1092
|
-
<
|
|
1093
|
-
<
|
|
1094
|
-
<
|
|
1104
|
+
<a href="https://github.com/sorrycc/awesome-javascript"><img src="https://awesome.re/mentioned-badge.svg" alt="Awesome JavaScript"/></a>
|
|
1105
|
+
<a href="https://github.com/dzharii/awesome-typescript"><img src="https://awesome.re/mentioned-badge.svg" alt="Awesome TypeScript"/></a>
|
|
1106
|
+
<a href="https://github.com/sbilly/awesome-security"><img src="https://awesome.re/mentioned-badge.svg" alt="Awesome Security"/></a>
|
|
1107
|
+
<a href="https://github.com/sindresorhus/awesome-nodejs"><img src="https://awesome.re/mentioned-badge.svg" alt="Awesome Node.js"/></a>
|
|
1095
1108
|
</p>
|
|
1096
1109
|
|
|
1097
1110
|
<!-- MENTIONS:START -->
|
|
1111
|
+
<!-- MENTIONS:END -->
|
|
1098
1112
|
|
|
1099
|
-
|
|
1113
|
+
### ๐ฌ What Developers Say
|
|
1100
1114
|
|
|
1101
|
-
|
|
1115
|
+
> "pompelmi made it incredibly easy to add malware scanning to our Express API. The TypeScript support is fantastic!"
|
|
1116
|
+
> โ Developer using pompelmi in production
|
|
1102
1117
|
|
|
1103
|
-
|
|
1118
|
+
> "Finally, a file scanning solution that doesn't require sending our users' data to third parties. Perfect for GDPR compliance."
|
|
1119
|
+
> โ Security Engineer at a healthcare startup
|
|
1104
1120
|
|
|
1105
|
-
|
|
1121
|
+
> "The YARA integration is seamless. We went from prototype to production in less than a week."
|
|
1122
|
+
> โ DevSecOps Engineer
|
|
1123
|
+
|
|
1124
|
+
_Want to share your experience? [Open a discussion](https://github.com/pompelmi/pompelmi/discussions)!_
|
|
1106
1125
|
|
|
1107
1126
|
### ๐ค Community & Support
|
|
1108
1127
|
|
|
@@ -1113,6 +1132,7 @@ pompelmi has been featured in leading developer publications and is trusted by t
|
|
|
1113
1132
|
- ๐ **[Issue Tracker](https://github.com/pompelmi/pompelmi/issues)** โ Report bugs, request features
|
|
1114
1133
|
- ๐ **[Security Policy](https://github.com/pompelmi/pompelmi/security)** โ Report security vulnerabilities privately
|
|
1115
1134
|
- ๐ผ **Commercial Support** โ For enterprise support and consulting, contact the maintainers
|
|
1135
|
+
- ๐ **[Sponsor pompelmi](https://github.com/sponsors/pompelmi)** โ Support ongoing development via GitHub Sponsors
|
|
1116
1136
|
|
|
1117
1137
|
**Supported Frameworks:**
|
|
1118
1138
|
- โ
Express
|
|
@@ -1126,28 +1146,48 @@ pompelmi has been featured in leading developer publications and is trusted by t
|
|
|
1126
1146
|
|
|
1127
1147
|
---
|
|
1128
1148
|
|
|
1129
|
-
##
|
|
1149
|
+
## ๐๏ธ Contributors
|
|
1150
|
+
|
|
1151
|
+
Thanks to all the amazing contributors who have helped make pompelmi better!
|
|
1130
1152
|
|
|
1131
1153
|
<p align="center">
|
|
1132
|
-
<a href="https://
|
|
1133
|
-
<img src="https://
|
|
1154
|
+
<a href="https://github.com/pompelmi/pompelmi/graphs/contributors">
|
|
1155
|
+
<img src="https://contrib.rocks/image?repo=pompelmi/pompelmi" alt="Contributors" />
|
|
1134
1156
|
</a>
|
|
1135
1157
|
</p>
|
|
1136
1158
|
|
|
1159
|
+
<p align="center">
|
|
1160
|
+
<em>Want to contribute? Check out our <a href="./CONTRIBUTING.md">Contributing Guide</a>!</em>
|
|
1161
|
+
</p>
|
|
1162
|
+
|
|
1137
1163
|
---
|
|
1138
1164
|
|
|
1139
|
-
##
|
|
1165
|
+
## ๐ Sponsors
|
|
1140
1166
|
|
|
1141
|
-
|
|
1167
|
+
Pompelmi is free and open-source. If it saves you time or helps protect your users, consider supporting its development!
|
|
1142
1168
|
|
|
1143
1169
|
<p align="center">
|
|
1144
|
-
<a href="https://github.com/
|
|
1145
|
-
<img src="https://
|
|
1170
|
+
<a href="https://github.com/sponsors/pompelmi">
|
|
1171
|
+
<img src="https://img.shields.io/badge/Sponsor-pompelmi-EA4AAA?style=for-the-badge&logo=githubsponsors&logoColor=white" alt="Sponsor pompelmi on GitHub" />
|
|
1146
1172
|
</a>
|
|
1147
1173
|
</p>
|
|
1148
1174
|
|
|
1175
|
+
Your sponsorship helps fund:
|
|
1176
|
+
- ๐งฌ New detection engine integrations
|
|
1177
|
+
- ๐งช Expanded test coverage and CI infrastructure
|
|
1178
|
+
- ๐ Documentation and examples
|
|
1179
|
+
- ๐ Security audits and CVE response
|
|
1180
|
+
|
|
1181
|
+
Thank you to all current and future sponsors for keeping this project alive!
|
|
1182
|
+
|
|
1183
|
+
---
|
|
1184
|
+
|
|
1185
|
+
## โญ Star History
|
|
1186
|
+
|
|
1149
1187
|
<p align="center">
|
|
1150
|
-
<
|
|
1188
|
+
<a href="https://star-history.com/#pompelmi/pompelmi&Date">
|
|
1189
|
+
<img src="https://api.star-history.com/svg?repos=pompelmi/pompelmi&type=Date" alt="Star History Chart" width="600" />
|
|
1190
|
+
</a>
|
|
1151
1191
|
</p>
|
|
1152
1192
|
|
|
1153
1193
|
---
|
|
@@ -1205,25 +1245,9 @@ See [CONTRIBUTING.md](./CONTRIBUTING.md) for detailed guidelines.
|
|
|
1205
1245
|
- [Examples](./examples/) โ Real-world integration examples
|
|
1206
1246
|
- [Security Guide](./SECURITY.md) โ Security best practices and disclosure policy
|
|
1207
1247
|
|
|
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
1248
|
### ๐ ๏ธ Tools & Integrations
|
|
1215
1249
|
|
|
1216
1250
|
- [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
1251
|
|
|
1228
1252
|
---
|
|
1229
1253
|
|
|
@@ -1237,19 +1261,6 @@ pompelmi stands on the shoulders of giants. Special thanks to:
|
|
|
1237
1261
|
|
|
1238
1262
|
---
|
|
1239
1263
|
|
|
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
1264
|
<p align="right"><a href="#pompelmi">โ Back to top</a></p>
|
|
1254
1265
|
|
|
1255
1266
|
## ๐ 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 {
|