Sniff AI-smell in your text. Bilingual ES/EN. CLI. Offline. Opinionated.
🇪🇸 Léeme en español · 🌐 Try it in your browser
text.md • 47 sentences • smell: 31% (moderate)
Line-by-line findings
🔴 L4 It's not just about productivity—it's about transformation.
AI's signature negative parallelism [en.not_just]
→ state the positive idea directly
🔴 L12 ...let's delve into the complexities of...
the most flagged AI word of 2024 [en.delve]
→ use "explore", "look at", or just dig in
aismell reads your text and points out lines that smell like a language model wrote them. No false promise of "fooling GPTZero." Your blog post, email, PR description, or essay either sounds like you or sounds like an LLM — this tool just helps you spot which.
It runs offline, uses regex + heuristics (no API calls by default), and works on Spanish and English text.
Most "AI text humanizers" are scams. They reshuffle synonyms or insert typos to bypass detectors. That game is dishonest and useless.
aismell is the opposite:
- Analysis does not rewrite for you. It tells you what reads like AI, line by line. (The web has a separate "strip marks" action that can rewrite if you explicitly use it; the CLI doesn't.)
- It is auditable. Every pattern lives in a YAML file you can read and contribute to.
- It is offline by default. Text analysis never leaves your machine. On the web, the only action that sends text to a server is "strip marks": it is processed by the aismell service, not stored, and not used to train models.
- It does not promise to fool detectors. It promises to make your text feel less like autopilot.
The honest framing is editorial, not adversarial. Use it before publishing.
aismell.me has a "strip marks" action next to the normal analysis:
- Removes invisible characters (odd spaces, control unicode, bidi) that sneak into copied text.
- Optionally rewrites the text so it sounds less like an AI template. It preserves data, names and citations.
- The text is sent to the aismell service only to be processed; it is not stored, not logged, and not used to train models.
pipx (recommended, any OS):
pipx install aismell
pipx inject aismell pymupdf # optional: enable PDF annotationArch (AUR):
yay -S aismell # once published
# or from this repo:
git clone https://github.com/brm-src/aismell.git
cd aismell/packaging && makepkg -siFrom source, no install:
git clone https://github.com/brm-src/aismell.git
cd aismell
./bin/aismell --help
# requires: PyYAML (pacman -S python-yaml, apt install python3-yaml, etc.)Requires Python 3.9+. PyMuPDF is optional, only for .pdf annotation.
# analyze a file (auto-detects language)
aismell post.md
# pipe stdin
cat draft.txt | aismell
# annotate a Word .docx — yellow highlights + sidebar comments
aismell mi-tesis.docx --out mi-tesis-marcado.docx
# annotate a PDF — yellow highlights + sticky-note comments
aismell paper.pdf --out paper-marcado.pdf
# no arguments? opens a native file picker (if you have a desktop)
aismell
# only show high-confidence findings
aismell --strict post.md
# get a single number 0-100 (great for CI / pre-commit)
aismell --score-only post.md
# force language
aismell --lang es post.md
# disable color
aismell --no-color post.mdThe package also exposes a small offline helper for high-confidence cleanup. It does not call an LLM or send text anywhere:
from aismell.quickclean import clean
result = clean("It is important to note that the report is ready.")
print(result.text)
print(result.changes)Use this helper when privacy matters more than a broad rewrite. The Omarchy plugin's clean and improve actions are separate online flows documented in ai quick clean.
Three layers of detection.
1. Phrase patterns. Things AI writes when it coasts: vale la pena destacar, delve into, stands as a testament, hope this helps. The rules now cover 130+ English patterns and 180+ Spanish patterns, including formal connectors and bloated abstract nouns.
2. Structure patterns. Tells beyond word choice: split binary reframes, false agency, evasive passive voice, negative listing, copula avoidance, generic conclusions, sycophantic openers.
3. Rhythm, shape, and discourse. Sentence-length variance, em-dash density, list ratio, rule-of-three frequency, paragraph-length symmetry (LLMs produce paragraphs of suspiciously similar length), opening-connector density (Pangram research shows multiple paragraphs starting with explicit connectors is the single strongest AI tell), and StoryScope-inspired cues such as over-explained themes and too-neat narrative closure.
Scores are normalized to a 0–100 smell percentage. Above 60 is loud AI, 30–60 is mixed, below 30 is mostly clean.
- Does not call an LLM (a future
--rewriteflag may do so, opt-in). The web's "strip marks" action does use a model when you enable rewrite. - Does not rewrite your text for you in the CLI. The web's "strip marks" action can rewrite, only when you explicitly use it.
- Does not claim to be a forensic AI detector. False positives are fine — humans use these phrases too. The point is making them visible so you can decide.
Every detection rule lives in patterns/es.yaml or patterns/en.yaml. Format:
- id: en.delve
kind: phrase # phrase | regex
severity: 3 # 1 (suspect) | 2 (probable) | 3 (almost certain)
pattern: delve into
message: the most flagged AI word of 2024
suggestion: use "explore", "look at", or just dig inAdd a pattern, open a PR. No code changes needed for new rules.
- More patterns (always)
-
--rewriteflag with optional LLM backend (offline by default stays default) - Plain-text output mode for
grep-style piping - Pre-commit hook config
-
--diffmode that shows before/after suggestions
This project is built on top of the patterns documented in Wikipedia: Signs of AI writing, blader/humanizer, and hardikpandya/stop-slop. The bloat lexicon and structural checks are informed by Pangram Labs research (2024-2025), the DAMAGE paper on AI humanizers, and EditLens. See docs/research.md for the full breakdown.
All sources MIT-compatible, and so is this.
MIT. See LICENSE.
