Show HN: AiSniff, underline the phrases in a text that read like AI wrote them A developer released AiSniff, an open-source tool that underlines phrases in English and Chinese text matching documented AI-writing patterns, with each mark naming its rule, citing a public source and suggesting a plain rewrite. On answers held out from the public HC3 dataset, AiSniff's English rules marked at least one phrase in 29% of chatbot answers versus 2% of human answers, and in 24% versus 6% for Chinese, though 71% of English chatbot answers produced no hit and the density score's AUROC was 0.63 for English and 0.59 for Chinese. The web editor, CLI and agent skill run from one set of JSON rules with no server and no model call, and the tool reports patterns only, saying nothing about who wrote the text. Paste text. See which phrases read like AI wrote them. English https://github.com/Arthur031221/AiSniff/blob/main/README.md | Traditional Chinese https://github.com/Arthur031221/AiSniff/blob/main/README.zh-TW.md | Simplified Chinese https://github.com/Arthur031221/AiSniff/blob/main/README.zh-CN.md | Japanese https://github.com/Arthur031221/AiSniff/blob/main/README.ja.md | Korean https://github.com/Arthur031221/AiSniff/blob/main/README.ko.md | Spanish https://github.com/Arthur031221/AiSniff/blob/main/README.es.md | French https://github.com/Arthur031221/AiSniff/blob/main/README.fr.md | German https://github.com/Arthur031221/AiSniff/blob/main/README.de.md | Portuguese BR https://github.com/Arthur031221/AiSniff/blob/main/README.pt-BR.md AiSniff marks phrases in English and Chinese text that match documented AI-writing patterns. Each mark names its rule, cites a public source and suggests a plain rewrite. The web editor, the CLI and the agent skill all run from one set of JSON rules, with no server and no model call. It reports patterns and says nothing about who wrote the text. A clean result doesn't prove a person wrote it, and a hit doesn't prove a model did. | Before | After | |---|---| | In today's fast-paced world, our update is a game-changer that unlocks your full potential. We are committed to excellence, and we are thrilled to share it. | Version 2.1 fixes the crash on startup when the config file is empty. Details are in the changelog. | | 3 hits : en.opener.todays-world , en.promo.commitment | 0 hits | Hit counts come from aisniff lint run on these exact sentences. I rewrote the right column by hand, following the hints. On answers held out from HC3 a public set of questions with human and chatbot answers , the English rules marked at least one phrase in 29% of chatbot answers and 2% of human answers. For Chinese it was 24% and 6%. The limits matter. The test half holds 23,752 human and 13,422 chatbot English answers, and 9,812 and 8,480 Chinese ones. The chatbot answers date from its first months, so the rules for newer-model vocabulary can't be checked against them. 71% of the English chatbot answers had no hit at all. The AUROC of the density is 0.63 for English and 0.59 for Chinese, so density alone is a weak detector. Several rules fire as often on human answers as on chatbot ones, and the evaluation page lists them. Method and per-rule counts are in docs/evaluation.md https://github.com/Arthur031221/AiSniff/blob/main/docs/evaluation.md . Rerun it with npm run eval . npx github:Arthur031221/AiSniff lint draft.md | Command | What it does | |---|---| | aisniff lint files... | Scans files, or stdin when no file is given. Prints each hit with position, confidence, rule, message and hint. | | aisniff lint --format json | Same hits as JSON, with source URLs, counts per type and the density. | | aisniff lint --format github | One GitHub Actions annotation per hit. | | aisniff lint --min-confidence medium | Hides weak signals. Values: low , medium , high . | | aisniff lint --max-density 20 | Exits 1 when hits per 1,000 units are above the number. | | aisniff lint --max-weighted-density 8.7 | Exits 1 when the weighted density, the scale of the web meter, is above the number. | | aisniff lint --disable en.promo | Skips one rule, or every rule under a prefix such as en.promo . Repeat the flag to skip more. | | aisniff lint docs/ | Scans a folder and its subfolders for .md , .markdown , .mdx and .txt files. | | aisniff lint --markdown off | Scans Markdown files as plain text. By default, code blocks, inline code, front matter, comments and link addresses in .md , .markdown and .mdx files are skipped. Values: auto , on , off . | | .aisniff.json | Sets the same options for a project: format , minConfidence , maxDensity , maxWeightedDensity , disable , markdown , lang , locale . Found from the current folder up to the repository root. Flags win. --config FILE picks a file, --no-config ignores it. | | aisniff lint --lang en | Loads one pack. Values: auto , en , zh-TW . | | aisniff lint --locale zh-TW | Messages and hints in Traditional Chinese. | | aisniff rules | Lists all 61 rules with their confidence. | | aisniff explain