{"_id":"gg-friggin-ez","_rev":"13-c10e239991ee4b947df15494e60d6a92","name":"gg-friggin-ez","dist-tags":{"latest":"0.1.14"},"versions":{"0.1.0":{"name":"gg-friggin-ez","version":"0.1.0","keywords":["profanity","profanity-filter","bad-words","badwords","censor","censorship","curse-words","swear-words","swearing","toxicity","toxic","hate-speech","harassment","moderation","content-moderation","chat-moderation","text-moderation","anti-toxicity","leetspeak","obfuscation","indic","hinglish","tanglish","benglish","tenglish","kanglish","manglish","transliteration","code-mixed","romanized","jev","typesafe","openrouter"],"author":{"url":"https://www.linkedin.com/in/itisshikhar/","name":"Shikhar Srivastava","email":"shikhar.cs.eng@gmail.com"},"license":"MIT","_id":"gg-friggin-ez@0.1.0","maintainers":[{"name":"itisshikhar","email":"shikhar.cs.eng@gmail.com"}],"homepage":"https://github.com/ItisShikhar/gg-friggin-ez#readme","bugs":{"url":"https://github.com/ItisShikhar/gg-friggin-ez/issues","email":"shikhar.cs.eng@gmail.com"},"dist":{"shasum":"db622d19753056d407e5f45c6397c7cdcfa8310f","tarball":"https://registry.npmjs.org/gg-friggin-ez/-/gg-friggin-ez-0.1.0.tgz","fileCount":7,"integrity":"sha512-E9qhmig1n31P1atTKMR0j0RR7Fvaz3fjLXlaUB3WBPjUfNKJilqU+jgviIzJJ18rHW6ug3QpEfzL/MkaTEAfKg==","signatures":[{"sig":"MEQCIAIE/6hFyGK1nW2w5HdGh8YOOeFSywh5BOFyd8nmZnX8AiBBmnrcV0ksppDp5Tjs0cSXotI+l6RSBG1GdE2VAMaJPw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65036},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"b140cac199b635593f1fff349c69f9c5c2757302","scripts":{"dev":"bun --watch src/server.ts","demo":"bun run src/server.ts","test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --out-dir dist --clean --tsconfig tsconfig.build.json && node scripts/build-demo.js","start":"bun run src/server.ts","demo:dev":"bun --watch src/server.ts","build:demo":"node scripts/build-demo.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"itisshikhar","email":"shikhar.cs.eng@gmail.com"},"repository":{"url":"git+https://github.com/ItisShikhar/gg-friggin-ez.git","type":"git"},"_npmVersion":"9.6.5","description":"Fast, drop-in profanity and toxicity screener for Node.js, powered by TypeSafe AI Jev. Catches leetspeak, character spacing, and romanized profanity across languages including Kannada, Telugu, Tamil, Hindi, and Bengali. ~50-500ms latency.","directories":{},"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","@types/bun":"latest","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/gg-friggin-ez_0.1.0_1789815789653_0.03962521791800788","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"gg-friggin-ez","version":"0.1.3","keywords":["profanity","profanity-filter","bad-words","badwords","censor","censorship","curse-words","swear-words","swearing","toxicity","toxic","hate-speech","harassment","moderation","content-moderation","chat-moderation","text-moderation","anti-toxicity","leetspeak","obfuscation","indic","hinglish","tanglish","benglish","tenglish","kanglish","manglish","transliteration","code-mixed","romanized","jev","typesafe","openrouter"],"author":{"url":"https://www.linkedin.com/in/itisshikhar/","name":"Shikhar Srivastava","email":"shikhar.cs.eng@gmail.com"},"license":"MIT","_id":"gg-friggin-ez@0.1.3","maintainers":[{"name":"itisshikhar","email":"shikhar.cs.eng@gmail.com"}],"homepage":"https://github.com/ItisShikhar/gg-friggin-ez#readme","bugs":{"url":"https://github.com/ItisShikhar/gg-friggin-ez/issues","email":"shikhar.cs.eng@gmail.com"},"dist":{"shasum":"e7a3b5140300dc31b1916af71e252ca920892895","tarball":"https://registry.npmjs.org/gg-friggin-ez/-/gg-friggin-ez-0.1.3.tgz","fileCount":7,"integrity":"sha512-y9nqp7cyZrB/IMvaPqLDoYm9qAHd34tpodoEqWaMCscfyn/zjVk/PfcMXDAuH9kYYMpZcr3CrEgIs+oX8KcB0g==","signatures":[{"sig":"MEQCIHAkyiTRCNs+ia9t0/TfMfAEDyEEN79WrawSHu7gY9LrAiAJYC8xASWFVf0V0u5zd6o4sywKzlBFMRxz+zL4mV7Wrw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDeI4UD4fwDPP0/r76824c907gxsCJiEj8UTn3G3BXp8QIgVnttQ7fQ0HWe57kp7oPHOCsvbQ236WLwEUHgIhV3fPM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/gg-friggin-ez@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":64903},"main":"./dist/index.cjs","type":"module","_from":"file:npm-package/gg-friggin-ez-0.1.3.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"bun --watch src/server.ts","demo":"bun run src/server.ts","test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --out-dir dist --clean --tsconfig tsconfig.build.json && node scripts/build-demo.js","start":"bun run src/server.ts","demo:dev":"bun --watch src/server.ts","build:demo":"node scripts/build-demo.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d864df08-462f-4cfd-bdeb-57f7d2cb49d4"}},"_resolved":"/home/runner/work/gg-friggin-ez/gg-friggin-ez/npm-package/gg-friggin-ez-0.1.3.tgz","_integrity":"sha512-y9nqp7cyZrB/IMvaPqLDoYm9qAHd34tpodoEqWaMCscfyn/zjVk/PfcMXDAuH9kYYMpZcr3CrEgIs+oX8KcB0g==","repository":{"url":"git+https://github.com/ItisShikhar/gg-friggin-ez.git","type":"git"},"_npmVersion":"11.19.0","description":"Fast, drop-in profanity and toxicity screener for Node.js, powered by TypeSafe AI Jev. Catches leetspeak, character spacing, and romanized profanity across languages including Kannada, Telugu, Tamil, Hindi, and Bengali. ~50-500ms latency.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","@types/bun":"latest","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/gg-friggin-ez_0.1.3_1789818034259_0.8153029870434472","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"gg-friggin-ez","version":"0.1.4","keywords":["profanity","profanity-filter","bad-words","badwords","censor","censorship","curse-words","swear-words","swearing","toxicity","toxic","hate-speech","harassment","moderation","content-moderation","chat-moderation","text-moderation","anti-toxicity","leetspeak","obfuscation","indic","hinglish","tanglish","benglish","tenglish","kanglish","manglish","transliteration","code-mixed","romanized","jev","typesafe","openrouter"],"author":{"url":"https://www.linkedin.com/in/itisshikhar/","name":"Shikhar Srivastava","email":"shikhar.cs.eng@gmail.com"},"license":"MIT","_id":"gg-friggin-ez@0.1.4","maintainers":[{"name":"itisshikhar","email":"shikhar.cs.eng@gmail.com"}],"homepage":"https://github.com/ItisShikhar/gg-friggin-ez#readme","bugs":{"url":"https://github.com/ItisShikhar/gg-friggin-ez/issues","email":"shikhar.cs.eng@gmail.com"},"dist":{"shasum":"851534283dabafa086f5a13e9c2a35a7ab025dfa","tarball":"https://registry.npmjs.org/gg-friggin-ez/-/gg-friggin-ez-0.1.4.tgz","fileCount":7,"integrity":"sha512-iDUs8LQ6qj602h48UEnxUiau3G1Smzly1WPvJe4vdaBvN8GOhGaQGoPbw7HQSgxoZr8HdzVTKQ4ldXUCT3C7xA==","signatures":[{"sig":"MEYCIQCynJzhyIZ9RLagTKYLH6jY1UkzFq9iUJc4j6otTVRklAIhANIu3QdfVhP04oyYY/laJ9gz19zfb8GlvDL6isTLWLrh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFoYAf5fKSw8tkFi3RWzu6rsIzQ1N8prBIzoR38sceXeAiEA3WaAaANHaXImvokbu4Gds5qS14MHXYmtuIaGbNbHm4E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/gg-friggin-ez@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":64903},"main":"./dist/index.cjs","type":"module","_from":"file:npm-package/gg-friggin-ez-0.1.4.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"bun --watch src/server.ts","demo":"bun run src/server.ts","test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --out-dir dist --clean --tsconfig tsconfig.build.json && node scripts/build-demo.js","start":"bun run src/server.ts","demo:dev":"bun --watch src/server.ts","build:demo":"node scripts/build-demo.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d864df08-462f-4cfd-bdeb-57f7d2cb49d4"}},"_resolved":"/home/runner/work/gg-friggin-ez/gg-friggin-ez/npm-package/gg-friggin-ez-0.1.4.tgz","_integrity":"sha512-iDUs8LQ6qj602h48UEnxUiau3G1Smzly1WPvJe4vdaBvN8GOhGaQGoPbw7HQSgxoZr8HdzVTKQ4ldXUCT3C7xA==","repository":{"url":"git+https://github.com/ItisShikhar/gg-friggin-ez.git","type":"git"},"_npmVersion":"11.19.0","description":"Fast, drop-in profanity and toxicity screener for Node.js, powered by TypeSafe AI Jev. Catches leetspeak, character spacing, and romanized profanity across languages including Kannada, Telugu, Tamil, Hindi, and Bengali. ~50-500ms latency.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","@types/bun":"latest","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/gg-friggin-ez_0.1.4_1789853694215_0.3236187950443359","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"gg-friggin-ez","version":"0.1.5","keywords":["profanity","profanity-filter","bad-words","badwords","censor","censorship","curse-words","swear-words","swearing","toxicity","toxic","hate-speech","harassment","moderation","content-moderation","chat-moderation","text-moderation","anti-toxicity","leetspeak","obfuscation","indic","hinglish","tanglish","benglish","tenglish","kanglish","manglish","transliteration","code-mixed","romanized","jev","typesafe","openrouter"],"author":{"url":"https://www.linkedin.com/in/itisshikhar/","name":"Shikhar Srivastava","email":"shikhar.cs.eng@gmail.com"},"license":"MIT","_id":"gg-friggin-ez@0.1.5","maintainers":[{"name":"itisshikhar","email":"shikhar.cs.eng@gmail.com"}],"homepage":"https://github.com/ItisShikhar/gg-friggin-ez#readme","bugs":{"url":"https://github.com/ItisShikhar/gg-friggin-ez/issues","email":"shikhar.cs.eng@gmail.com"},"dist":{"shasum":"d4917fdd3467a4d6beba7a11219e3783f615ab0a","tarball":"https://registry.npmjs.org/gg-friggin-ez/-/gg-friggin-ez-0.1.5.tgz","fileCount":7,"integrity":"sha512-4rFiYjLeFcATycSkW+yF8E4VvnqYU4/aCrpH91gMnjAiGRMXe0HpwDlVguM/dY2xDMpHAfcdNvitdx6gPiTi9Q==","signatures":[{"sig":"MEUCICDXKhLHlEim+G03FBeXcmzV3nYujECHae4DACHP996bAiEAtdLmli/wlZXUogaYi7xBCPCqbl/qvJO0ec58AosJLLY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQChQo+2nHkEqMocmmf1u2zw84jha67X/ibX1KYqhFhhNQIhAOL4mLZriYgirZkpHz8uSfyY2Mle9gizqwMTgifvypNL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/gg-friggin-ez@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":64903},"main":"./dist/index.cjs","type":"module","_from":"file:npm-package/gg-friggin-ez-0.1.5.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"bun --watch src/server.ts","demo":"bun run src/server.ts","test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --out-dir dist --clean --tsconfig tsconfig.build.json && node scripts/build-demo.js","start":"bun run src/server.ts","demo:dev":"bun --watch src/server.ts","build:demo":"node scripts/build-demo.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d864df08-462f-4cfd-bdeb-57f7d2cb49d4"}},"_resolved":"/home/runner/work/gg-friggin-ez/gg-friggin-ez/npm-package/gg-friggin-ez-0.1.5.tgz","_integrity":"sha512-4rFiYjLeFcATycSkW+yF8E4VvnqYU4/aCrpH91gMnjAiGRMXe0HpwDlVguM/dY2xDMpHAfcdNvitdx6gPiTi9Q==","repository":{"url":"git+https://github.com/ItisShikhar/gg-friggin-ez.git","type":"git"},"_npmVersion":"11.19.0","description":"Fast, drop-in profanity and toxicity screener for Node.js, powered by TypeSafe AI Jev. Catches leetspeak, character spacing, and romanized profanity across languages including Kannada, Telugu, Tamil, Hindi, and Bengali. ~50-500ms latency.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","@types/bun":"latest","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/gg-friggin-ez_0.1.5_1790035197455_0.3718613962122663","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"gg-friggin-ez","version":"0.1.6","keywords":["profanity","profanity-filter","bad-words","badwords","censor","censorship","curse-words","swear-words","swearing","toxicity","toxic","hate-speech","harassment","moderation","content-moderation","chat-moderation","text-moderation","anti-toxicity","leetspeak","obfuscation","indic","hinglish","tanglish","benglish","tenglish","kanglish","manglish","transliteration","code-mixed","romanized","jev","typesafe","openrouter"],"author":{"url":"https://www.linkedin.com/in/itisshikhar/","name":"Shikhar Srivastava","email":"shikhar.cs.eng@gmail.com"},"license":"MIT","_id":"gg-friggin-ez@0.1.6","maintainers":[{"name":"itisshikhar","email":"shikhar.cs.eng@gmail.com"}],"homepage":"https://github.com/ItisShikhar/gg-friggin-ez#readme","bugs":{"url":"https://github.com/ItisShikhar/gg-friggin-ez/issues","email":"shikhar.cs.eng@gmail.com"},"dist":{"shasum":"9affe10b623b13267789ba0879e02088418e909a","tarball":"https://registry.npmjs.org/gg-friggin-ez/-/gg-friggin-ez-0.1.6.tgz","fileCount":7,"integrity":"sha512-KxJ050xppQwUB1C7GCGXr+PX1nrb7e1juqQRT0zpLltswyGBXmUTW5RgXgEDjwnJM87tfRAL92OBiazE++en9A==","signatures":[{"sig":"MEUCIQC+Xl+tQvNnxvYIr+kGzjN3qJaOqc3UIzEn99OhcDUhAAIgZdImfCCPbnxVIVuQAHV3vy/m0s3Hjq/t1f/tOBNU1vk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDtK+C883N6fJeRPU5vFzPFnQTPRmfhSLQGtI0Sv16+wAiBe92XN9AUS/fOql/z0DAXPJAHZ4qvmHXzH5zkbSaseig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/gg-friggin-ez@0.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":69749},"main":"./dist/index.cjs","type":"module","_from":"file:npm-package/gg-friggin-ez-0.1.6.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"bun --watch src/server.ts","demo":"bun run src/server.ts","test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --out-dir dist --clean --tsconfig tsconfig.build.json && node scripts/build-demo.js","start":"bun run src/server.ts","demo:dev":"bun --watch src/server.ts","build:demo":"node scripts/build-demo.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d864df08-462f-4cfd-bdeb-57f7d2cb49d4"}},"_resolved":"/home/runner/work/gg-friggin-ez/gg-friggin-ez/npm-package/gg-friggin-ez-0.1.6.tgz","_integrity":"sha512-KxJ050xppQwUB1C7GCGXr+PX1nrb7e1juqQRT0zpLltswyGBXmUTW5RgXgEDjwnJM87tfRAL92OBiazE++en9A==","repository":{"url":"git+https://github.com/ItisShikhar/gg-friggin-ez.git","type":"git"},"_npmVersion":"11.19.0","description":"Fast, drop-in profanity and toxicity screener for Node.js, powered by TypeSafe AI Jev. Catches leetspeak, character spacing, and romanized profanity across languages including Kannada, Telugu, Tamil, Hindi, and Bengali. ~50-500ms latency.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","@types/bun":"latest","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/gg-friggin-ez_0.1.6_1790037165521_0.47575881957121235","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"gg-friggin-ez","version":"0.1.7","keywords":["profanity","profanity-filter","bad-words","badwords","censor","censorship","curse-words","swear-words","swearing","toxicity","toxic","hate-speech","harassment","moderation","content-moderation","chat-moderation","text-moderation","anti-toxicity","leetspeak","obfuscation","indic","hinglish","tanglish","benglish","tenglish","kanglish","manglish","transliteration","code-mixed","romanized","jev","typesafe","openrouter"],"author":{"url":"https://www.linkedin.com/in/itisshikhar/","name":"Shikhar Srivastava","email":"shikhar.cs.eng@gmail.com"},"license":"MIT","_id":"gg-friggin-ez@0.1.7","maintainers":[{"name":"itisshikhar","email":"shikhar.cs.eng@gmail.com"}],"homepage":"https://github.com/ItisShikhar/gg-friggin-ez#readme","bugs":{"url":"https://github.com/ItisShikhar/gg-friggin-ez/issues","email":"shikhar.cs.eng@gmail.com"},"dist":{"shasum":"49a6ab79519a419ba3249f2bb8dc650c43f59162","tarball":"https://registry.npmjs.org/gg-friggin-ez/-/gg-friggin-ez-0.1.7.tgz","fileCount":7,"integrity":"sha512-863GOvufnAJZPOtE4i9VDkkVCicho6kx8fluyya3LPdsqZ51zVx06yjRZwwShdKPkM5wv1m+sDqc+jMJRqMgkw==","signatures":[{"sig":"MEUCIQDJfN4cKqmwIrshlMuT9MN5yR6C1UBjlRVD4goeYoO8jAIgexsamGvKD6E0lAH15BLfZEqUrpXnFkCfZhHdPM/eCAg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHzybNcJDMV3v6L4b9Qw9y2Or5kdLJxhPMh2Fe1MbKMEAiEAhjXgsC5Gn1QUpH9uzZ8NFKXZ3MG49R2N+MeIfJNB+20=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/gg-friggin-ez@0.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":71795},"main":"./dist/index.cjs","type":"module","_from":"file:npm-package/gg-friggin-ez-0.1.7.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"bun --watch src/server.ts","demo":"bun run src/server.ts","test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --out-dir dist --clean --tsconfig tsconfig.build.json && node scripts/build-demo.js","start":"bun run src/server.ts","demo:dev":"bun --watch src/server.ts","build:demo":"node scripts/build-demo.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d864df08-462f-4cfd-bdeb-57f7d2cb49d4"}},"_resolved":"/home/runner/work/gg-friggin-ez/gg-friggin-ez/npm-package/gg-friggin-ez-0.1.7.tgz","_integrity":"sha512-863GOvufnAJZPOtE4i9VDkkVCicho6kx8fluyya3LPdsqZ51zVx06yjRZwwShdKPkM5wv1m+sDqc+jMJRqMgkw==","repository":{"url":"git+https://github.com/ItisShikhar/gg-friggin-ez.git","type":"git"},"_npmVersion":"11.19.0","description":"Fast, drop-in profanity and toxicity screener for Node.js, powered by TypeSafe AI Jev. Catches leetspeak, character spacing, and romanized profanity across languages including Kannada, Telugu, Tamil, Hindi, and Bengali. ~50-500ms latency.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","@types/bun":"latest","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/gg-friggin-ez_0.1.7_1790039037141_0.9764338138541262","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"gg-friggin-ez","version":"0.1.8","keywords":["profanity","profanity-filter","bad-words","abusive-words","censor","swear-words","toxicity","toxic","hate-speech","harassment","moderation","content-moderation","chat-moderation","game-chat","game-chat-moderation","game-chat-filter","text-moderation","realtime-moderation","ai-moderation","moderation-api","moderation-sdk","chat-filter","toxicity-detection","multiplayer-chat","live-chat-moderation","harassment-detection","hate-speech-detection","player-safety","trust-and-safety","online-safety","esports-safety","valorant","csgo","counter-strike-2","cs2","league-of-legends","discord-moderation","telegram-moderation","twitch-chat-moderation","tiktok-live","live-stream-moderation","customer-support-moderation","marketplace-chat","alibaba-chat-moderation","dating-chat-moderation","tinder-chat-moderation","hinge-chat-moderation","rideshare-chat-moderation","uber-chat-moderation","ai-agent-moderation","agent-output-screening","chatbot-moderation","llm-output-moderation","user-generated-content-moderation","community-moderation","leetspeak","obfuscated-text","multilingual-moderation","romanized-profanity","indian-language-moderation","indic-profanity-filter","bengali","malayalam","hindi","tamil","telugu","kannada","marathi","punjabi","gujarati","bhojpuri","indic","hinglish","tanglish","benglish","tenglish","kanglish","manglish","transliteration","code-mixed","romanized","jev","typesafe","openrouter"],"author":{"url":"https://www.linkedin.com/in/itisshikhar/","name":"Shikhar Srivastava","email":"shikhar.cs.eng@gmail.com"},"license":"MIT","_id":"gg-friggin-ez@0.1.8","maintainers":[{"name":"itisshikhar","email":"shikhar.cs.eng@gmail.com"}],"homepage":"https://github.com/ItisShikhar/gg-friggin-ez#readme","bugs":{"url":"https://github.com/ItisShikhar/gg-friggin-ez/issues","email":"shikhar.cs.eng@gmail.com"},"dist":{"shasum":"5de8503e8b96a62d04097fd215080d023b410206","tarball":"https://registry.npmjs.org/gg-friggin-ez/-/gg-friggin-ez-0.1.8.tgz","fileCount":7,"integrity":"sha512-GAEmb8eJurzHRbkK6kwVJW5PaPa4dP0kxlXRmbQknuFPRRi2QtOxVtVaFIIJUkiCVJb/b/GMnsD2nwHR4/7D0A==","signatures":[{"sig":"MEYCIQDyVUKBSFW3ahNksO3c9uQVbaD13ufbo0qAOmdwVZzvsAIhAKDTuet91uUKP8IhcqtXU+ZBh3k05LcG2/FSUXvx6GET","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDSpoMqwm/sZKwl3R8NqoPJh8r/ErdKL41y9M5n+vf4TAIhAK79jTSbN5Lsx4AgRsUFTX+eR892OG+5PcgbygPbNuBQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/gg-friggin-ez@0.1.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":74501},"main":"./dist/index.cjs","type":"module","_from":"file:npm-package/gg-friggin-ez-0.1.8.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"bun --watch src/server.ts","demo":"bun run src/server.ts","test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --out-dir dist --clean --tsconfig tsconfig.build.json && node scripts/build-demo.js","start":"bun run src/server.ts","demo:dev":"bun --watch src/server.ts","build:demo":"node scripts/build-demo.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d864df08-462f-4cfd-bdeb-57f7d2cb49d4"}},"_resolved":"/home/runner/work/gg-friggin-ez/gg-friggin-ez/npm-package/gg-friggin-ez-0.1.8.tgz","_integrity":"sha512-GAEmb8eJurzHRbkK6kwVJW5PaPa4dP0kxlXRmbQknuFPRRi2QtOxVtVaFIIJUkiCVJb/b/GMnsD2nwHR4/7D0A==","repository":{"url":"git+https://github.com/ItisShikhar/gg-friggin-ez.git","type":"git"},"_npmVersion":"11.19.0","description":"Fast, drop-in multilingual profanity and toxicity screener for Node.js, powered by TypeSafe AI Jev. Catches leetspeak, character spacing, and romanized profanity across languages including Kannada, Telugu, Tamil, Hindi, and Bengali. ~50-500ms latency.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","@types/bun":"latest","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/gg-friggin-ez_0.1.8_1790042452629_0.9411605383475521","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"gg-friggin-ez","version":"0.1.9","keywords":["profanity","profanity-filter","bad-words","abusive-words","censor","swear-words","toxicity","toxic","hate-speech","harassment","moderation","content-moderation","chat-moderation","game-chat","game-chat-moderation","game-chat-filter","text-moderation","realtime-moderation","ai-moderation","moderation-api","moderation-sdk","chat-filter","toxicity-detection","multiplayer-chat","live-chat-moderation","harassment-detection","hate-speech-detection","player-safety","trust-and-safety","online-safety","esports-safety","valorant","csgo","counter-strike-2","cs2","league-of-legends","discord-moderation","telegram-moderation","twitch-chat-moderation","tiktok-live","live-stream-moderation","customer-support-moderation","marketplace-chat","alibaba-chat-moderation","dating-chat-moderation","tinder-chat-moderation","hinge-chat-moderation","rideshare-chat-moderation","uber-chat-moderation","ai-agent-moderation","agent-output-screening","chatbot-moderation","llm-output-moderation","user-generated-content-moderation","community-moderation","leetspeak","obfuscated-text","multilingual-moderation","romanized-profanity","indian-language-moderation","indic-profanity-filter","bengali","malayalam","hindi","tamil","telugu","kannada","marathi","punjabi","gujarati","bhojpuri","indic","hinglish","tanglish","benglish","tenglish","kanglish","manglish","transliteration","code-mixed","romanized","jev","typesafe","openrouter"],"author":{"url":"https://www.linkedin.com/in/itisshikhar/","name":"Shikhar Srivastava","email":"shikhar.cs.eng@gmail.com"},"license":"MIT","_id":"gg-friggin-ez@0.1.9","maintainers":[{"name":"itisshikhar","email":"shikhar.cs.eng@gmail.com"}],"homepage":"https://github.com/ItisShikhar/gg-friggin-ez#readme","bugs":{"url":"https://github.com/ItisShikhar/gg-friggin-ez/issues","email":"shikhar.cs.eng@gmail.com"},"dist":{"shasum":"04f851b1330a187e4b0c95a07a3c3e7f4eb8ae93","tarball":"https://registry.npmjs.org/gg-friggin-ez/-/gg-friggin-ez-0.1.9.tgz","fileCount":7,"integrity":"sha512-7uFAEYddWMn4PGM5ncIH4c3ReojCKVk4MhN52Y7xijOKUPGJP8kVihcur1i5nwou4mC9cPwHOCNoSJcIyb1A8Q==","signatures":[{"sig":"MEUCIApNWNrJtzBnv3E3iyjgTUOlSWgPc34f49TqgOxSRGefAiEA9ZcegN0WWy4g7XKySdX+mgiiKMloiaL0yshb1A3roQI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDMlh16GqLUUU6MyVZGkVZJkNY6DznH0WqTLW6OJYwKLAiADBt4gG42MpEgn65gIygs/uWEkU4oOKu8ERVldOry/uw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/gg-friggin-ez@0.1.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":74484},"main":"./dist/index.cjs","type":"module","_from":"file:npm-package/gg-friggin-ez-0.1.9.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"bun --watch src/server.ts","demo":"bun run src/server.ts","test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --out-dir dist --clean --tsconfig tsconfig.build.json && node scripts/build-demo.js","start":"bun run src/server.ts","demo:dev":"bun --watch src/server.ts","build:demo":"node scripts/build-demo.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d864df08-462f-4cfd-bdeb-57f7d2cb49d4"}},"_resolved":"/home/runner/work/gg-friggin-ez/gg-friggin-ez/npm-package/gg-friggin-ez-0.1.9.tgz","_integrity":"sha512-7uFAEYddWMn4PGM5ncIH4c3ReojCKVk4MhN52Y7xijOKUPGJP8kVihcur1i5nwou4mC9cPwHOCNoSJcIyb1A8Q==","repository":{"url":"git+https://github.com/ItisShikhar/gg-friggin-ez.git","type":"git"},"_npmVersion":"11.19.0","description":"Fast, drop-in multilingual profanity and toxicity screener for Node.js, powered by TypeSafe AI Jev. Catches leetspeak, character spacing, and romanized profanity across languages including Kannada, Telugu, Tamil, Hindi, and Bengali. ~50-500ms latency.","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","@types/bun":"latest","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/gg-friggin-ez_0.1.9_1790042661333_0.37150849738893776","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"gg-friggin-ez","version":"0.1.10","keywords":["profanity","profanity-filter","bad-words","abusive-words","censor","swear-words","toxicity","toxic","hate-speech","harassment","moderation","content-moderation","chat-moderation","game-chat","game-chat-moderation","game-chat-filter","text-moderation","realtime-moderation","ai-moderation","moderation-api","moderation-sdk","chat-filter","toxicity-detection","multiplayer-chat","live-chat-moderation","harassment-detection","hate-speech-detection","player-safety","trust-and-safety","online-safety","esports-safety","valorant","csgo","counter-strike-2","cs2","league-of-legends","discord-moderation","telegram-moderation","twitch-chat-moderation","tiktok-live","live-stream-moderation","customer-support-moderation","marketplace-chat","alibaba-chat-moderation","dating-chat-moderation","tinder-chat-moderation","hinge-chat-moderation","rideshare-chat-moderation","uber-chat-moderation","ai-agent-moderation","agent-output-screening","chatbot-moderation","llm-output-moderation","user-generated-content-moderation","community-moderation","leetspeak","obfuscated-text","multilingual-moderation","romanized-profanity","indian-language-moderation","indic-profanity-filter","bengali","malayalam","hindi","tamil","telugu","kannada","marathi","punjabi","gujarati","bhojpuri","indic","hinglish","tanglish","benglish","tenglish","kanglish","manglish","transliteration","code-mixed","romanized","jev","typesafe","openrouter"],"author":{"url":"https://www.linkedin.com/in/itisshikhar/","name":"Shikhar Srivastava","email":"shikhar.cs.eng@gmail.com"},"license":"MIT","_id":"gg-friggin-ez@0.1.10","maintainers":[{"name":"itisshikhar","email":"shikhar.cs.eng@gmail.com"}],"homepage":"https://github.com/ItisShikhar/gg-friggin-ez#readme","bugs":{"url":"https://github.com/ItisShikhar/gg-friggin-ez/issues","email":"shikhar.cs.eng@gmail.com"},"dist":{"shasum":"5fe208b86b4492c210f2355fc6cbb960f72542c6","tarball":"https://registry.npmjs.org/gg-friggin-ez/-/gg-friggin-ez-0.1.10.tgz","fileCount":7,"integrity":"sha512-AcwjcFtwk03NAC/FHUU/4W/6U7ukxJ0g87f+s0scX79UUOcUFJBj4sCKMrq8qLZqGlpXGK9AViT0GHCR7CRhbA==","signatures":[{"sig":"MEQCIGLcMVS7ceyWRQajPmbf7LVBNOXj8WV9e6QiZSghX3fZAiA1KTwbm8YjOjRHlCLNSV8nnGwCqhNCWPDXtxf2tL9gKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIENuRqv9KHPBBBUs2pD3uGTFGIE9kQlrquemo15MeuPKAiAmPHUXTLQ6cISRY4vioJSXsulzjC1vhSdtwXRjcTnxGg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/gg-friggin-ez@0.1.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":73081},"main":"./dist/index.cjs","type":"module","_from":"file:npm-package/gg-friggin-ez-0.1.10.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"bun --watch src/server.ts","demo":"bun run src/server.ts","test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --out-dir dist --clean --tsconfig tsconfig.build.json && node scripts/build-demo.js","start":"bun run src/server.ts","demo:dev":"bun --watch src/server.ts","build:demo":"node scripts/build-demo.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d864df08-462f-4cfd-bdeb-57f7d2cb49d4"}},"_resolved":"/home/runner/work/gg-friggin-ez/gg-friggin-ez/npm-package/gg-friggin-ez-0.1.10.tgz","_integrity":"sha512-AcwjcFtwk03NAC/FHUU/4W/6U7ukxJ0g87f+s0scX79UUOcUFJBj4sCKMrq8qLZqGlpXGK9AViT0GHCR7CRhbA==","repository":{"url":"git+https://github.com/ItisShikhar/gg-friggin-ez.git","type":"git"},"_npmVersion":"11.19.0","description":"Fast, drop-in multilingual profanity and toxicity screener for Node.js, powered by System 1 models like TypeSafe AI Jev and Laya. Catches leetspeak, character spacing, and romanized profanity across languages including Kannada, Telugu, Tamil, Hindi, and B","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","@types/bun":"latest","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/gg-friggin-ez_0.1.10_1790059948376_0.9578494043054946","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"gg-friggin-ez","version":"0.1.11","keywords":["profanity","profanity-filter","bad-words","abusive-words","censor","swear-words","toxicity","toxic","hate-speech","harassment","moderation","content-moderation","chat-moderation","game-chat","game-chat-moderation","game-chat-filter","text-moderation","realtime-moderation","ai-moderation","moderation-api","moderation-sdk","chat-filter","toxicity-detection","multiplayer-chat","live-chat-moderation","harassment-detection","hate-speech-detection","player-safety","trust-and-safety","online-safety","esports-safety","valorant","csgo","counter-strike-2","cs2","league-of-legends","discord-moderation","telegram-moderation","twitch-chat-moderation","tiktok-live","live-stream-moderation","customer-support-moderation","marketplace-chat","alibaba-chat-moderation","dating-chat-moderation","tinder-chat-moderation","hinge-chat-moderation","rideshare-chat-moderation","uber-chat-moderation","ai-agent-moderation","agent-output-screening","chatbot-moderation","llm-output-moderation","user-generated-content-moderation","community-moderation","leetspeak","obfuscated-text","multilingual-moderation","romanized-profanity","indian-language-moderation","indic-profanity-filter","bengali","malayalam","hindi","tamil","telugu","kannada","marathi","punjabi","gujarati","bhojpuri","indic","hinglish","tanglish","benglish","tenglish","kanglish","manglish","transliteration","code-mixed","romanized","jev","typesafe","openrouter"],"author":{"url":"https://www.linkedin.com/in/itisshikhar/","name":"Shikhar Srivastava","email":"shikhar.cs.eng@gmail.com"},"license":"MIT","_id":"gg-friggin-ez@0.1.11","maintainers":[{"name":"itisshikhar","email":"shikhar.cs.eng@gmail.com"}],"homepage":"https://github.com/ItisShikhar/gg-friggin-ez#readme","bugs":{"url":"https://github.com/ItisShikhar/gg-friggin-ez/issues","email":"shikhar.cs.eng@gmail.com"},"dist":{"shasum":"0f5c1172dde961fa9ade9dc0a6ad98bc688ac374","tarball":"https://registry.npmjs.org/gg-friggin-ez/-/gg-friggin-ez-0.1.11.tgz","fileCount":7,"integrity":"sha512-eRWLWVS7DoWgIFQSFY0sYLKWgzwOi1cSGvwMI/GoU1gWHfu46BPLB3Cue1HZPC9Y2F2ukdgRjJAbUliwJzBjDw==","signatures":[{"sig":"MEYCIQDPp551BmeXAFrAY3/mp1sVgOzqbfuX2lkuv9WIm2IEAwIhAML9EWmXS+ubcRfwA5pYwx+K9+z7iPCOjTgezBpVuhrD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIASpiuOOz/zKBhRwxkhw9alGafnMTfbo2lFrPNBT4okNAiBoIWeeKi5Y1X1vAf1EUaB6V8FlY+3w62TqKQGMmeE06A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/gg-friggin-ez@0.1.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":76294},"main":"./dist/index.cjs","type":"module","_from":"file:npm-package/gg-friggin-ez-0.1.11.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"bun --watch src/server.ts","demo":"bun run src/server.ts","test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --out-dir dist --clean --tsconfig tsconfig.build.json && node scripts/build-demo.js","start":"bun run src/server.ts","demo:dev":"bun --watch src/server.ts","build:demo":"node scripts/build-demo.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d864df08-462f-4cfd-bdeb-57f7d2cb49d4"}},"_resolved":"/home/runner/work/gg-friggin-ez/gg-friggin-ez/npm-package/gg-friggin-ez-0.1.11.tgz","_integrity":"sha512-eRWLWVS7DoWgIFQSFY0sYLKWgzwOi1cSGvwMI/GoU1gWHfu46BPLB3Cue1HZPC9Y2F2ukdgRjJAbUliwJzBjDw==","repository":{"url":"git+https://github.com/ItisShikhar/gg-friggin-ez.git","type":"git"},"_npmVersion":"11.19.0","description":"Fast, drop-in multilingual profanity and toxicity screener for Node.js, powered by System 1 models like TypeSafe AI Jev and Laya. Catches leetspeak, character spacing, and romanized profanity across languages including Kannada, Telugu, Tamil, Hindi, and B","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsup":"^8.3.5","@types/bun":"latest","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/gg-friggin-ez_0.1.11_1790062848773_0.621864265999641","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"gg-friggin-ez","version":"0.1.12","keywords":["profanity","profanity-filter","bad-words","abusive-words","censor","swear-words","toxicity","toxic","hate-speech","harassment","moderation","content-moderation","chat-moderation","game-chat","game-chat-moderation","game-chat-filter","text-moderation","realtime-moderation","ai-moderation","moderation-api","moderation-sdk","chat-filter","toxicity-detection","multiplayer-chat","live-chat-moderation","harassment-detection","hate-speech-detection","player-safety","trust-and-safety","online-safety","esports-safety","valorant","csgo","counter-strike-2","cs2","league-of-legends","discord-moderation","telegram-moderation","twitch-chat-moderation","tiktok-live","live-stream-moderation","customer-support-moderation","marketplace-chat","alibaba-chat-moderation","dating-chat-moderation","tinder-chat-moderation","hinge-chat-moderation","rideshare-chat-moderation","uber-chat-moderation","ai-agent-moderation","agent-output-screening","chatbot-moderation","llm-output-moderation","user-generated-content-moderation","community-moderation","leetspeak","obfuscated-text","multilingual-moderation","romanized-profanity","indian-language-moderation","indic-profanity-filter","bengali","malayalam","hindi","tamil","telugu","kannada","marathi","punjabi","gujarati","bhojpuri","indic","hinglish","tanglish","benglish","tenglish","kanglish","manglish","transliteration","code-mixed","romanized","jev","system1","laya","system one","typesafe","openrouter"],"author":{"url":"https://www.linkedin.com/in/itisshikhar/","name":"Shikhar Srivastava","email":"shikhar.cs.eng@gmail.com"},"license":"MIT","_id":"gg-friggin-ez@0.1.12","maintainers":[{"name":"itisshikhar","email":"shikhar.cs.eng@gmail.com"}],"homepage":"https://github.com/ItisShikhar/gg-friggin-ez#readme","bugs":{"url":"https://github.com/ItisShikhar/gg-friggin-ez/issues","email":"shikhar.cs.eng@gmail.com"},"dist":{"shasum":"d277ad5750c1d9fd2c31b01a2cd22188d0930249","tarball":"https://registry.npmjs.org/gg-friggin-ez/-/gg-friggin-ez-0.1.12.tgz","fileCount":7,"integrity":"sha512-JvOCiAepC8Un9PwotNim4unAmLS9Maa9EZi5936WRoZkcc2/QyWnhTwlmT36+ovMQ+CFHcP/OkLibFhLmPr9IQ==","signatures":[{"sig":"MEQCIE5LDdGOFBQ7HG1FybscvGVrqNzbW3TIqSSCcBWb4VHRAiBypXWlee7IBstzO494cWXKeEeSis23p3BRwczLGBzLbg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCqHJEbmyg+KZ00aRNrQCMrGClBEYAxhjdtcex1NmPHKwIhAKivfEmqOEUYQXnbct3CDnp0WQF3ClptqMNAQmLtvdtR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/gg-friggin-ez@0.1.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":76339},"main":"./dist/index.cjs","type":"module","_from":"file:npm-package/gg-friggin-ez-0.1.12.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"bun --watch src/server.ts","demo":"bun run src/server.ts","test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --out-dir dist --clean --tsconfig tsconfig.build.json && node scripts/build-demo.js","start":"bun run src/server.ts","demo:dev":"bun --watch src/server.ts","build:demo":"node scripts/build-demo.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d864df08-462f-4cfd-bdeb-57f7d2cb49d4"}},"_resolved":"/home/runner/work/gg-friggin-ez/gg-friggin-ez/npm-package/gg-friggin-ez-0.1.12.tgz","_integrity":"sha512-JvOCiAepC8Un9PwotNim4unAmLS9Maa9EZi5936WRoZkcc2/QyWnhTwlmT36+ovMQ+CFHcP/OkLibFhLmPr9IQ==","repository":{"url":"git+https://github.com/ItisShikhar/gg-friggin-ez.git","type":"git"},"_npmVersion":"11.19.0","description":"Fast, drop-in multilingual profanity and toxicity screener for Node.js, powered by System 1 models like TypeSafe AI Jev and Laya. Catches leetspeak, character spacing, and romanized profanity across languages including Kannada, Telugu, Tamil, Hindi, and B","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","@types/bun":"latest","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/gg-friggin-ez_0.1.12_1790062908696_0.40527639505388446","host":"s3://npm-registry-packages-npm-production"}},"0.1.13":{"name":"gg-friggin-ez","version":"0.1.13","keywords":["profanity","profanity-filter","bad-words","abusive-words","censor","swear-words","toxicity","toxic","hate-speech","harassment","moderation","content-moderation","chat-moderation","game-chat","game-chat-moderation","game-chat-filter","text-moderation","realtime-moderation","ai-moderation","moderation-api","moderation-sdk","chat-filter","toxicity-detection","multiplayer-chat","live-chat-moderation","harassment-detection","hate-speech-detection","player-safety","trust-and-safety","online-safety","esports-safety","valorant","csgo","counter-strike-2","cs2","league-of-legends","discord-moderation","telegram-moderation","twitch-chat-moderation","tiktok-live","live-stream-moderation","customer-support-moderation","marketplace-chat","alibaba-chat-moderation","dating-chat-moderation","tinder-chat-moderation","hinge-chat-moderation","rideshare-chat-moderation","uber-chat-moderation","ai-agent-moderation","agent-output-screening","chatbot-moderation","llm-output-moderation","user-generated-content-moderation","community-moderation","leetspeak","obfuscated-text","multilingual-moderation","romanized-profanity","indian-language-moderation","indic-profanity-filter","bengali","malayalam","hindi","tamil","telugu","kannada","marathi","punjabi","gujarati","bhojpuri","indic","hinglish","tanglish","benglish","tenglish","kanglish","manglish","transliteration","code-mixed","romanized","jev","system1","laya","system one","typesafe","openrouter"],"author":{"url":"https://www.linkedin.com/in/itisshikhar/","name":"Shikhar Srivastava","email":"shikhar.cs.eng@gmail.com"},"license":"MIT","_id":"gg-friggin-ez@0.1.13","maintainers":[{"name":"itisshikhar","email":"shikhar.cs.eng@gmail.com"}],"homepage":"https://github.com/ItisShikhar/gg-friggin-ez#readme","bugs":{"url":"https://github.com/ItisShikhar/gg-friggin-ez/issues","email":"shikhar.cs.eng@gmail.com"},"dist":{"shasum":"e3a5348beab5a2fee5ef256afa67cac88de0387d","tarball":"https://registry.npmjs.org/gg-friggin-ez/-/gg-friggin-ez-0.1.13.tgz","fileCount":7,"integrity":"sha512-WhS5Xdu8+m1kfO4RubIYTcoyb2fwejqZbzExmUnxVOf7pn88X7uCjNucUF8mJmCllpHgntep0VK45SJqHMfZNw==","signatures":[{"sig":"MEYCIQClvEbXpN7omj9IYt9BWiTRrHxd/4ht2cj6nszkxzujTAIhAPQerQfl8fRU/LOnXDPk45zAgI6QuyiB+p973xfbF+8X","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCITS13CzjoNNXCNpNKh3DckPcIONdtUFes0r7bFEzsTgIgMA1JuOuxsLnVDXNeYImgMY4DgDRqzSgiZKiVAuVx1C4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/gg-friggin-ez@0.1.13","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":76325},"main":"./dist/index.cjs","type":"module","_from":"file:npm-package/gg-friggin-ez-0.1.13.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"bun --watch src/server.ts","demo":"bun run src/server.ts","test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --out-dir dist --clean --tsconfig tsconfig.build.json && node scripts/build-demo.js","start":"bun run src/server.ts","demo:dev":"bun --watch src/server.ts","build:demo":"node scripts/build-demo.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d864df08-462f-4cfd-bdeb-57f7d2cb49d4"}},"_resolved":"/home/runner/work/gg-friggin-ez/gg-friggin-ez/npm-package/gg-friggin-ez-0.1.13.tgz","_integrity":"sha512-WhS5Xdu8+m1kfO4RubIYTcoyb2fwejqZbzExmUnxVOf7pn88X7uCjNucUF8mJmCllpHgntep0VK45SJqHMfZNw==","repository":{"url":"git+https://github.com/ItisShikhar/gg-friggin-ez.git","type":"git"},"_npmVersion":"11.19.0","description":"Fast, drop-in multilingual profanity and toxicity screener for Node.js, powered by System 1 models like TypeSafe AI Jev and Laya. Catches leetspeak, character spacing, and romanized profanity across languages including Kannada, Telugu, Tamil, Hindi, and B","directories":{},"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","@types/bun":"latest","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/gg-friggin-ez_0.1.13_1790068277074_0.989524104421599","host":"s3://npm-registry-packages-npm-production"}},"0.1.14":{"_id":"gg-friggin-ez@0.1.14","bugs":{"url":"https://github.com/ItisShikhar/gg-friggin-ez/issues","email":"shikhar.cs.eng@gmail.com"},"dist":{"shasum":"d75d495c06bd75502f510a51a675e14dc4b1d422","tarball":"https://registry.npmjs.org/gg-friggin-ez/-/gg-friggin-ez-0.1.14.tgz","fileCount":7,"integrity":"sha512-kfuXIdHEewlnNCz71YM2nlg67UtrjJiyj7dZnImLUadpAcTitAd0dg5tfkkyJqngxrIdI0o9LssG2ZZLJ5gK2A==","signatures":[{"sig":"MEYCIQDQweC5xAmSySPEZ7eKoQLOxRYFlN83qRIEDKAAt4hc2AIhAJtuAFxtTsgoNCYS0oMXHT6/tD/c4/EyHmYWvW0p7Buv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIA/4tGYiOkCRyNYBzFm9yGzf2ydecD/rHe/6eeWtmmvuAiBSzeukGzOXPEAPBKLSu/8xSieFgdf39Gd+tMFB9g0sUg=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/gg-friggin-ez@0.1.14","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":76325},"main":"./dist/index.cjs","name":"gg-friggin-ez","type":"module","_from":"file:npm-package/gg-friggin-ez-0.1.14.tgz","types":"./dist/index.d.ts","author":{"url":"https://www.linkedin.com/in/itisshikhar/","name":"Shikhar Srivastava","email":"shikhar.cs.eng@gmail.com"},"module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"license":"MIT","scripts":{"dev":"bun --watch src/server.ts","demo":"bun run src/server.ts","test":"bun test","build":"tsup src/index.ts --format esm,cjs --dts --out-dir dist --clean --tsconfig tsconfig.build.json && node scripts/build-demo.js","start":"bun run src/server.ts","demo:dev":"bun --watch src/server.ts","build:demo":"node scripts/build-demo.js","prepublishOnly":"npm run build"},"version":"0.1.14","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d864df08-462f-4cfd-bdeb-57f7d2cb49d4"}},"homepage":"https://github.com/ItisShikhar/gg-friggin-ez#readme","keywords":["profanity","profanity-filter","bad-words","abusive-words","censor","swear-words","toxicity","toxic","hate-speech","harassment","moderation","content-moderation","chat-moderation","game-chat","game-chat-moderation","game-chat-filter","text-moderation","realtime-moderation","ai-moderation","moderation-api","moderation-sdk","chat-filter","toxicity-detection","multiplayer-chat","live-chat-moderation","harassment-detection","hate-speech-detection","player-safety","trust-and-safety","online-safety","esports-safety","valorant","csgo","counter-strike-2","cs2","league-of-legends","discord-moderation","telegram-moderation","twitch-chat-moderation","tiktok-live","live-stream-moderation","customer-support-moderation","marketplace-chat","alibaba-chat-moderation","dating-chat-moderation","tinder-chat-moderation","hinge-chat-moderation","rideshare-chat-moderation","uber-chat-moderation","ai-agent-moderation","agent-output-screening","chatbot-moderation","llm-output-moderation","user-generated-content-moderation","community-moderation","leetspeak","obfuscated-text","multilingual-moderation","romanized-profanity","indian-language-moderation","indic-profanity-filter","bengali","malayalam","hindi","tamil","telugu","kannada","marathi","punjabi","gujarati","bhojpuri","indic","hinglish","tanglish","benglish","tenglish","kanglish","manglish","transliteration","code-mixed","romanized","jev","system1","laya","system one","typesafe","openrouter"],"_resolved":"/home/runner/work/gg-friggin-ez/gg-friggin-ez/npm-package/gg-friggin-ez-0.1.14.tgz","_integrity":"sha512-kfuXIdHEewlnNCz71YM2nlg67UtrjJiyj7dZnImLUadpAcTitAd0dg5tfkkyJqngxrIdI0o9LssG2ZZLJ5gK2A==","repository":{"url":"git+https://github.com/ItisShikhar/gg-friggin-ez.git","type":"git"},"_npmVersion":"11.19.0","description":"Fast, drop-in multilingual profanity and toxicity screener for Node.js, powered by System 1 models like TypeSafe AI Jev and Laya. Catches leetspeak, character spacing, and romanized profanity across languages including Kannada, Telugu, Tamil, Hindi, and B","directories":{},"maintainers":[{"name":"itisshikhar","email":"shikhar.cs.eng@gmail.com"}],"_nodeVersion":"24.21.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","@types/bun":"latest","typescript":"^5.9.3"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/gg-friggin-ez_0.1.14_1790112953770_0.8431590894203629"}}},"time":{"created":"2026-09-19T11:03:09.463Z","modified":"2026-09-22T21:35:54.188Z","0.1.0":"2026-09-19T11:03:09.795Z","0.1.3":"2026-09-19T11:40:34.342Z","0.1.4":"2026-09-19T21:34:54.304Z","0.1.5":"2026-09-21T23:59:57.538Z","0.1.6":"2026-09-22T00:32:45.604Z","0.1.7":"2026-09-22T01:03:57.232Z","0.1.8":"2026-09-22T02:00:52.718Z","0.1.9":"2026-09-22T02:04:21.426Z","0.1.10":"2026-09-22T06:52:28.470Z","0.1.11":"2026-09-22T07:40:48.868Z","0.1.12":"2026-09-22T07:41:48.787Z","0.1.13":"2026-09-22T09:11:17.169Z","0.1.14":"2026-09-22T21:35:53.852Z"},"bugs":{"url":"https://github.com/ItisShikhar/gg-friggin-ez/issues","email":"shikhar.cs.eng@gmail.com"},"author":{"url":"https://www.linkedin.com/in/itisshikhar/","name":"Shikhar Srivastava","email":"shikhar.cs.eng@gmail.com"},"license":"MIT","homepage":"https://github.com/ItisShikhar/gg-friggin-ez#readme","keywords":["profanity","profanity-filter","bad-words","abusive-words","censor","swear-words","toxicity","toxic","hate-speech","harassment","moderation","content-moderation","chat-moderation","game-chat","game-chat-moderation","game-chat-filter","text-moderation","realtime-moderation","ai-moderation","moderation-api","moderation-sdk","chat-filter","toxicity-detection","multiplayer-chat","live-chat-moderation","harassment-detection","hate-speech-detection","player-safety","trust-and-safety","online-safety","esports-safety","valorant","csgo","counter-strike-2","cs2","league-of-legends","discord-moderation","telegram-moderation","twitch-chat-moderation","tiktok-live","live-stream-moderation","customer-support-moderation","marketplace-chat","alibaba-chat-moderation","dating-chat-moderation","tinder-chat-moderation","hinge-chat-moderation","rideshare-chat-moderation","uber-chat-moderation","ai-agent-moderation","agent-output-screening","chatbot-moderation","llm-output-moderation","user-generated-content-moderation","community-moderation","leetspeak","obfuscated-text","multilingual-moderation","romanized-profanity","indian-language-moderation","indic-profanity-filter","bengali","malayalam","hindi","tamil","telugu","kannada","marathi","punjabi","gujarati","bhojpuri","indic","hinglish","tanglish","benglish","tenglish","kanglish","manglish","transliteration","code-mixed","romanized","jev","system1","laya","system one","typesafe","openrouter"],"repository":{"url":"git+https://github.com/ItisShikhar/gg-friggin-ez.git","type":"git"},"description":"Fast, drop-in multilingual profanity and toxicity screener for Node.js, powered by System 1 models like TypeSafe AI Jev and Laya. Catches leetspeak, character spacing, and romanized profanity across languages including Kannada, Telugu, Tamil, Hindi, and B","maintainers":[{"name":"itisshikhar","email":"shikhar.cs.eng@gmail.com"}],"readme":"<div align=\"center\">\n\n<img width=\"240\" src=\"./docs/images/logo.svg\" alt=\"gg-friggin-ez logo\">\n\n<h1>gg-friggin-ez</h1>\n\n<p><strong>Fast, drop-in profanity and toxicity screener for Node.js, powered by <a href=\"https://typesafe.ai/blog/introducing-system-one-models-and-jev\">TypeSafe AI Jev</a>.\n</strong>\n</p>\n\n<p>\n<strong>\nFast. Cheap. Catches the friggin crap.\n</strong>\n</p>\n\n<p>\n  <a href=\"https://itisshikhar.github.io/gg-friggin-ez/\">Live Demo</a> |\n  <a href=\"#quick-start\">Quick Start</a> |\n  <a href=\"#create-custom-screener\">Create Custom Screener</a> |\n  <a href=\"#install\">Install</a> |\n  <a href=\"#the-problem--the-solution\">The Problem & The Solution</a> |  \n  <a href=\"#custom-schemas\">Custom Schemas</a> |\n  <a href=\"#interactive-browser-demos\">Demos</a>\n</p>\n\n[![npm version](https://img.shields.io/npm/v/gg-friggin-ez?style=flat-square)](https://www.npmjs.com/package/gg-friggin-ez)\n[![License](https://img.shields.io/badge/license-MIT-blue?style=flat-square)](LICENSE)\n[![Product Hunt](https://img.shields.io/badge/Product%20Hunt-View%20Launch-DA552F?style=flat-square&logo=producthunt&logoColor=white)](https://www.producthunt.com/posts/gg-friggin-ez/)\n\n<a href=\"https://www.producthunt.com/products/gg-friggin-ez?embed=true&amp;utm_source=badge-featured&amp;utm_medium=badge&amp;utm_campaign=badge-gg-friggin-ez\" target=\"_blank\" rel=\"noopener noreferrer\"><img alt=\"gg-friggin-ez - Fast &amp; cheap profanity and toxicity screening via Jev | Product Hunt\" width=\"250\" height=\"54\" src=\"https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=1255875&amp;theme=light&amp;t=1790038052883\"></a>\n\n⭐ _Help us reach more developers and grow the community. Star this repo!_\n\n</div>\n\n<p align=\"center\">\n  <img src=\"./docs/images/banner.png\" alt=\"gg-friggin-ez banner\" width=\"100%\">\n</p>\n\nWorks across languages and scripts, with zero training required.\n\nReal-world chat isn't clean. Users switch scripts, write regional languages in Latin characters, add spaces between letters, and turn profanity into leetspeak. **gg-friggin-ez** is built for exactly these cases - detecting romanized profanity, code-mixed text, leetspeak, and character spacing across Indic languages like Bengali, Malayalam, Hindi, Tamil, Telugu, Kannada, etc.\n\nAll at ~50-500ms latency, making it suitable for real-time chat and game moderation without reaching for a general-purpose LLM.\n\n## The Problem\n\nStatic keyword denylists and generic moderation APIs fail on real-world user-generated content (social posts, comments, reviews, live chat, and in game text comms):\n\n- **Evasion & Leetspeak**: Common obfuscation tricks bypass static keyword denylists.\n\n| Technique                  | Examples                                                                                    |\n| -------------------------- | ------------------------------------------------------------------------------------------- |\n| **Symbol / number swaps**  | `$hitt3r` · `p00da` · `b$dk` · `m1erda` · `c0nnard` · `傻x / c*m` · `死○ね / sh1ne`         |\n| **Spaced characters**      | `p a i t h i y a m` · `b s d k` · `m i e r d a`                                             |\n| **Character stretching**   | `looooosuuu` · `paaaagal` · `菜逼逼逼` · `死ねぇぇぇ`                                       |\n| **Mixed-script**           | `chuतिya` · Latin + native-script characters                                                |\n| **ASCII / visual evasion** | Hostile gestures rendered with punctuation, e.g. ASCII middle fingers, that even LLMs miss. |\n\n> Examples span English, Tamil, Hindi, Spanish, French, Chinese, Japanese, and other languages.\n\n- **Romanized & Code-Mixed Languages**: Transliterated text has no standard spelling and freely blends multiple languages.\n\n| Language               | Example                                                    | Variations                                    |\n| ---------------------- | ---------------------------------------------------------- | --------------------------------------------- |\n| **English**            | you are an absolute piece of <ins>sh1t</ins>, stop talking | `shit` · `$hit` · `sh*t`                      |\n| **Hindi / Hinglish**   | abe <ins>chutiya</ins> chup kar na                         | `chootiya` · `chutya` · `chuतिya` · `c***iya` |\n| **Tamil / Tanglish**   | nee oru <ins>pooda</ins> paithiyakaara da                  | `p00da` · `puda` · `puuda`                    |\n| **Kannada / Kanglish** | nin <ins>huccha</ins> naye tara adtiya                     | `huchcha` · `hu$ha` · `hucha`                 |\n| **Japanese / Romaji**  | omae hontou ni <ins>shine</ins> yo gomi                    | `shiИe` · `sh1ne` · `死ね` · `死○ね`          |\n\n- **Regional sparsity:** Non-Hindi regional languages suffer from limited training data and dialectal variation, challenging keyword lists and off-the-shelf classifiers ([DravidianCodeMix](https://doi.org/10.1007/s10579-022-09583-7)).\n\n- **Identity-Based Hate Speech:** Regional caste, gender, and religious harassment can be difficult for English-centric moderation systems to detect, especially in transliterated or code-mixed text - e.g. _\"kitchen me jaake khana bana ladki, games tere bas ka nahi\"_.\n\n- **False-Positive Traps**: Harmless friendly banter, cultural idioms, or casual slang get wrongly flagged as severe abuse by blunt keyword matchers.\n- **LLMs are slow & expensive:** General-purpose LLMs can take 1-3s just to produce the first token, making real-time moderation slow and costly at scale.\n\n## The Solution\n\n`gg-friggin-ez` is built around **System 1 decision models** - reflex-speed classifiers that return calibrated probabilities instead of generating conversational text. It ships with **TypeSafe AI Jev** configured as the default model, but Jev isn't hardcoded: swap in a different System 1 classifier, or bring your own via the [`system1` option](#bring-your-own-system-1-model).\n\nWith Jev as the default model:\n\n- **Reflex Speed**: ~50-500ms end-to-end response time.\n- **Low Cost**: $0.042 / 1M input tokens, and no charge for output tokens.\n- **Evasion-Aware**: Handles common obfuscation patterns including leetspeak, character spacing, romanization, and code-mixing.\n- **Multilingual**: Supports English and Indic languages, including romanized/transliterated input.\n- **Drop-In & Pluggable**: Simple Node.js API (`isProfane()`, `isToxic()`, `screen()`), with built-in screening rules, or bring your own custom schema - and your own System 1 model.\n- **Human Review Path**: Ambiguous/context-dependent cases can be routed for human review rather than forcing a binary decision.\n\n## Install\n\n```bash\nnpm install gg-friggin-ez\n```\n\n> Requires Node.js `18+` (or Bun). Ships as both ESM and CommonJS with bundled TypeScript types.\n\n<details>\n<summary>Other package managers</summary>\n\n```bash\nyarn add gg-friggin-ez\n```\n\n```bash\npnpm add gg-friggin-ez\n```\n\n```bash\nbun add gg-friggin-ez\n```\n\n</details>\n\n## Quick Start\n\n```ts\nimport { isProfane, isToxic } from \"gg-friggin-ez\";\n\nprocess.env.OPENROUTER_API_KEY = \"sk-or-...\"; // or pass { apiKey } to createScreener() instead\n\n// Fast boolean convenience checks\nconst profane = await isProfane(\"you are absolute dog sh1t\"); // true\nconst toxic = await isToxic(\"you are completely brainless and useless\"); // true\n\n// Works with transliterated, code-mixed, and obfuscated text\nconst indic = await isProfane(\"Nee oru p00da paithiyakaara da, 5colo nadatha\"); // true\n```\n\nOr `require()` it from plain CommonJS Node:\n\n```js\nconst { isProfane, isToxic } = require(\"gg-friggin-ez\");\n\nconst bad = await isProfane(\"you are absolute dog sh1t\");\n```\n\n> [!TIP]\n> **Performance tip**: `isProfane()` and `isToxic()` each trigger an inference request. If you need multiple moderation signals, call `screen()` once.\n\n### Full detail\n\n```ts\nimport { screen } from \"gg-friggin-ez\";\n\n// Multi-vector adversarial evasion: spacing, leetspeak, repeated chars, symbols, & mixed script\nconst result = await screen(\n  \"Nee oru p 0 0 d a daaaa, b*dk chuतिya 5colo nadatha\",\n);\n\nconsole.log(result);\n// {\n//   isProfane: true,\n//   isToxic: true,\n//   severity: \"SEVERE\",\n//   severityScore: 1.95,\n//   language: \"tamil\",\n//   obfuscationType: \"mixed_script\",\n//   obfuscationTypes: [\n//     \"mixed_script\",\n//     \"spaced_characters\",\n//     \"leetspeak\",\n//     \"repeated_characters\",\n//   ],\n//   action: \"AUTO_BAN\",\n// }\n```\n\n`screen()`, `isProfane()`, and `isToxic()` all accept the same optional second argument - see [Create custom screener](#create-custom-screener) below for the full list of what you can configure and pass in. `screen()` returns the complete moderation result:\n\n- `isProfane` - `true` / `false` - explicit profanity or slurs\n- `isToxic` - `true` / `false` - hostility, harassment, or personal attacks\n- `severity` - `\"NONE\"` / `\"MILD\"` / `\"SEVERE\"`\n- `severityScore` - continuous `0.0-2.0` score, e.g. `1.95`\n- `language` - detected language, e.g. `\"tamil\"`\n- `obfuscationType` - primary evasion technique, e.g. `\"mixed_script\"`\n- `obfuscationTypes` - all detected evasion techniques, e.g. `[\"mixed_script\", \"spaced_characters\", \"leetspeak\", \"repeated_characters\", \"symbol_substitutions\"]`\n- `action` - `\"ALLOW\"` / `\"SUSPICIOUS_REVIEW\"` / `\"AUTO_CENSOR\"` / `\"AUTO_BAN\"`\n- `latencyMs` - actual measured end-to-end request latency (no artificial adjustment)\n- `costUsd` - inference cost in USD, derived from the provider's reported cost or actual token usage; `undefined` if neither is available (never a fabricated estimate)\n\n> [!NOTE]\n> **Where does `action` actually come from?** The configured System 1 model (Jev by default) only returns calibrated probabilities/scores for toxicity, profanity, severity, language, and obfuscation type - it never decides an outcome. `gg-friggin-ez` then applies deterministic policy thresholds on the client side to turn those probabilities into `ALLOW` / `SUSPICIOUS_REVIEW` / `AUTO_CENSOR` / `AUTO_BAN`. This keeps the AI model narrowly scoped to classification while your application (or this library's default thresholds) owns the moderation policy.\n\n### Visual Evasion & ASCII Art Screening\n\nStandard keyword denylists and traditional NLP models process text as 1D token streams, and may miss 2D ASCII drawings. `gg-friggin-ez` detects ASCII-art evasion as a distinct moderation signal.\n\n```ts\nconst asciiMiddleFinger = `\n....................../´¯/) \n....................,/¯../ \n.................../..../ \n............./´¯/'...'/´¯¯\\`·¸ \n........../'/.../..../......./¨¯\\\\ \n........('(...´...´.... ¯~/'...') \n.........\\\\.................'...../ \n..........''...\\\\.......... _.·´ \n............\\\\..............( \n..............\\\\.............\\\\...\n`;\n\nconst res = await screen(asciiMiddleFinger);\n\nconsole.log(res.obfuscationType); // \"ascii_art\"\nconsole.log(res.obfuscationTypes); // [\"ascii_art\"]\nconsole.log(res.severityScore); // 1.30\nconsole.log(res.action); // \"SUSPICIOUS_REVIEW\"\n```\n\n### Create custom screener\n\n```ts\nimport { createScreener, DEFAULT_TOXICITY_QUESTIONS } from \"gg-friggin-ez\";\n\nconst screener = createScreener({\n  apiKey: \"sk-or-...\", // default: OPENROUTER_API_KEY, TYPESAFE_API_KEY, or JEV_KEY env var\n  system1: undefined, // swap the whole System 1 model (endpoint + model id + pricing); see \"Bring your own System 1 model\"\n  baseUrl: undefined, // override just the endpoint (rarely needed - use `system1` instead)\n  model: undefined, // override just the model id (rarely needed - use `system1` instead)\n  timeoutMs: 15000, // per-request timeout in ms\n  retries: 2, // retries after the initial attempt, for transient errors only (clamped to >= 0)\n  thresholds: { review: 0.35, censor: 0.6, ban: 0.75 }, // action decision thresholds\n  questions: DEFAULT_TOXICITY_QUESTIONS, // Jev question schema; see \"Custom schemas\"\n});\n\n// thresholds and questions can also be passed per-call, overriding the screener's\n// defaults for that call only - the rest of the options above are constructor-only.\nawait screener.screen(\"some borderline text\", {\n  thresholds: { censor: 0.5 },\n  questions: DEFAULT_TOXICITY_QUESTIONS,\n});\n```\n\n| Option       | Type                          | Default                                                       | Per-call override |\n| ------------ | ----------------------------- | ------------------------------------------------------------- | ----------------- |\n| `apiKey`     | `string`                      | `OPENROUTER_API_KEY` / `TYPESAFE_API_KEY` / `JEV_KEY` env var | No                |\n| `system1`    | `System1ModelConfig`          | Jev (auto-picks TypeSafe or OpenRouter based on the key)      | No                |\n| `baseUrl`    | `string`                      | from the active `system1` model                               | No                |\n| `model`      | `string`                      | from the active `system1` model                               | No                |\n| `timeoutMs`  | `number`                      | `15000`                                                       | No                |\n| `retries`    | `number`                      | `2`                                                           | No                |\n| `thresholds` | `{ review?, censor?, ban? }`  | `{ review: 0.35, censor: 0.6, ban: 0.75 }`                    | Yes               |\n| `questions`  | `Record<string, JevQuestion>` | `DEFAULT_TOXICITY_QUESTIONS`                                  | Yes               |\n\n> [!NOTE]\n> Every option lives on `createScreener()`. `screen()`, `isProfane()`, and `isToxic()` accept the same `thresholds` and `questions` as a second argument, scoped to that one call only.\n\n### Configurable policy thresholds\n\nYou can customize the decision action thresholds per-call or across the shared screener.\n\n```ts\nconst result = await screen(\"some borderline text\", {\n  thresholds: {\n    review: 0.3, // route to review at >= 30% confidence\n    censor: 0.55, // auto-censor at >= 55%\n    ban: 0.7, // auto-ban at >= 70%\n  },\n});\n```\n\n### Retries & timeouts\n\n```ts\nconst screener = createScreener({\n  timeoutMs: 10000, // per-request timeout in ms (default: 15000)\n  retries: 2, // retries *after* the initial attempt (default: 2 → up to 3 total attempts)\n});\n```\n\nOnly transient failures are retried - HTTP `408`/`429`/`5xx`, network errors, and timeouts - with backoff between attempts. Non-transient errors (e.g. `401 Unauthorized`, `403 Forbidden`, `404 Not Found`) fail immediately instead of being retried. `retries` is clamped to a minimum of `0` (one attempt, no retries).\n\n### API key configuration\n\n`gg-friggin-ez` reads the API key from environment variables (in order): `OPENROUTER_API_KEY`, `TYPESAFE_API_KEY`, `JEV_KEY`. You can also pass it explicitly to `createScreener()`.\n\n```ts\nimport { createScreener } from \"gg-friggin-ez\";\n\nconst screener = createScreener({ apiKey: \"sk-or-...\" });\n```\n\nIf no key is configured, `screen()` throws an error - a real API key is required to reach Jev. (The browser demo in [`demo/`](./demo) has its own offline heuristic fallback for exploring the UI without a key, but the `gg-friggin-ez` package itself does not.)\n\n### Custom schemas\n\nBring your own Jev question schema - useful for a different language family, domain, or moderation policy. Set it once on a screener instance, or override it for a single call.\n\n```ts\nimport { createScreener, isProfane } from \"gg-friggin-ez\";\n\n// Per-instance: every screen() call on this screener uses myCustomQuestions\nconst screener = createScreener({\n  apiKey: \"sk-or-...\",\n  questions: myCustomQuestions, // same shape as DEFAULT_TOXICITY_QUESTIONS\n});\n\nconst result = await screener.screen(\"some text\");\n\n// Per-call: override the schema for a single check without a dedicated instance\nawait isProfane(\"some text\", { questions: myCustomQuestions });\n```\n\n### Bring your own System 1 model\n\n`gg-friggin-ez` ships with Jev (TypeSafe AI) configured as the default System 1 decision model, but the client isn't hardwired to it. Every provider detail - endpoint, model id, and published pricing - lives in one place ([`src/system1/models.ts`](./src/system1/models.ts)), so you can point the screener at a different System 1 classifier, or even a plain LLM that returns the same `{ noul, choice, score, usage }` shape, without touching any request/parsing logic:\n\n```ts\nimport { createScreener, BUNDLED_SYSTEM1_MODELS } from \"gg-friggin-ez\";\n\n// Example 1: Use pre-bundled local Laya (ConvAI Innovations)\n// Run Laya via Python (`pip install laya`) behind an HTTP endpoint\nconst screener = createScreener({\n  system1: BUNDLED_SYSTEM1_MODELS.layaLocal, // http://localhost:8000/v1/decisions\n});\n\n// Example 2: Use custom System 1 endpoint\nconst customScreener = createScreener({\n  apiKey: \"your-provider-api-key\",\n  system1: {\n    id: \"my-custom-model\",\n    baseUrl: \"https://my-provider.example.com/v1/decisions\",\n    model: \"my-model-id\",\n    pricing: { inputPerMillionUsd: 0.1 }, // optional - omit if the provider reports usage.cost\n  },\n});\n```\n\n> [!NOTE]\n> Hugging Face model repository URLs (such as `https://huggingface.co/convaiinnovations/laya`) host raw model weights and documentation, not HTTP JSON decision endpoints. To use open-source models like Laya, serve the model locally or in your VPC (for example with FastAPI calling `laya.predict(state, questions)`), then pass that server's decision URL in `baseUrl`.\n\n<details>\n<summary><b>Self-hosting Laya with FastAPI (Python code & steps)</b></summary>\n\n#### 1. Install dependencies\n\n```bash\npip install fastapi uvicorn laya\n```\n\n#### 2. Create the decision server (`server.py`)\n\n```python\nfrom fastapi import FastAPI\nfrom pydantic import BaseModel\nfrom typing import Dict, Any, Optional\nimport laya\n\napp = FastAPI()\n\n# Load English (laya) or multilingual (laya-multilingual for Indic languages)\nagent = laya.load(\"convaiinnovations/laya-multilingual\")\n\nclass DecisionRequest(BaseModel):\n    model: Optional[str] = \"convaiinnovations/laya\"\n    state: Dict[str, Any]\n    questions: Dict[str, Any]\n\n@app.post(\"/v1/decisions\")\nasync def handle_decisions(req: DecisionRequest):\n    answers = agent.predict(req.state, req.questions)\n    return {\n        \"answers\": answers,\n        \"usage\": {\n            \"input_tokens\": len(req.state.get(\"text\", \"\")),\n            \"cost\": 0.0,\n        }\n    }\n\nif __name__ == \"__main__\":\n    import uvicorn\n    uvicorn.run(app, host=\"0.0.0.0\", port=8000)\n```\n\n#### 3. Start the server\n\n```bash\npython server.py\n```\n\n#### 4. Connect `gg-friggin-ez`\n\n```typescript\nimport { createScreener, BUNDLED_SYSTEM1_MODELS } from \"gg-friggin-ez\";\n\nconst screener = createScreener({\n  system1: BUNDLED_SYSTEM1_MODELS.layaLocal, // http://localhost:8000/v1/decisions\n});\n\nconst result = await screener.screen(\"Teri maa ki c**t\");\nconsole.log(result.action); // AUTO_BAN or AUTO_CENSOR\nconsole.log(result.costUsd); // 0 (self-hosted)\n```\n\n</details>\n\nA custom `system1` config is pinned for the lifetime of the screener instance - calling `setApiKey()` to rotate credentials never resets it back to Jev's defaults. If you only need to point at a different Jev-compatible deployment (e.g. a self-hosted proxy), the simpler `baseUrl`/`model` string options are still supported and behave the same as before.\n\n## Interactive Browser Demos\n\n> **Live Demo:** Try the interactive simulations live in your browser at **[https://itisshikhar.github.io/gg-friggin-ez/](https://itisshikhar.github.io/gg-friggin-ez/)**.\n\nThe repository includes two interactive simulations - **Twitch live chat** and **Valorant text comms** - showcasing real-time code-mixed toxicity detection. Test it directly online on **[GitHub Pages](https://itisshikhar.github.io/gg-friggin-ez/)**, or run it locally with Bun. Add an OpenRouter or TypeSafe AI API key via the **API Keys** modal, or use the built-in offline heuristic evaluator without a key.\n\n### Twitch Live Stream Chat UI\n\n<p align=\"center\">\n  <img src=\"./docs/images/demo-twitch.png\" alt=\"Twitch Live Stream Chat Demo\" width=\"100%\">\n  <br>\n  <sub>Live Twitch chat moderation with AutoMod timeout, language detection, and moderator reveal.</sub>\n</p>\n\n### Valorant Realtime Comms\n\n<p align=\"center\">\n  <img src=\"./docs/images/demo-valorant.png\" alt=\"Valorant Realtime Comms Demo\" width=\"100%\">\n  <br>\n  <sub>In-game tactical comms HUD with real-time censorship, 3-strike penalty system, and inline telemetry cards.</sub>\n</p>\n\n### Running the demo locally\n\nRequires [Bun](https://bun.sh) (v1.1+).\n\n```bash\ngit clone https://github.com/ItisShikhar/gg-friggin-ez.git\ncd gg-friggin-ez\nbun install\n\nbun run demo\n```\n\nOpen [http://localhost:3000](http://localhost:3000) in your browser.\n\n### Running Tests\n\n```bash\nbun test\n```\n\n### Building the npm package\n\n```bash\nnpm run build\n```\n\nEmits `dist/index.js` (ESM), `dist/index.cjs` (CJS), and `dist/index.d.ts` (types).\n\n## Use cases\n\n`gg-friggin-ez` fits real-time (and passive) text moderation pipelines. Below are illustrative use cases and examples:\n\n- **Games & platforms** - lobby chat, team comms, live game chat (Valorant, Counter-Strike: Global Offensive (CS:GO), Counter-Strike 2 (CS2), League of Legends (LoL)), Discord/Telegram community bots, gaming platforms, and similar online multiplayer or live platforms\n- **Chat & messaging surfaces** - live chat (Twitch chat, TikTok Live comments), group chat, live customer support chat widgets, marketplace buyer-seller chat (Alibaba chat), dating app messaging (Tinder or Hinge chat), and other user-generated messages (Uber user/driver chat), including multilingual and obfuscated abuse\n- **Moderation use cases** - game profanity filter, toxic chat filter, multiplayer chat moderation API, real-time toxicity detection, AI content moderation, automated harassment detection, AI agent/chatbot output screening, and player trust-and-safety tooling for esports and gaming communities\n- **Multilingual & Indic-language support** - works across languages broadly, with especially strong coverage for Indic and code-mixed text - a gap most moderation packages don't handle well: Bengali text censoring, Malayalam chat moderation, Hindi/Hinglish, Tamil/Tanglish, Telugu/Tenglish, Kannada/Kanglish, Marathi/Marlish, Punjabi/Punglish, Gujarati/Gujlish, Bhojpuri, and other code-mixed Indian languages\n\n## How It Compares\n\nHow `gg-friggin-ez` compares on latency, multilingual coverage, and real-world evasion handling.\n\n| Moderation Approach                                       | Latency       | Strengths                                                                                                                                            | Trade-offs                                                                                                          |\n| :-------------------------------------------------------- | :------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------ |\n| **`gg-friggin-ez`** (default model: TypeSafe AI Jev)      | **~50-500ms** | Multilingual, including romanized/transliterated Indic languages (Tamil, Telugu, Kannada, Bengali, Hindi, etc.), evasion tricks (leetspeak, spacing) | Limited conversational context (routes to human review)                                                             |\n| **Perspective API** (Google Jigsaw)                       | ~80-120ms     | Monolingual English, Spanish, standard Hindi (`hi`)                                                                                                  | Unsupported on Dravidian & regional Indic languages. Scheduled to sunset end of 2026.                               |\n| **OpenAI Moderation Endpoint** (`omni-moderation-latest`) | ~150-350ms    | Multilingual standard text (40 languages supported with major gains in Telugu, Bengali, Marathi)                                                     | Fixed 13 harm categories rather than custom policy schemas; higher false-positive rate on casual colloquial banter. |\n| **Custom BERT / FastText**                                | ~15-30ms      | Extremely fast; performance depends on training data                                                                                                 | Requires training data + maintenance.                                                                               |\n| **General LLMs (GPT-4o)**                                 | 1,000-3,500ms | Has multilingual world knowledge                                                                                                                     | 10x to 30x latency, plus 100x inference cost.                                                                       |\n\n## Benchmark Results\n\nResults from 42 curated test cases across 14 languages, covering multilingual, romanized, and obfuscated text.\n\n| Metric                            | `gg-friggin-ez` (default model: Jev) | OpenAI (`omni-moderation`) | Perspective API                    | Legacy Keyword Filter |\n| :-------------------------------- | :----------------------------------- | :------------------------- | :--------------------------------- | :-------------------- |\n| **Overall Accuracy**              | **97.6%** (41 / 42)                  | 88.1% (37 / 42)            | 38.1% (16 / 42) _(18 unsupported)_ | 61.9% (26 / 42)       |\n| **Romanized Indic Accuracy**      | **94.4%**                            | 77.8%                      | 16.7%                              | 66.7%                 |\n| **Global Languages Accuracy**     | **100%**                             | 100%                       | 72.2%                              | 55.6%                 |\n| **Obfuscated Evasion Catch Rate** | **100%**                             | 71.4%                      | 28.6%                              | 35.7%                 |\n| **Inference Cost**                | **~$0.000052 / msg**                 | Free                       | Free _(sunset 2026)_               | $0.00                 |\n\n> _Note on API language coverage:_ According to Google's official [Perspective API documentation](https://github.com/conversationai/perspectiveapi), its `TOXICITY` model officially supports only 18 languages - with standard Hindi (`hi`) and experimental Hinglish (`hi-Latn`) being its only Indic coverage. Tamil, Telugu, Kannada, Bengali, Marathi, and Bhojpuri are unsupported.\n\n> For complete itemized data across all 42 tests, individual scores, and latency logs, see [raw-benchmarks.md](./raw-benchmarks.md).\n\n## Contributing\n\nContributions are welcome, whether they improve performance, fix bugs, add\npresets, components or effects, expand examples and tests, or improve documentation.\nSee [Contributing](CONTRIBUTING.md) before opening a pull request.\n\n## Author\n\nBuilt by [Shikhar Srivastava](https://www.linkedin.com/in/itisshikhar/).\n\n[GitHub](https://github.com/ItisShikhar) ·\n[LinkedIn](https://www.linkedin.com/in/itisshikhar/)\n\n## License\n\ngg-friggin-ez is released under the [MIT License](LICENSE).\n","readmeFilename":"README.md"}