Changelog History
Page 1
-
v1.20.0 Changes
May 15, 2026โ Added
- ๐ท Star prompt printed to stderr on first import (skipped in CI and non-TTY environments), with a
~/.pompelmi/.starredmarker so it shows only once. - ๐จ
scripts/postinstall.jsโ prints a GitHub star nudge to stdout afternpm installin interactive terminals.
๐ Changed
- ๐ฆ
package.jsonโ addedpostinstallscript pointing toscripts/postinstall.js; bumped version to 1.20.0.
- ๐ท Star prompt printed to stderr on first import (skipped in CI and non-TTY environments), with a
-
v1.19.0 Changes
May 12, 2026Title:
v1.19.0 โ Scan Cache, Policies, Multi-Engine, Directory StreamingBody:
## What's New### SHA256 Scan CacheSkip rescanning files that have already been verified. Cache results in memory or on disk with configurable TTL and LRU eviction.```jsconst{createCache}=require('pompelmi')constcache=createCache({ ttl:3600000, maxSize:1000})constresult=awaitcache.scan(filePath, options)// Second call with same file content: instant, no clamd roundtripcache.stats()// { hits: 42, misses: 8, size: 50, hitRate: 0.84 }File-based persistence across restarts:
constcache=createCache({storage:'file',filePath:'./.pompelmi-cache.json',ttl:86400000})Scan Policies
๐ Define all upload security rules in one place โ size, MIME type,
extension, and virus scanning โ and apply them with a single call.const{createPolicy}=require('pompelmi')constpolicy=createPolicy({scan:{host:'localhost',port:3310},maxSize:10\*1024\*1024,allowedMimeTypes:['image/jpeg','image/png','application/pdf'],allowedExtensions:['.jpg','.jpeg','.png','.pdf'],rejectEncrypted:true,onScannerUnavailable:'reject'})constresult=awaitpolicy.check(buffer,{filename:'upload.pdf',mimeType:'application/pdf',size:buffer.length})// { allowed: true, reason: null, verdict: Verdict.Clean }// Express middlewareapp.post('/upload',upload.single('file'),policy.middleware(),handler)Multi-Engine Scanning
Combine ClamAV with VirusTotal for higher confidence results.
const{createMultiEngine}=require('pompelmi')constscanner=createMultiEngine({engines:[{type:'clamav',host:'localhost',port:3310},{type:'virustotal',apiKey:process.env.VIRUSTOTAL\_API\_KEY}],consensus:'any'})constresult=awaitscanner.scanBuffer(buffer)// {// verdict: Verdict.Malicious,// engines: [// { name: 'clamav', verdict: Verdict.Malicious, virus: 'Win.Malware.Agent' },// { name: 'virustotal', verdict: Verdict.Clean, detections: 0 }//]// }Consensus modes:
any(strict) ยทall(lenient) ยทmajorityDirectory Streaming with Progress Events
Scan large directories with real-time progress via async iteration:
forawait(consteventofscanDirectory.stream('/uploads',options)){if(event.type==='progress'){console.log(`${event.scanned}/${event.total} โ ${event.file}`)}if(event.type==='result'){console.log(event.file,event.verdict)}if(event.type==='complete'){console.log('Done:',event.summary)}}๐ Changes
src/ScanCache.jsโ SHA256 cache with TTL, LRU, memory and file storage- ๐
src/Policy.jsโ unified upload security policy src/MultiEngine.jsโ multi-engine scanning with consensus modessrc/DirectoryScanner.jsโ streaming async iterator with progress eventssrc/index.jsโ exports createCache, createPolicy, createMultiEnginetypes/index.d.tsโ full type declarations for all new exports- ๐
docs/cache.htmlโ cache API reference - ๐
docs/policy.htmlโ policy API reference - ๐
docs/multi-engine.htmlโ multi-engine guide - โก๏ธ
docs/*.htmlโ navbar updated
Full Changelog
-
v1.18.0 Changes
May 08, 2026What's New
๐ณ Official Docker Image
๐ณ pompelmi/scanner is now available on Docker Hub.
A self-contained image with ClamAV, clamd, and an HTTP scan API
๐ง built in โ no configuration required.docker pull pompelmi/scanner docker run -p 8080:8080 pompelmi/scanner # Scan a file via HTTPcurl -F"file=@./document.pdf"http://localhost:8080/scan# {"verdict":"clean","file":"document.pdf","viruses":[]}# Health checkcurl http://localhost:8080/health# {"status":"ok","clamd":"running"}๐ Security Scorecard
๐ Grade your upload security configuration from A to F:
const{generateScorecard}=require('pompelmi')constscorecard=awaitgenerateScorecard({scanEnabled:true,mimeTypeAllowlist:['image/jpeg','image/png','application/pdf'],fileSizeLimit:10\*1024\*1024,diskWriteBeforeScan:false,scanErrorBehavior:'reject',clamdUnavailableBehavior:'reject'})console.log(scorecard.grade)// 'A'console.log(scorecard.score)// 95console.log(scorecard.findings)// array of passed/failed checksFrom the CLI:
npx pompelmi scorecard --config ./pompelmi.config.jsVS Code Extension
๐ฆ A VS Code extension scaffold is now available at
packages/vscode/.
Right-click any file in the IDE and select "Scan with pompelmi".
๐ Marketplace publishing coming in a future release.Quarantine Mode
๐ Automatically move infected files to a quarantine directory:
watch('/uploads',{host:'localhost',port:3310,quarantine:'/quarantine'},{onMalicious:'quarantine'}) npx pompelmi watch ./uploads --quarantine ./quarantineEach quarantined file gets a sidecar JSON with original path,
virus name, timestamp, and SHA256 hash.๐ Changes
- ๐ณ
docker/โ Dockerfile, entrypoint.sh, HTTP scan API server - ๐ณ
.github/workflows/docker.ymlโ automated Docker Hub publishing - ๐
src/Scorecard.jsโ A-F grading for upload security config - ๐
src/Watcher.jsโ quarantine mode support - ๐ฆ
packages/vscode/โ VS Code extension scaffold bin/pompelmi.jsโ scorecard command and --quarantine flag- ๐ณ
docs/docker-image.htmlโ Docker Hub image guide - ๐
docs/scorecard.htmlโ scorecard API and CLI reference - ๐
docs/vscode.htmlโ VS Code extension guide - โก๏ธ
docs/*.htmlโ navbar updated across all pages - ๐ณ
README.mdโ Docker Hub badge, new features
Full Changelog
- ๐ณ
-
v1.17.0 Changes
May 08, 2026What's New
๐ Native ESM Support
๐ pompelmi now supports both CommonJS and ES Modules natively.
โช No morecreateRequireworkarounds.// ESM (new)import{scan,scanBuffer,Verdict}from'pompelmi'// CommonJS (unchanged)const{scan,scanBuffer,Verdict}=require('pompelmi')๐ Deno Support
pompelmi now works natively in Deno:
import{scan,Verdict}from'npm:pompelmi'constresult=awaitscan('./file.pdf',{host:'localhost',port:3310})๐ฆ Cloudflare Workers Package
@pompelmi/cloudflareis now available on npm.
Scan file uploads at the edge via a remote clamd instance.npm install @pompelmi/cloudflare import{scanBuffer}from'@pompelmi/cloudflare'exportdefault{asyncfetch(request,env){constformData=awaitrequest.formData()constfile=formData.get('file')constbuffer=awaitfile.arrayBuffer()constresult=awaitscanBuffer(buffer,{host:env.CLAMAV\_HOST,port:parseInt(env.CLAMAV\_PORT)})if(result!=='clean'){returnnewResponse('File rejected',{status:422})}returnnewResponse('OK')}}Landing Page Improvements
pompelmi.app now shows:
- ๐ท Runtime compatibility logos: Node.js โข Bun โข Deno โข Cloudflare Workers
- Framework logos grid: Express โข Fastify โข NestJS โข Next.js โข Hono โข Remix โข SvelteKit
- Live GitHub stars and npm downloads badges
GitHub Sponsors
A Sponsor button is now visible on the GitHub repo via
.github/FUNDING.yml.โ Runtime Support
Runtime Status Node.js โ Bun โ Deno โ ๐ท Cloudflare Workers Framework Integrations
๐ฆ | Package | Framework | | --- | --- | ๐ฆ | @pompelmi/nestjs | NestJS | ๐ฆ | @pompelmi/fastify | Fastify | ๐ฆ | @pompelmi/nextjs | Next.js | ๐ฆ | @pompelmi/hono | Hono | ๐ฆ | @pompelmi/remix | Remix | ๐ฆ | @pompelmi/sveltekit | SvelteKit | ๐ฆ | @pompelmi/cloudflare | Cloudflare Workers | ๐ฆ | @pompelmi/testing | Jest / Vitest / Node |
๐ Changes
src/index.mjsโ native ESM entry point- ๐ฆ
package.jsonโ dual CJS/ESM exports field - ๐ง
deno.jsonโ Deno configuration - ๐ฆ
packages/cloudflare/โ Cloudflare Workers package .github/FUNDING.ymlโ GitHub Sponsors button- ๐
docs/deno.htmlโ Deno usage guide - ๐ท
docs/cloudflare.htmlโ Cloudflare Workers guide - โก๏ธ
docs/*.htmlโ navbar updated index.htmlโ landing page runtime and framework logos
Full Changelog
-
v1.16.0 Changes
May 07, 2026What's New
๐ Remix Plugin
@pompelmi/remixis now available on npm.npm install @pompelmi/remix pompelmi import{withPompelmi}from'@pompelmi/remix'exportconstaction=withPompelmi(async({request})=\>{constformData=awaitrequest.formData()returnjson({ok:true})},{host:'localhost',port:3310})๐ SvelteKit Plugin
@pompelmi/sveltekitis now available on npm.npm install @pompelmi/sveltekit pompelmi import{withPompelmi}from'@pompelmi/sveltekit'exportconstPOST=withPompelmi(async({request})=\>{returnnewResponse(JSON.stringify({ok:true}))},{host:'localhost',port:3310})Scan Statistics
โ Track scan activity in-memory with
createStats():const{createStats}=require('pompelmi')conststats=createStats()constresult=awaitstats.track(()=\>scan(filePath,options))stats.get()// {// totalScanned: 1247,// totalClean: 1245,// totalInfected: 2,// totalErrors: 0,// avgScanTimeMs: 45,// lastScanAt: '2026-05-07T...',// uptime: 3600000// }app.get('/pompelmi/stats',(req,res)=\>res.json(stats.get()))Navbar Fix
๐ All docs/ HTML pages now have a consistent navbar linking to every
๐ page in the documentation site. Previously several pages were missing
๐ links to newer sections.Framework Integrations
๐ฆ | Package | Framework | | --- | --- | ๐ฆ | @pompelmi/nestjs | NestJS | ๐ฆ | @pompelmi/fastify | Fastify | ๐ฆ | @pompelmi/nextjs | Next.js | ๐ฆ | @pompelmi/hono | Hono | ๐ฆ | @pompelmi/remix | Remix | ๐ฆ | @pompelmi/sveltekit | SvelteKit | ๐ฆ | @pompelmi/testing | Jest / Vitest / Node |
๐ Changes
- ๐ฆ
packages/remix/โ Remix action wrapper - ๐ฆ
packages/sveltekit/โ SvelteKit server handler and hook src/Stats.jsโ in-memory scan statistics tracker- ๐
docs/remix.html,docs/sveltekit.html,docs/stats.htmlโ new docs pages - ๐
docs/*.htmlโ canonical navbar across all pages - โก๏ธ
README.mdโ updated framework integrations table - โก๏ธ
.github/workflows/ci.ymlโ updated to Node.js 24 actions
Full Changelog
- ๐ฆ
-
v1.15.0 Changes
May 06, 2026What's New
๐ Hono Plugin
@pompelmi/honois now available on npm. Works on Node.js, Bun,
๐ท and Cloudflare Workers.npm install @pompelmi/hono pompelmi import{pompelmiMiddleware}from'@pompelmi/hono'import{Hono}from'hono'constapp=newHono()app.use('/upload/\*',pompelmiMiddleware({host:'localhost',port:3310,field:'file',onInfected:(c)=\>c.json({error:'Malware detected'},422)}))๐ Bun Support
๐ pompelmi now officially supports the Bun runtime. The core library
detects Bun at runtime and uses native Bun APIs where available for
๐ท faster file reads. Bun is now included in the CI test matrix.bun install pompelmi bun run your-app.jsInteractive Demo
๐ป A browser-based demo is now available at
pompelmi.app/demo โ try the pompelmi
๐ terminal UI and see all three verdicts without installing anything.โ Testing Utilities
โ
@pompelmi/testingprovides mock utilities for unit testing
applications that use pompelmi.npm install --save-dev @pompelmi/testing const{mockClean,mockInfected,mockScanError}=require('@pompelmi/testing')// In your testsit('rejects infected files',async()=\>{constscanner=mockInfected('Win.Malware.Test')constresult=awaitscanner.scanBuffer(buffer)expect(result).toBe(Verdict.Malicious)})โ Works with Jest, Vitest, and the Node.js built-in test runner.
Comparison Page
Side-by-side comparison of pompelmi against other Node.js ClamAV
๐ integrations at docs/comparison.html.Framework Integrations
๐ฆ | Package | Framework | | --- | --- | ๐ฆ | @pompelmi/nestjs | NestJS | ๐ฆ | @pompelmi/fastify | Fastify | ๐ฆ | @pompelmi/nextjs | Next.js | ๐ฆ | @pompelmi/hono | Hono | ๐ฆ | @pompelmi/testing | Jest / Vitest / Node |
๐ Changes
- ๐ฆ
packages/hono/โ Hono middleware plugin - ๐ฆ
packages/testing/โ mock utilities for unit testing src/ClamdScanner.js,BufferScanner.js,StreamScanner.jsโ Bun runtime detection- โ
.github/workflows/ci.ymlโ Bun added to test matrix - ๐ป
docs/demo.htmlโ interactive browser demo - ๐
docs/comparison.htmlโ comparison with alternatives - โก๏ธ
docs/*.htmlโ navbar updated across all pages - โก๏ธ
README.mdโ Bun support, demo link, updated integrations table
Full Changelog
- ๐ฆ
-
v1.14.0 Changes
May 06, 2026What's New
๐ HTML Security Dashboard
Generate a beautiful, self-contained scan report in one command:
npx pompelmi scan ./uploads --report npx pompelmi scan ./uploads --report --output report.htmlOr from code:
const{scanDirectory,generateDashboard}=require('pompelmi')constresults=awaitscanDirectory('./uploads')consthtml=awaitgenerateDashboard(results)fs.writeFileSync('report.html',html)๐ Features:
- Summary stats: scanned, infected, clean, errors, time
- Color-coded status banner (green / red)
- Full file table with verdict badges
- Infected files highlighted with virus names
- ๐ Dark mode support
- ๐จ Print-friendly CSS
- Zero external dependencies โ single self-contained HTML file
SVG Share Card
Generate a shareable scan result card for README badges or social media:
npx pompelmi scan ./uploads --share-card# saves pompelmi-scan-card.svg const{generateShareCard}=require('pompelmi')constsvg=awaitgenerateShareCard(results)๐ฆ Next.js Package
@pompelmi/nextjsis now available on npm:npm install @pompelmi/nextjs pompelmi // App Router (Next.js 13+)import{withPompelmi}from'@pompelmi/nextjs'exportconstPOST=withPompelmi(async(req)=\>{returnResponse.json({ok:true})},{host:'localhost',port:3310})// Pages RouterexportdefaultwithPompelmiHandler(handler,options)GitHub App
๐ง Configuration for a one-click pompelmi GitHub App for organizations โ
no workflow file needed, scans changed files on every PR with inline
annotations on the diff.๐ See docs/github-app.html for setup instructions.
Framework Integrations
๐ฆ | Package | Framework | | --- | --- | ๐ฆ | @pompelmi/nestjs | NestJS | ๐ฆ | @pompelmi/fastify | Fastify | ๐ฆ | @pompelmi/nextjs | Next.js |
๐ Changes
src/Dashboard.jsโ HTML report generatorsrc/ShareCard.jsโ SVG share card generatorbin/pompelmi.jsโ--reportand--share-cardflags added- ๐ฆ
packages/nextjs/โ Next.js App Router and Pages Router support - ๐ง
.github/app.ymlโ GitHub App configuration - ๐
docs/dashboard.htmlโ dashboard documentation - ๐
docs/github-app.htmlโ GitHub App documentation - โก๏ธ
docs/*.htmlโ navbar updated with new pages - โก๏ธ
README.mdโ Features list updated
Full Changelog
-
v1.13.0 Changes
May 05, 2026โ Added
- @pompelmi/nestjs โ NestJS module with
PompelmiModule.forRoot()/.forRootAsync(), injectablePompelmiService(scan / scanBuffer / isMalware),PompelmiGuard(blocks malicious uploads viaCanActivate), andPompelmiInterceptor(throwsBadRequestExceptionon infection). Full TypeScript declarations included. - @pompelmi/fastify โ Fastify plugin that decorates the instance with
fastify.pompelmi(scan / scanBuffer / scanStream / preHandler). ThepreHandler()helper returns a route-level hook that scans uploaded files before the route handler runs. Supports customonMaliciouscallbacks and full TypeScript declarations. - Framework Integrations section in
README.mdโ table of official packages with usage snippets for NestJS and Fastify.
- @pompelmi/nestjs โ NestJS module with
-
v1.12.0 Changes
May 05, 2026What's New
Standalone CLI
Scan files directly from the terminal โ no code required:
# Scan a filenpx pompelmi scan ./uploads/file.pdf# Scan a directory recursivelynpx pompelmi scan ./uploads --recursive# Output as JSON for scriptingnpx pompelmi scan ./uploads --json# Watch a folder in real timenpx pompelmi watch ./uploads๐ Features:
- Renders the pompelmi grapefruit logo in the terminal via
terminal-image - Live progress bar for directory scans
- ๐ป Box-drawing UI with color-coded results (green/red/yellow)
--jsonmode for shell script integration- ๐
--deleteflag to auto-remove infected files - ๐ท
--quietmode for CI pipelines - Works with TCP, UNIX socket, and local clamscan
Exit codes:
0clean ยท1infected ยท2scan error ยท3clamd unreachableInstall globally:
npm install -g pompelmi pompelmi scan ./uploadsOr use without installing:
npx pompelmi scan ./uploads๐ CLI Documentation
๐ New dedicated page: docs/cli.html
- Full commands and options reference
- JSON output format
- Exit codes table
- 8 real-world examples
- Shell script integration
โก๏ธ Navbar updated across all docs
๐ All docs/ pages now have a consistent navbar including the new CLI link.
๐ Changes
bin/pompelmi.jsโ full CLI implementation- ๐ฆ
package.jsonโbinfield added,terminal-imagedependency - ๐
docs/cli.htmlโ new CLI documentation page - โก๏ธ
docs/*.htmlโ navbar updated across all pages - ๐
README.mdโ Quick Start section, CLI in Features and docs table CHANGELOG.mdโ v1.12.0 entry
Full Changelog
- Renders the pompelmi grapefruit logo in the terminal via
-
v1.11.0 Changes
May 04, 2026โ Added
- Webhook notifications โ
notify(webhookUrl, scanResult, options)sends a POST request when a virus is detected. Payload includesfile,verdict,viruses,timestamp, andhostname. Supports HMAC-SHA256 request signing viaX-Pompelmi-Signatureheader when asecretis provided. Ships withonlyOnMalicious: truedefault so noise-free by default. Uses Node.js built-inhttps/httpโ zero extra dependencies. - EventEmitter scanner โ
createScanner(options)returns anEventEmitter-based scanner withscan(filePath)andscanDirectory(dirPath)methods. Emits'clean','malicious','scanError', and'error'events per file โ ideal for streaming pipelines and upload processing loops. - ๐ Automated GitHub Release notes โ release workflow now extracts the matching changelog section from
CHANGELOG.mdand uses it as the release body, with a one-line summary in the release title (vX.Y.Z โ <summary>). No more static template. .mailmapโ maps any historicalclaude/Claudeauthorship entries to the project author so they are excluded from GitHub's contributor list.
๐ Changed
src/index.jsโ exportsnotifyandcreateScanneralongside existing API.- ๐ฐ
types/index.d.tsโ full TypeScript declarations fornotify,NotifyOptions,WebhookPayload,ScanResultInput,createScanner, andScanEmitter(including typed event overloads).
- Webhook notifications โ