Version 2.0.6 of the animatecss-tailwind-adapter npm package is malicious. npm replaced it with a security holding package on 20 October 2026. No patched release is listed.
A GitHub malware advisory and an OpenSSF malicious packages record describe it. Both tie it to a fake job interview campaign that sends developers a take-home coding test.
What happened
The npm account grant587holloway published animatecss-tailwind-adapter 2.0.6 on 28 July 2026 at 20:03 UTC. The registry preserves its publication date. On 20 October 2026, npm took over the package and published 0.0.1-security. The latest tag now points to that placeholder.
The GitHub advisory says the package is part of a fake job interview campaign. It uses the same method as the "Contagious Interview" campaign. A fake company sends the target a take-home coding assessment repository.
That repository commits a file at web/.npmrc. The file holds a plaintext npm auth token. The repository also has a tailwind.config.js that loads animatecss-tailwind-adapter as a Tailwind plugin.
The package presents itself as an Animate.css integration for Tailwind. Its main file is plugin.js. It declares a runtime dependency on a private scoped package, @aaron205whitmore/postcss-animate-utils.
Public scanners cannot see that private package. It resolves only with the npm token that the lure repository commits.
Both sources cite public analysis by Yunus Aydın of animatecss-tailwind-adapter, which the advisory calls the earlier package in the chain. That analysis reports that the private package contacts an operator-controlled server. It then runs the code it receives with full Node.js privileges. The advisory attributes that behavior to this analysis.
The package has no install scripts. For this reason, npm install --ignore-scripts does not stop it. The code runs when Tailwind loads its config, for example during npm run dev or next dev.
The GitHub advisory lists two more packages built from the same template. A different single-use npm account published each one. The repository field of animatecss-tailwind-adapter names the GitHub account sericpieap. animatecss-tailwind-bridge uses the same GitHub account. The advisory says neither repository is public.
The OpenSSF record MAL-2026-17665 went live on 7 October 2026 and credits juanda2222 as the finder. The GitHub advisory GHSA-v2r3-66q9-gmvw followed on 8 October 2026. Neither source marks the package as a test.
Affected versions
The affected release is animatecss-tailwind-adapter 2.0.6. The GitHub advisory lists these packages from the same template:
| Package | Version | Published | Private dependency |
|---|---|---|---|
animatecss-tailwind-adapter | 2.0.6 | 2026-07-28 | @aaron205whitmore/postcss-animate-utils |
animatecss-tailwind-bridge | 2.0.6 | 2026-09-13 | @jasperquinn/postcss-motion-helpers |
tailwind-animatecss-uniform | 2.0.7 | 2026-09-28 | @jasperquinn/postcss-motion-helpers |
The GitHub advisory lists no patched version. Treat every version of these packages as unsafe.
The npm registry now serves the security holding package 0.0.1-security. It is a placeholder, not a repaired release of the plugin.
Indicators of compromise
The sources list no domains, IP addresses or file hashes. They name these packages, accounts and files:
- npm packages
animatecss-tailwind-adapter,animatecss-tailwind-bridgeandtailwind-animatecss-uniform - Private npm scopes
@aaron205whitmoreand@jasperquinnin a lockfile - npm publisher account
grant587holloway - GitHub account
sericpieapin a package repository field - A committed
web/.npmrcfile that holds an npm auth token - A
tailwind.config.jsthat loads one of the packages above as a plugin - The package entry file
plugin.js
How to check
Search each project for the three package names and the two private scopes. Run these commands from the project root. They only read files.
npm ls animatecss-tailwind-adapter animatecss-tailwind-bridge tailwind-animatecss-uniform
grep -rnE "animatecss-tailwind-adapter|animatecss-tailwind-bridge|tailwind-animatecss-uniform|@aaron205whitmore|@jasperquinn" --include=package.json --include=package-lock.json --include=yarn.lock --include=pnpm-lock.yaml --include=tailwind.config.js .
Then look for committed .npmrc files that hold a token:
grep -rln "_authToken" --include=.npmrc .
If you ran a take-home coding test from an unknown company, check that folder first. A package-name match identifies a dependency to investigate. An .npmrc file alone does not prove infection. Do not print or share its token.
What to do now
- If you find any of the three packages, remove them from
package.jsonand delete the lockfile entries. - Delete the take-home test repository from your machine.
- If you ran
npm run dev,next devor a Tailwind build in that repository, treat the machine as compromised. The private dependency in this chain is reported to run server-supplied code with full Node.js privileges. - Rotate the npm tokens, GitHub tokens, cloud keys and SSH keys on that machine. Do this from a clean machine.
- Rotate any npm token that a repository commits in an
.npmrcfile. - Review your lockfiles for the
@aaron205whitmoreand@jasperquinnscopes.
What Vigilance would show (rebuilt from public reports)
Vigilance compares the version you trust with the new one and names the file that gained a new power. The block below is rebuilt from the public reports in the words Vigilance prints. It is not a captured scan, because the malicious release is not redistributed.
files scanned: 33 HEADS UP 1 file can now do things the old version could not. The rest changed and gained nothing. CHANGED plugin.js It now downloads from the internet, reads saved passwords and access keys and runs other programs. It did not before.
Frequently asked questions
Is animatecss-tailwind-adapter malware?
Yes. GitHub advisory GHSA-v2r3-66q9-gmvw and OpenSSF record MAL-2026-17665 list version 2.0.6 as malicious. npm replaced the package with a security placeholder on 20 October 2026.
Does --ignore-scripts protect against animatecss-tailwind-adapter?
No. The package has no install scripts. Its code runs when Tailwind loads the config, for example during npm run dev or next dev.
How does the fake job interview npm attack work?
A fake company sends a take-home coding test. The test repository commits an npm token and a Tailwind config that loads the package. The package pulls a private dependency that only that token can fetch.