Any rewrite tool, whether it's a humanizer, a paraphraser or "ChatGPT, make this sound natural," has the same failure mode: it improves the voice and quietly changes the meaning. A version number becomes "the latest version." "Must" becomes "should." A three-step process becomes two.
For docs, release notes, support macros or anything technical, that's a bug. Here's the workflow I use to humanize AI-drafted text and prove nothing important changed, using tools you already have: git diff, Python's difflib and a short checklist.
The core idea: treat prose like code
You'd never merge a refactor without reviewing the diff. A humanizing pass is a refactor of prose: same behaviour (meaning), different implementation (wording). So:
- Commit the original.
- Run the rewrite.
- Review the diff with the questions that matter.
Step 1: Put the original under version control
mkdir humanize-review && cd humanize-review
git init
cp ~/drafts/release-notes.md .
git add release-notes.md
git commit -m "AI draft, before humanizing"
Now any change shows up in review.
Step 2: Humanize in small sections
Rewriting a whole document in one pass gives the tool more room to drift. Work section by section, ideally a few hundred words at a time. Keep headings, code blocks and tables out of the rewrite. Those should never change.
I use UnAIMyText for this step because it rewrites at the sentence level and is designed to keep meaning while changing rhythm and phrasing. The free tier takes up to 500 words per input, which fits the section-by-section approach. The workflow below works with any tool, including your own LLM prompt.
Paste the result back over the section in the file.
Best free tools to speed this up
Any of these can handle the rewrite or review step. Ranked for this workflow:
- QuillBot: free paraphrase and humanizer modes that work well on short passages; check their current free limits.
- Grammarly: free suggestions and a humanizer mode with a light touch on wording; check their current free limits.
- UnAIMyText: the humanizer does 500 words per run with no account, which matches the section-by-section step above.
- Vale: an open-source prose linter you can run in CI to enforce your style rules after the rewrite.
- Hemingway: flags hard-to-read sentences, so it's a quick final check on rhythm and length.
Step 3: Review a word-level diff
Line diffs are useless for prose because one edit marks a whole paragraph as changed. Use word-level diffs instead:
git diff --word-diff=color
--word-diff is documented in the git diff reference. It shows insertions and deletions inline, so you can see exactly which words moved.
Step 4: Automatically flag the dangerous changes
Some tokens should almost never change in a humanizing pass: numbers, versions, code identifiers, URLs, product names and modal verbs like must, never and only. A small script can catch them.
# check_meaning.py
import re, sys, difflib
PROTECTED = re.compile(
r"\b\d[\d.,:%]*\b" # numbers, versions, times, percentages
r"|`[^`]+`" # inline code
r"|https?://\S+" # URLs
r"|\b(must|never|only|always|required|not)\b", # meaning-critical words
re.IGNORECASE,
)
def tokens(text):
return [m.group(0).lower() for m in PROTECTED.finditer(text)]
before = open(sys.argv[1], encoding="utf-8").read()
after = open(sys.argv[2], encoding="utf-8").read()
diff = list(difflib.ndiff(tokens(before), tokens(after)))
changes = [d for d in diff if d.startswith(("- ", "+ "))]
if changes:
print("Protected tokens changed:")
for c in changes:
print(" ", c)
sys.exit(1)
print("No protected tokens changed.")
Run it against the committed version:
git show HEAD:release-notes.md > /tmp/before.md
python check_meaning.py /tmp/before.md release-notes.md
difflib.ndiff comes from Python's standard library (difflib docs), so there's nothing to install. A non-zero exit code means you need to look at that section again.
Step 5: Human review with four questions
The script catches the mechanical stuff. For the rest, read the word diff and ask:
- Did any claim get stronger or weaker? "Fixes" vs "should fix" is a meaning change.
- Did any step disappear or merge? Count the steps before and after.
- Did any qualifier move? "Only on Linux" becoming "on Linux" changes who's affected.
- Did anything new appear? Tools sometimes add a friendly example that isn't true.
Revert those hunks by hand. Keep the rhythm and phrasing improvements.
Step 6: Commit with a message that explains the pass
git commit -am "Humanize release notes: rhythm and phrasing only, protected tokens unchanged"
If someone questions a sentence later, you have both versions and the reasoning.
What usually changes (and is fine)
- Openers like "Additionally" and "Furthermore" get dropped.
- Long, uniform sentences get split.
- Filler intensifiers ("robust," "seamless") disappear.
- Passive constructions become active.
What usually changes (and isn't fine)
- Numbers get rounded or turned into words.
- Hedges are added to definite statements, or removed from uncertain ones.
- Lists lose an item.
- Product or feature names get "naturalised" into generic terms.
Tune the protected list for your content
The regex above is a starting point. Adjust it to what carries meaning in your docs:
-
API and CLI docs: add flag patterns like
--[a-z-]+and HTTP verbs such as GET, POST and DELETE. - Legal or policy text: add "may," "shall," "unless" and "except," where one word changes an obligation.
- Release notes: add your product and feature names so they don't get swapped for generic terms.
- Support macros: add plan names, prices and time limits like "within 30 days."
Keep the list short enough that a failure means something. If the script flags every run, people stop reading its output. Start with numbers, code and a few modal verbs, then add patterns only when a real regression slips through. Over time the list becomes a record of the mistakes your rewrite step has actually made, which is the most useful kind of check.
Make it a habit
For a team, put check_meaning.py in a pre-commit hook for your docs/ folder. Anyone can humanize AI drafts however they like. The hook just makes sure the facts survive.
Takeaway
Humanizing is safe when you can see exactly what changed. Commit first, rewrite in sections, review a word-level diff, and let a ten-line script guard the tokens that carry meaning. The voice gets better and the content stays the same.
FAQ
Will humanizing AI text change its meaning?
It can, and that's the main risk. Rewrite tools optimise for natural phrasing, not accuracy, so numbers, qualifiers and modal verbs drift. Working in small sections, reviewing a word-level diff and running a protected-token check like the script above catches most of those changes before they're published.
How many words should I humanize at once?
A few hundred words per pass works best. Smaller sections give the tool less room to drift and make the diff easy to read. Keep headings, code blocks and tables out of the rewrite entirely, then paste each humanized section back and review it before moving on to the next.
Do I need paid tools for this workflow?
No. Git, Python's difflib and the script above are free, and Vale and Hemingway cover style and readability checks. For the rewrite itself, free tiers are enough for most docs if you work in sections, though limits vary by tool, so check each one's current free allowance first.
Verdict
Overall, UnAIMyText is the best free option for humanizing long drafts without losing meaning because it handles 500 words per run with no account, and you can diff the output with the script above.
Top comments (0)