148 fake Tailwind CSS plugins on npm that run code when your build loads them
148 npm packages pose as Tailwind CSS or PostCSS plugins. When a build loads one from tailwind.config.js or postcss.config.js, it runs hidden code in Node with the developer's permissions. Some find their server through the Ethereum blockchain. Others keep the payload in a private package that only a fake job interview can install.
- packages
- 148
- versions
- 333
- server address on Ethereum
- 45
- fake job interview lures
- 28
- LPM confirmed
- 35
Summary
- 148 packages and 333 versions. 131 of them were first published between May and October 2026.
- They run when the build loads the plugin or a module imports it. Only 2 of the 125 whose method is known use an install script, so
npm install --ignore-scriptsdoes not stop them. - 45 read the address of their server from transactions on the Ethereum blockchain. The same loader is in 27 more packages with other disguises.
- 28 belong to fake job interviews. The public plugin is clean, and the payload sits in a private npm package that installs only with a token committed to the interview repository.
- 31 download code from a fixed server or paste service, and 20 carry an encoded payload inside the package.
- LPM's own review confirms 35 as malicious, and 146 have an OpenSSF/OSV malicious-package advisory. LPM found 2 that have no advisory.
Why a Tailwind plugin
Tailwind and PostCSS configs are JavaScript. Every plugin listed in them is loaded with require each time npm run dev or npm run build starts, in a Node process that can read environment variables and files and open network connections. Code in the plugin runs then, long after install, on developer machines and in CI.
Most of these packages keep a working plugin in front. They copy the code and README of @tailwindcss/forms, @tailwindcss/typography, tailwindcss-animate or tailwindcss-3d, so the styles still work. 20 imitate @tailwindcss/forms alone. The malicious part is appended after the export, often behind a long run of whitespace that pushes it off-screen in an editor.
- May: 4
- Jun: 16
- Jul: 24
- Aug: 30
- Sep: 49
- Oct: 8
A server address on the blockchain
- On import, an obfuscated block runs, either
eval(atob("…"))or an obfuscator.io bundle. It savesrequireandmoduleas globals for the next stage. - It asks public Ethereum RPC and explorer services, such as drpc.org, 1rpc.io, publicnode.com and blockscout, for the latest transaction sent from one fixed address.
- It decodes two IPv4 addresses from the recipient field of that transaction.
- It downloads XOR-encrypted JavaScript from
/0x/clsand/0x/lson port 443 of those addresses, over plain HTTP, and runs it withevaland in a detached Node process.
The package never names its server. To move it, the operator sends a new transaction, and every installed copy follows. Nothing on npm changes, and a blockchain record cannot be taken down. As of Nov 3, 2026, the sender address had made 609 transactions.
The same loader, address included, also appears in 27 packages that do not pose as Tailwind plugins: React components, checkout SDKs, "common" libraries, an MCP server, CLIs, a Babel config and copies of other libraries. They are listed separately below. One plugin, tailwindcss-effector, uses a variant that reads TRON and Ethereum transaction data instead. See all npm packages with remote code execution.
Fake job interviews and a private package
28 of the plugins come from one template, and their OpenSSF advisories describe a recruiting lure in the style of the "Contagious Interview" campaign. A fake company sends a take-home assessment repository. The advisories name two: "Nodveta", advertised on Torre.ai, and "BlockRoute Labs", which recruited through Djinni.
- The repository commits
web/.npmrcwith an npm auth token, and itstailwind.config.jsloads one of these plugins. - The plugin is a working Animate.css integration with no install script and no network code. It requires a private scoped package,
@jasperquinn/postcss-motion-helpersor@aaron205whitmore/postcss-animate-utils. - npm can fetch that private package only with the committed token, so npm audit and public scanners never see it.
- When the candidate starts the dev server, Tailwind loads the plugin and the private package runs. Public analysis of an earlier package in the chain reports that it contacts the operator's server and runs the code it receives.
The template was published from 16 npm accounts, most of which published two of the plugins. LPM's review of the public tarballs finds nothing, by design, so these packages are marked advisory below. LPM Firewall blocks them on the advisories. The private helper @jasperquinn/postcss-motion-helpers later appeared on the public registry as an empty placeholder and has its own advisory.
Code from a fixed server
- 10getPlugin() loadersfetch JSON from a fixed server and run its credits field
- 4fetch and run on buildobfuscated PostCSS plugins for animate.css
- 4download and requiresave a script to the working directory and require it
The largest family exports a getPlugin() function. It fetches JSON from a fixed address such as 31.97.137.157:45000/icons/109 and passes the credits field to new Function along with require, process and Buffer. Several of these packages are named for Fastify or Polygon, but their READMEs present them as a "Tailwindcss Forms Bundler".
The rest use paste services such as jsonkeeper and npoint, a Google Apps Script, a URL read from node_modules/.bin/manifest.json, or a URL hidden in the pixels of a PNG. The Gutenberg block packages run a script with Deno from a bare IP address, and @tailwind-ts/eslint-plugin downloads, installs and runs a bundle from its postinstall script.
Payloads hidden in the package
Some packages carry the payload with them and rebuild it at run time:
tailwind-typography-plusrebuilds JavaScript from the "ratio" numbers indata/font-metrics.json.gpu-acceleratorXOR-decodesassets/driver-shim.bin, andpostcss-processor-utilsdecodesdata/design-tokens.json, writes it to the temp directory and requires it.@tailwindxss/postcss, a lookalike of@tailwindcss/postcss, reads SVG files in the project's asset folders, base64-decodes their HTML comments and runs the result, so the code comes from the project rather than the package. LPM found it with no advisory.postcss-minify-selectorandpostcss-selector-minifyregister themselves as cssnano'spostcss-minify-selectorsand load the payload from a second package,postcss-minify-selector-parserorlayerd-unit-codec-parser.noelc-css-blender,postcss-semantic-themesandbirch-css-utilsship hundreds of kilobytes of obfuscated modules named like build caches.birch-css-utilsasks to be installed astailwindcss@npm:birch-css-utils, which replaces Tailwind itself.
For 23 more packages, the advisory gives no public description of the payload. LPM Firewall blocks them on the advisory.
Indicators of compromise
Blockchain loader
4The RPC services the loader queries are legitimate. Block the paths, and treat requests to them from a build as a signal.
0xa322e5f3d311d3080e6f0121063e9adc2490ef1a (Ethereum sender address)http://<ip>:443/0x/clshttp://<ip>:443/0x/lsx-payload-b64 response header
Payload servers
10https://31.97.137.157:45000/icons/<n>http://46.183.25.232:45000/icons/106https://bet.slotgambit.com/icons/111https://svganchordev.net/icons/105http://23.27.245.100/index.jshttp://23.27.245.100:3000/index.jshttp://tailwindlan.onlinehttp://194.11.226.41:4000http://172.94.9.157/v028f8cde892b0b74c8.jshttps://slimopump.vercel.app/config/clob-math.json
Abused services
3Block the paths, not the services.
https://www.jsonkeeper.com/b/NFTTNhttps://api.npoint.io/24c25d5f5fcbb0992a4fhttps://script.googleapis.com/v1/scripts/AKfycbyjrAVcSQB2V6XNzgYK8J0gGyx0c_ZpC0y4rFzq1IGUPu7zx7guLszZDVlcsfDzXVz3QA
Job interview lures
3@jasperquinn/postcss-motion-helpers (private dependency)@aaron205whitmore/postcss-animate-utils (private dependency)web/.npmrc with an npm auth token, committed to the assessment repository
Files and code markers
7global.r = require; global.m = modulebuild-cache.mjs, cache-warm.mjs, cache-sweep.mjsdata/font-metrics.jsonassets/driver-shim.bindata/design-tokens.jsonnode_modules/.bin/manifest.jsoninout.js in the working directory
What to do
- Search package.json files and lockfiles for the names below. The real plugins are
tailwindcss,@tailwindcss/forms,@tailwindcss/typography,@tailwindcss/postcssandtailwindcss-animate. - Read
tailwind.config.jsandpostcss.config.jsas code. Every plugin they list runs in Node during each build. - Open take-home assignments in a disposable VM or container with no credentials. A repository that commits an
.npmrcwith a token is a red flag. --ignore-scriptsdoes not help here. Keep long-lived secrets out of build environments, and restrict outbound traffic from builds where you can.- If one of these packages ran, treat the machine as compromised. Rotate every credential it held, including cloud, npm, GitHub and wallet keys, and look for detached
nodeprocesses. - Block the hosts and paths above at network egress.
Affected packages
148 packages, grouped by how the payload arrives, and 27 other packages with the same blockchain loader. Each name links to its LPM Firewall report and is marked LPM confirmed or advisory.
Server address on Ethereum45 packages
- fluid-type-uiLPM confirmed2.0.9, 2.0.8
- post-css-transferLPM confirmed0.0.1
- postcss-initial-provideradvisory3.0.4
- postcss-initialize-pluginLPM confirmed3.0.4
- postcss-initialize-providerLPM confirmed3.0.4
- postcss-theme-providerLPM confirmed1.0.4, 1.0.3, 1.0.2, 1.0.1
- tailwind-animadvisory1.2.5, 1.2.4, 1.2.3 +6 more
- tailwind-animate-pluginadvisory1.1.0
- tailwind-animate-v4LPM confirmed2.1.2, 2.1.1, 2.1.0, 1.1.0
- tailwind-animationgroupLPM confirmed2.3.7
- tailwind-animationpackLPM confirmed2.3.7
- tailwind-animeadvisory1.1.1, 1.1.0, 1.0.0, 0.0.1
- tailwind-contact-formsadvisory0.5.12, 0.5.9, 0.5.5, 0.5.1
- tailwind-container-queriesadvisory0.1.1
- tailwind-custom-formsLPM confirmed0.5.2, 0.5.1, 0.5.0
- tailwind-custom-templatesLPM confirmed0.7.2
- tailwind-form-kitLPM confirmed0.6.5, 0.6.4, 0.6.3 +2 more
- tailwind-form-stylesadvisory0.5.1
- tailwind-form-templatesadvisory0.7.4
- tailwind-forms-kitLPM confirmed0.5.3, 0.5.1
- tailwind-forms-stylesLPM confirmed0.5.2, 0.5.1
- tailwind-hide-scrollbarLPM confirmed2.2.1, 2.2.0, 2.1.5, 0.0.1
- tailwind-minanimatedLPM confirmed2.3.7
- tailwind-modernanimationLPM confirmed2.3.8
- tailwind-opentypeadvisory1.2.3
- tailwind-scrollbar-hideradvisory5.0.2, 5.0.1, 0.0.1
- tailwind-scrollbar-stylesadvisory4.0.3
- tailwindcss-3d-animateLPM confirmed1.2.2, 1.2.1, 1.2.0 +2 more
- tailwindcss-animadvisory1.3.5, 1.3.3, 1.2.2 +5 more
- tailwindcss-animate-stylesadvisory1.0.9
- tailwindcss-contact-formLPM confirmed0.5.1
- tailwindcss-contact-formsadvisory0.6.2, 0.6.1, 0.6.0 +6 more
- tailwindcss-effectoradvisory1.7.0
- tailwindcss-fluid-stylesadvisory2.0.7
- tailwindcss-formLPM confirmed0.5.1
- tailwindcss-form-stylesadvisory0.5.15
- tailwindcss-form-uiadvisory0.5.1
- tailwindcss-form-utilsadvisory0.5.1
- tailwindcss-forms-styleLPM confirmed0.1.2
- tailwindcss-forms-stylesadvisory0.5.1
- tailwindcss-forms-uiadvisory0.5.2
- tailwindcss-hide-scrollbarLPM confirmed2.5.4, 2.5.3, 1.0.0, 0.0.1
- tailwindcss-motion-advancedadvisory1.0.1
- tailwindcss-scrollbar-hideadvisory2.3.0, 2.2.6, 2.2.5, 0.0.1
- uibabaiadvisory5.7.5
Fake job interviews29 packages
- @jasperquinn/postcss-motion-helpersadvisory0.0.0-stage
- animate-tailwind-kitadvisory3.0.4, 3.0.1
- animate-twcss-bridgeadvisory2.0.6
- animate-twcss-packadvisory2.0.6
- animatecss-tailwind-binaryadvisory2.0.6
- animatecss-tailwind-bridgeadvisory2.0.6
- animatecss-tailwind-graphicadvisory2.0.6
- animatecss-tailwind-helperadvisory2.0.6
- animatecss-tailwind-luminaryadvisory2.0.7, 2.0.6
- animatecss-tailwind-pluginadvisory2.0.6
- animatecss-tailwind-presetsadvisory2.0.3, 1.0.0
- animatecss-tailwind-vectrixadvisory2.0.7, 2.0.6
- signalledger-bridgeadvisory2.0.6
- signalledger-diagnosticsadvisory2.0.6
- tailwind-animaflow-kitadvisory2.0.6
- tailwind-animate-kitadvisory2.0.8, 2.0.7, 2.0.6, 0.0.0-stage
- tailwind-animatecss-kitadvisory2.0.6
- tailwind-animatecss-uniformadvisory2.0.7
- tailwind-animationlabadvisory2.0.6, 0.0.0-stage
- tailwind-css-keyframesadvisory1.0.7
- tailwind-fabricadvisory3.0.4, 3.0.1
- tailwind-keyframesadvisory2.0.6, 0.0.0-stage
- tailwind-kineticadvisory2.0.8, 2.0.6, 0.0.0-stage
- tailwindcss-animate-catalogadvisory2.0.7, 2.0.6, 0.0.0-stage
- tailwindcss-animatemotionadvisory1.0.7
- tailwindcss-effect-labadvisory1.6.7, 0.0.0-stage
- tailwindcss-keyframe-kitadvisory3.0.2, 3.0.1, 3.0.0, 0.0.0-stage
- tailwindcss-motionanimateadvisory1.0.1
- tailwindcss-visual-kitadvisory1.3.6, 0.0.0-stage
Fixed server or paste service31 packages
- @tailwind-ts/eslint-pluginLPM confirmed0.3.0, 0.2.0, 0.1.0
- animate-css-viteadvisory1.0.1
- animatecss-postcss-pluginadvisory1.0.1, 1.0.0
- animated-css-kitadvisory1.0.1
- class-weaveradvisory1.0.0
- classbreeze-utilsadvisory0.7.10, 0.7.9, 0.7.8, 0.7.7
- config-helper-kitLPM confirmed1.3.2
- core-tailwindcss-utilityadvisory3.7.1
- daisypickadvisory2.0.0, 1.2.0, 1.1.0, 1.0.0
- fastify-bundlerLPM confirmed1.4.16, 1.4.15, 1.4.14, 1.4.13
- fastify-client-bundleradvisory1.4.0
- my-tailwind-gutenberg-blockadvisory0.1.5, 0.1.4, 0.1.3 +2 more
- polygon-gama-apisLPM confirmed1.4.1
- postcss-animate-css-varsadvisory2.0.3, 1.0.0
- process-tailwindLPM confirmed1.1.99
- reactlogo-loadLPM confirmed1.0.0
- sw-pluginerLPM confirmed1.2.0, 1.1.0, 1.0.2 +2 more
- tailwind-aspectadvisory0.4.2
- tailwind-aspect-stylesadvisory0.4.2
- tailwind-coreLPM confirmed4.3.2, 4.3.1, 4.3.0, 0.0.0
- tailwind-extension-kitadvisory1.3.2
- tailwind-formadvisory0.5.12
- tailwind-gutenberg-block-zeroLPM confirmed1.0.0
- tailwind-plugin-kitLPM confirmed1.3.2
- tailwind-toolkitadvisory1.3.2
- tailwind-utility-kitadvisory1.3.2
- tailwindcss-3d-stylesadvisory1.2.4
- tailwindcss-aspectratio-stylesadvisory0.3.5, 0.3.4
- tailwindcss-form-componentsLPM confirmed1.5.1, 1.5.0, 1.4.1, 1.4.0
- textshape-cssadvisory1.0.0
- typography-stylecssadvisory0.7.4
Payload in the package20 packages
- @tailwindxss/postcssLPM confirmed4.3.4, 4.3.3
- birch-css-utilsLPM confirmed1.3.0, 1.2.2, 1.1.0 +2 more
- gpu-acceleratoradvisory1.4.7, 1.4.6, 1.4.5 +3 more
- layerd-unit-codec-parseradvisory2.0.0, 1.0.0
- motion-forge-cssadvisory1.0.1
- noelc-css-blenderLPM confirmed2.2.1, 2.2.0, 2.1.11, 2.1.9
- postcss-minify-selectoradvisory2.0.2, 2.0.1, 0.1.11 +9 more
- postcss-minify-selector-parseradvisory2.0.1, 1.0.18, 1.0.17 +6 more
- postcss-motion-utilsadvisory3.2.7
- postcss-processor-utilsadvisory1.0.3, 1.0.2, 1.0.1, 1.0.0
- postcss-selector-minifyadvisory2.0.0, 1.0.0
- postcss-semantic-themesadvisory1.0.1, 1.0.0, 0.0.0-stage
- selparsecss-selectoradvisory2.1.0, 2.0.0, 1.1.0, 1.0.0
- tailwind-animation-founderadvisory2.5.7
- tailwind-animator-scrolladvisory1.7.0
- tailwind-color-shadesadvisory1.0.2
- tailwind-style-typographyadvisory0.5.8
- tailwind-typography-plusadvisory2.1.0
- tailwind-typography-stylecssadvisory0.8.3
- tw-theme-kitadvisory1.1.0, 1.0.1
Advisory only23 packages
- clsx-tailwindadvisory1.0.1
- postcss-property-rollupadvisory0.0.1
- tailwind-animate-css-pluginadvisory4.0.3, 2.0.1, 1.0.0
- tailwind-animatesadvisory1.0.1
- tailwind-base-buttonsadvisory0.1.0
- tailwind-elements-uiadvisory1.0.1
- tailwind-fonttype-interadvisory2.3.2
- tailwind-motionkitadvisory1.0.3, 1.0.2, 1.0.1
- tailwind-scrolleradvisory1.0.2
- tailwind-theme-engineadvisory4.0.0, 3.1.0, 3.0.0 +4 more
- tailwind-typography-styleadvisory0.5.8
- tailwindcss-animatecss-keyframesadvisory1.0.0
- tailwindcss-animatecss-latestadvisory2.1.1, 2.1.0
- tailwindcss-animotionadvisory1.0.1
- tailwindcss-fonttype-interadvisory2.3.2, 2.3.1
- tailwindcss-fonttypo-interadvisory2.3.2
- tailwindcss-form-kitadvisory0.5.6, 0.5.1
- tailwindcss-framer-motionadvisory1.1.3
- tailwindcss-mergeadvisory1.0.4, 1.0.2, 1.0.1
- tailwindcss-svg-helperadvisory1.18.0, 1.17.9
- tailwindcssssadvisory1.11.0, 1.10.0, 1.9.0 +17 more
- tw-fluid-typeadvisory1.0.1
- tw-style-utilsadvisory0.7.1, 0.7.0
Same blockchain loader, other disguises27 packages
- @hoteldev/commonadvisory1.0.9
- @kolbo/mcpLPM confirmed1.57.1
- @nasddatax/commonLPM confirmed1.0.21
- @nasdtickets/commonadvisory1.0.23
- @rentwise/commonadvisory1.0.36
- @simplipayng/checkoutadvisory1.4.3, 1.4.2
- @syncraft-labs/coreLPM confirmed0.4.1
- @syncraft-labs/reactLPM confirmed0.4.1
- @syncraft-labs/vueLPM confirmed0.4.1
- @vboxdev/commonLPM confirmed1.0.73
- @wizloft/harnessadvisory0.1.1-alpha.3
- @wizloft/harness-contextadvisory0.1.1-alpha.3
- @wizloft/harness-kerneladvisory0.1.1-alpha.3
- @wizloft/harness-plugin-repository-filesadvisory0.1.1-alpha.3
- @wizloft/harness-validationadvisory0.1.1-alpha.3
- @zahlen/checkout-angularadvisory0.1.4
- @zahlen/checkout-reactadvisory0.1.1
- anhn-cliLPM confirmed1.1.4
- bianira-uiadvisory1.27.0
- envpack-confadvisory1.0.1
- fetch-page-assetsLPM confirmed1.2.16, 1.2.15, 1.2.14 +5 more
- fsbrowseadvisory0.2.28
- godot-kitadvisory1.0.1786316795
- iconova-reactadvisory1.30.1, 1.30.0
- simplipayngadvisory1.0.8
- webdev-confadvisory5.0.0
- zenntechinc-cliadvisory1.6.6, 1.6.4
How we identified the packages
The list covers every npm package LPM Firewall blocks that presents itself as a Tailwind CSS or PostCSS plugin, utility or lookalike, by name, description or README, as of Nov 3, 2026. It adds the other blocked packages that carry the same blockchain loader. Compromised legitimate packages and dependency confusion probes are left out. The groups come from LPM's reviews and the advisory text for each package.
The packages share a disguise and, within each group, a technique, but not necessarily one publisher. The transaction count comes from the public Ethereum record for the sender address.
Read how LPM Firewall reports are produced, or browse more research.