humanizer

Other

blader/humanizer

Agent skill that removes signs of AI-generated writing from text.

Overview

Markdown-based agent skill that detects common AI-writing patterns and rewrites text to sound human. Uses 35 Wikipedia-derived patterns, preserves factual details, and can match a writer's personal voice for agents that support skills.

README Preview

# Humanizer\n\n[](https://skills.sh/blader/humanizer)\n\nHumanizer rewrites AI-sounding text so it reads like a person wrote it, without changing what it says. Because it is just Markdown, it works with any agent that supports skills.\n\n## How it works\n\nHumanizer uses 35 patterns from Wikipedia's ["Signs of AI writing"](https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing), maintained by WikiProject AI Cleanup. It makes a first pass without treating the original structure as fixed. Then it checks the draft against those patterns and the original claims before rewriting whatever still needs work.\n\n> "LLMs use statistical algorithms to guess what should come next. The result tends toward the most statistically likely result that applies to the widest variety of cases."\n\nIt does not make things up. A name, number, date, quote, citation, or other factual detail must come from the source or the writer. For personal writing, Humanizer keeps the writer's style. Technical and reference prose stays neutral and plain. If you provide a writing sample, Humanizer follows that sample instead of its default style rules.\n\nWhen you paste text, Humanizer shows its work before giving you the final version. You see the first rewrite and a short critique of anything that still sounds artificial. Point it at a file and it changes only the prose, leaving code, data, frontmatter, and link targets alone.\n\n## Usage\n\nCall the skill directly:\n\n```\n/humanizer\n\n[paste your text here]\n```\n\nOr ask in plain language:\n\n```\nPlease humanize this text: [your text]\n```\n\nTo rewrite a file, give Humanizer its path:\n\n```\nHumanize the prose in docs/launch-post.md\n```\n\n### Match your voice\n\nIf you want the rewrite to sound more like you, include a sample:\n\n```\n/humanizer\n\nHere's a sample of my writing for voice matching:\n[paste 2-3 paragraphs of your own writing]\n\nNow humanize this text:\n[paste AI text to humanize]\n```\n\nHumanizer follows the sample's rhyt

FAQ (3)

Troubleshooting
Can the Humanizer plugin bypass or defeat AI detectors such as Pangram?

No. Humanizer is designed to rewrite AI-generated text so it reads better to humans, not to evade AI detectors. In the reported blind study, detection scores barely changed: 100% → 98.6% → 97.8% for raw output, the rewrite pass, and rewrite plus checker. Pangram 4.0 returned 100% AI on all four tested variants, including a version with only sentence-boundary changes. The maintainer confirms that pure LLM prompting cannot currently defeat Pangram and that bypassing detectors is not a project goal. Use Humanizer to improve readability and reduce lexical AI tells; do not rely on it to pass AI-detection tools.

GitHub Issue #229
How-to
How do I make Humanizer load automatically in every OpenCode session?

Upgrade to OpenCode 1.18.29 or newer; Humanizer guidance is injected automatically when OpenCode runs from the repository, with both V1 and V2 plugin hooks supported. For a manual setup on older versions, create .opencode/plugins/humanizer.mjs that reads SKILL.md, strips its frontmatter, and pushes the rules into the system prompt using the experimental.chat.system.transform hook:

import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';

const __dirname = path.dirname(fileURLToPath(import.meta.url));
const skillPath = path.resolve(__dirname, '../../SKILL.md');

export default async () => ({
  'experimental.chat.system.transform': async (_input, output) => {
    const body = fs.readFileSync(skillPath, 'utf8')
      .replace(/^---[^\S\r\n]*\r?\n[\s\S]*?\r?\n---[^\S\r\n]*(?:\r?\n|$)/, '')
      .replace(/(?:\r?\n)+$/, '');

    output.system.push(
      'HUMANIZER MODE ACTIVE. Apply these rules to assistant prose while preserving code, commands, paths, structured data, URLs, quoted text, and exact-output requests.\n\n' + body
    );
  },
});

Restart OpenCode and verify by asking whether the Humanizer plugin is active.

GitHub Issue #279
Troubleshooting
How do I fix AI-sounding PR comments that over-explain context the reader already knows?

Use Humanizer's conversational-context check, added as pattern #26 in the fix for issue #269. Upgrade to a release containing that PR, then apply these rules when rewriting a reply: (1) identify whether the text is a response in an ongoing thread; (2) assume shared context already established in the PR, Slack, or email conversation; (3) remove repeated diagnosis, proof of investigation, queries, and metrics unless they are needed to support the decision; (4) put the actual decision or ask first; and (5) keep only the minimum reasoning required. For example, replace a full root-cause and backfill explanation with: “Changing MergeService here would expand this PR’s scope. I’d prefer to keep this Client A-specific and open a separate ticket for the MergeService fix and backfill. LMK if that works.”

GitHub Issue #269