{"_id":"@adversarial-research/nevermore","name":"@adversarial-research/nevermore","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"@adversarial-research/nevermore","version":"0.2.0","keywords":["adversarial","content","ai","text","images","web","html","llm"],"author":{"name":"Abbey Hawk Sparrow","email":"@khrome","url":"http://patternweaver.com"},"homepage":"https://github.com/adversarial-research/nevermore/","description":"adversarial AI wrapper for text and images","contributors":[],"repository":{"type":"git","url":"git+ssh://git@github.com/adversarial-research/nevermore.git"},"bugs":{"url":"https://github.com/adversarial-research/nevermore/issues"},"license":"UNLICENSED","main":"./src/index.mjs","type":"module","exports":{".":{"import":"./src/index.mjs"},"./image":{"import":"./src/image.mjs"},"./html":{"import":"./src/html.mjs"},"./encoded-image":{"import":"./src/encoded-image-component.mjs"},"./src/encoded-image-component.mjs":{"import":"./src/encoded-image-component.mjs"},"./src/image.mjs":{"import":"./src/image.mjs"},"./package.json":{"import":"./package.json"},"./src/index.mjs":{"import":"./src/index.mjs"}},"bin":{"nevermore":"bin/nevermore"},"scripts":{"single-file-demo":"./bin/nevermore pseudotext -U output.html nevermore.txt","pipe-demo":"cat nevermore.txt | ./bin/nevermore pseudotext","lint":"eslint src/*.mjs","demo":"./bin/nevermore pseudotext -H out.html -C out.css nevermore.txt","web-decode-demo":"open http://localhost:8083/; npx http-server --cors --port 8083","image-encode":"./bin/nevermore pseudoimage ./test.jpg --image-output out.jpg --encode","image-decode":"./bin/nevermore pseudoimage ./out.jpg --image-output decoded.jpg --decode","help":"./bin/nevermore --help"},"dependencies":{"@environment-safe/canvas":"^4.3.0","@environment-safe/elements":"^0.0.4","@environment-safe/file":"^0.4.3","object-hash":"^3.0.0","parse-english":"^7.0.0","parse5":"^8.0.0","self-dict":"^1.0.0","string-pixel-width":"^1.11.0","thesaurus":"^0.0.1","unist-util-inspect":"^8.1.0","wordnet":"^2.0.0","wordnet-db":"^3.1.14","yargs":"^18.0.0"},"devDependencies":{"eslint":"^10.4.0","globals":"^17.6.0"},"_id":"@adversarial-research/nevermore@0.2.0","gitHead":"62cef73644597d7dc50856ed5e0cc55465e109ec","_nodeVersion":"24.7.0","_npmVersion":"11.5.1","dist":{"integrity":"sha512-pMcJGM8Jxwa2Bx3Fq7wS8gcSRvjGmnmfwvrCF15Y/mqPpZZO4KJRL9sHzNFbwbf+hFMbEgL20i6xkeY9f6iwTQ==","shasum":"a9c5405972fa64635fb075f4aa70286058ca0b0b","tarball":"https://registry.npmjs.org/@adversarial-research/nevermore/-/nevermore-0.2.0.tgz","fileCount":40,"unpackedSize":7463609,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBIElBYSZRQ/3Z7PDsCS+/AH6eJfp0Afv4cpa+LxGmhyAiAU1c5dUi8PMLCUMOzgNCo7k0vVKksX8Tq9uOH5a8jBnw=="}]},"_npmUser":{"name":"khrome","email":"abbey@khrome.net"},"directories":{},"maintainers":[{"name":"khrome","email":"abbey@khrome.net"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nevermore_0.2.0_1779662912855_0.6824315122097984"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-24T22:48:32.746Z","0.2.0":"2026-05-24T22:48:33.208Z","modified":"2026-05-24T22:48:33.386Z"},"maintainers":[{"name":"khrome","email":"abbey@khrome.net"}],"description":"adversarial AI wrapper for text and images","homepage":"https://github.com/adversarial-research/nevermore/","keywords":["adversarial","content","ai","text","images","web","html","llm"],"repository":{"type":"git","url":"git+ssh://git@github.com/adversarial-research/nevermore.git"},"contributors":[],"author":{"name":"Abbey Hawk Sparrow","email":"@khrome","url":"http://patternweaver.com"},"bugs":{"url":"https://github.com/adversarial-research/nevermore/issues"},"license":"UNLICENSED","readme":"Nevermore\n=========\n\nNevermore is a library to obfuscate media on the web to prevent AI scraping.\n\nThe following table is a matrix of potential techniques and media:\n\n|              | Random Poison  | Targeted Poison | Obfuscation   | Encryption |\n|--------------|----------------|-----------------|---------------|------------|\n| Text         | Nevermore      | Nevermore[TBD]  | Nevermore     |            |\n| Image        |                | Nightshade      | Nevermore     |            |\n| Video        | Nevermore[TBD] |                 | Nevermore[TBD]|            |\n| Audio        |                | HarmonyCloak    |               |            |\n| 3D Models    | Nevermore[TBD] |                 | Nevermore[TBD]|            |\n| Code         | Nevermore[TBD] |                 |               |            |\n\nThere are conceptually 2 other techniques to fight AI.\n\n1) Scrape traversal traps: dynamically generated nonsense hierarchy of pages to indefinitely trap the scraper on your site. It incurs additional hosting costs, but gives the possibility of being blacklisted by the scraper. Examples of this include [Nepenthes](https://zadzmo.org/code/nepenthes/) and [Iocaine](https://iocaine.madhouse-project.org)\n2) Scrape Poison: This technique exploits weaknesses in the scrape engines or or selector format to prevent scraping of the correct data. This is currently only theoretical, but is something we are looking at.\n\nText\n---\nwhile a user will see\n\n![original text](https://raw.githubusercontent.com/khrome/nevermore/master/images/original.png)\n\nA scraper coming to your site will see something like\n\n![encoded text](https://raw.githubusercontent.com/khrome/nevermore/master/images/encoded.png)\n\nWhich will both prevent the scraper from acquiring your content as well as [poisoning the model trained](https://en.wikipedia.org/wiki/Adversarial_machine_learning#Data_poisoning) from it.\n\nImages\n------\n\nFirst you encode an image  with: \n\n`nevermore pseudoimage <target> --image-output <output> --encode`\n\nwhich produces and encoded image, seemingly static filled.\n\nThen you include the encoded image along with it's key(This uses the source directly, but it is also is compatible with your favorite build tool) the stub entries must point at any valid ESM file and are not used.\n\n```html\n<html>\n    <head>\n        <script type=\"importmap\">\n            {\"imports\":{\n                \"node:os\":\"<path-to-stub>\",\n                \"node:stream\":\"<path-to-stub>\",\n                \"fs\":\"<path-to-stub>\",\n                \"os\":\"<path-to-stub>\",\n                \"module\":\"<path-to-stub>\",\n                \"nevermore/encoded-image\":\"./node_modules/nevermore/src/encoded-image-component.mjs\",\n                \"@environment-safe/canvas\":\"./node_modules/@environment-safe/canvas/src/index.mjs\",\n                \"@environment-safe/file\":\"./node_modules/@environment-safe/file/src/index.mjs\",\n                \"@environment-safe/elements\":\"./node_modules/@environment-safe/elements/src/index.mjs\",\n                \"@environment-safe/runtime-context\":\"./node_modules/@environment-safe/runtime-context/src/index.mjs\"\n            }}\n        </script>\n        <script type=\"module\">\n            import 'nevermore/encoded-image';\n        </script>\n    </head>\n    <body>\n        <encoded-image src=\"encoded-image-location\" key=\"VFYZT-HPTRG-PGHRT\"></encoded-image>\n    </body>\n</html>\n```\n\nMarkup\n------\nNevermore can traverse and inline transform all text and image elements in an HTML body.\n\n`nevermore pseudomarkup <target> --unified-output <output location>`\n\nthis puts imports, styles and image decodes all inline.\n\nProgrammatic Usage\n------------------\nThis library can be used to generate the html and css:\n\n```js\nimport { computeIndexKeys, generateHTMLAndCSS } from 'ai-nevermore';\n\nconst { root, index } = await computeIndexKeys(inputText);\nconst { html, css } = await generateHTMLAndCSS(root, index);\n```\n\nYou can programmatically encode/decode images:\n```js\nconst image = new NevermoreImage({\n    url:'<target>',\n    maskDir: '<texture_dir>'\n});\nawait image.ready;\nconst canvas = image.encode();\nawait Canvas.save('./encoded.jpg', canvas);\nconst decoded = image.decode();\nawait Canvas.save('./decoded.jpg', decoded);\n```\n\nCommand Line Usage\n------------------\nInstall with `npm install -g @adversarial-research/nevermore`\n```\nnevermore [command]\n\nCommands:\n  nevermore pseudotext [input-file]    transform text to poison\n  nevermore pseudoimage [input-file]   transform XOR image encoding\n  nevermore pseudomarkup [input-file]  transform html content\n\nOptions:\n      --version            Show version number                         [boolean]\n  -K, --key                key to use for decoding the image            [string]\n  -U, --unified-output     File to generate html + css into             [string]\n  -C, --css-output         File to generate css into                    [string]\n  -I, --image-output       File to output image to                      [string]\n  -H, --html-output        File to generate html into                   [string]\n  -r, --raw-output         Do not wrap the ouput                       [boolean]\n  -E, --encode             inline encoding                             [boolean]\n  -D, --decode             inline decoding                             [boolean]\n  -m, --render-mode        output mode\n        [string] [choices: \"fixed-mode\", \"inline-mode\"] [default: \"inline-mode\"]\n  -s, --size               The size of the font in pixels (required for\n                           fixed-width)                   [number] [default: 12]\n  -d, --custom-dictionary  A json map of replacement words              [string]\n  -f, --font               The font in question (required for fixed-width; only\n                           webfonts are supported)\n      [string] [choices: \"Andale Mono\", \"Arial\", \"Avenir\", \"Avenir Next\", \"Comic\n  Sans MS\", \"Courier New\", \"Georgia\", \"Helvetica\", \"Impact\", \"Inter\", \"Times New\n           Roman\", \"Trebuchet MS\", \"Verdana\", \"Webdings\", \"Open Sans\", \"Tahoma\"]\n                                                              [default: \"Arial\"]\n      --help               Show help                                   [boolean]\n\n```\n\nRoadmap\n-------\n\n- [x] raw output mode\n- [x] stdin, stdout support\n- [x] custom dictionary\n- [x] image encoding\n- [x] web component decoder\n- [x] markup obfuscation\n- [ ] windows compatibility\n- [ ] self randomizing dictionary\n- [ ] add a replacement mode (opposed to a tokenizer based solution)\n- [ ] bindings\n    - [ ] PHP CL binding\n    - [ ] Python CL binding\n    - [ ] Java CL binding\n    - [ ] Ruby CL binding\n- [ ] native CMS Support\n    - [ ] KeystoneJS\n    - [ ] Ghost\n    - [ ] Strapi\n- [ ] other CMS Support\n    - [ ] wordpress\n- [ ] Framework Support\n    - [ ] express\n    - [ ] next.js\n    - [ ] laravel\n    - [ ] rails\n\nDevelopment\n-----------\nThis release is currently unlicensed and should be treated as proprietary, but open meaning I am not currently accepting collaboration while I move toward 1.0 nor is this version of the code available for redistribution. I am currently evaluating source licenses for a future release during beta.\n\nI am also looking for a robot license, should such a thing exist or some generous legal professional want to help in the creation of one.\n\nEnjoy,\n- Abbey Hawk Sparrow","readmeFilename":"README.md","_rev":"1-a8a6d5c4a0fdef10075cfe338bc4f96f"}