Skip to content

devswha/patina

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

625 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

patina mark

patina

Strip the AI packaging. Keep the meaning.

한국어 · 中文 · 日本語 · English

Tests License: MIT Skill: Claude Code | Codex | Cursor | OpenCode Languages: KO | EN | ZH | JA Version 5.4.0

Try the browser audit — no install

patina is a deterministic, pattern-based humanizer for Korean, English, Chinese, and Japanese. It finds AI-sounding phrasing and rewrites it without changing the claim, numbers, polarity, or causation.

It is not a black-box paraphraser, authorship detector, or detector-bypass tool. patina is built for allowed AI-assisted drafting where the author wants cleaner voice, an audit trail, and meaning-preservation checks.

Demo

--preview is the main sample: patina snapshots a live URL or local .html, rewrites only the prose blocks, and renders the result back onto the page. The floating bar switches between Rewritten / Original / Both / Diff, jumps between every changed block, and shows the deterministic score before → after.

Animated patina --preview demo toggling rewritten, original, both, and diff views on a Notion Template Pack page; the page layout stays fixed while AI-sounding phrasing is replaced and the score falls from 60 to 0

patina --preview --lang en page.html         # a local .html file
patina --preview https://example.com/post     # or a live URL

The sample keeps the page structure, headings, CTA, and concrete facts (30 templates, planning docs, handoffs). It removes inflated phrasing like “innovative solution,” “transform productivity,” and “new paradigm” with an inline audit trail instead of a black-box paraphrase.

More examples: Before/After Gallery (한국어) · CLI transcript.

Quick Start

Browser audit

Open patina.vibetip.help to score KO / EN / ZH / JA text in your browser. The playground is audit-only: it does not rewrite text, call external LLMs, or send API keys to a server. For Korean, the browser and CLI may surface translationese / koPostEditese.v1 metadata as editing hints; this metadata is advisory only, is not calibrated score input, and must not drive hot paragraphs, gates, severity, baselines, percentiles, benchmark claims, prompt/rewrite gates, or authorship verdicts.

Agent skill

Claude Code — plugin marketplace (no clone, recommended):

/plugin marketplace add devswha/patina
/plugin install patina@patina

Claude Code · Codex CLI · Cursor · OpenCode — install script:

curl -fsSL https://raw.githubusercontent.com/devswha/patina/main/install.sh | bash

Then run the skill from Claude Code, Codex CLI, Cursor, or OpenCode:

/patina --lang en

[paste your text here]

Useful skill calls:

/patina --tone narrative
/patina --tone auto --lang en

Standalone CLI

Requires Node.js >= 18.

npx patina-cli doctor
npx patina-cli --lang en input.txt

Use a logged-in local model CLI without an API key:

printf '%s\n' 'Coffee has emerged as a pivotal cultural phenomenon.' \
  | npx patina-cli --lang en --backend codex-cli

Supported local backends: codex-cli, claude-cli, gemini-cli, kimi-cli. Without --model, patina passes the strongest documented default per backend: gpt-5.5 for OpenAI/Codex, claude-sonnet-4-6 for Claude, gemini-2.5-pro for Gemini, and kimi-code/kimi-for-coding for Kimi Code. See Authentication (한국어).

For large --batch rewrites, prefer an OpenAI-compatible HTTP backend. Local CLI backends are agent runtimes; patina caps them conservatively, uses compact prompts for them, and exposes --timeout-ms, --max-concurrency, --max-retries, --max-failures, and --max-failure-rate for batch safety.

What You Get

168 patterns 33 rewrite-capable + 9 score-only viral-hook per language (42 each across KO/EN/ZH/JA) — see the full 168-pattern catalog in PATTERNS.md
Modes rewrite · audit · score · diff · ouroboros
Surfaces agent skill · Node CLI · in-place preview · browser audit playground
Free usage logged-in codex, claude, or gemini CLI can run rewrites without PATINA_API_KEY
Calibration 67.3% editing-hotspot catch [63.5–71.0%] across GPT-5.5 / Claude Sonnet 4.6 / Gemini 2.5 Pro (n=600, KO+EN); 16.0% false positives [11.6–21.7%] on KO+EN human controls (n=200)
License MIT

Scores are editing signals with false positives and false negatives, not proof of authorship. See Ethics.

Common Commands

patina --lang <ko|en|zh|ja> [mode] [--profile <name>] input.txt
Command Purpose
patina input.txt rewrite with defaults
patina --audit input.txt detect patterns only
patina --score input.txt output a 0-100 AI-likeness score
patina --score --exit-on 30 input.txt CI gate with exit code 3 when overall > 30
patina --diff input.txt show pattern-by-pattern changes
patina --preview page.html render rewrites back onto a saved HTML page with toggles and inline diff
patina --ouroboros input.txt iterate with MPS/fidelity rollback
patina --tone auto --lang en input.txt infer and apply a KO/EN tone axis
patina --format json --quiet input.txt script-friendly output
patina --batch docs/*.md --outdir cleaned/ batch file processing

patina --help prints the full flag list. patina doctor --json checks Node, backend, tmux, and API-key readiness without making an LLM call.

CI

For GitHub Actions, the maintained wrapper is shorter than hand-rolled setup:

name: Patina prose score
on:
  pull_request:
    paths: ['**/*.md', '**/*.mdx']
permissions:
  contents: read
  pull-requests: read
  issues: write
jobs:
  patina:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: devswha/patina-action@v1
        with:
          score-threshold: 30
          lang: auto
          comment: true

Other integrations: pre-commit, static sites, Docker, release workflow.

How It Works

Input
  -> semantic anchor extraction (claims, polarity, causation, numbers)
  -> stylometry + AI-lexicon scan
  -> pattern-guided rewrite
  -> self-audit and MPS/fidelity checks
  -> cleaned text

If meaning drifts, the change is retried or rolled back. Deterministic analysis lives in src/features/*; LLM-backed rewrite and score calls use the selected backend.

Configuration

# .patina.default.yaml
version: "5.4.0"
language: ko              # ko | en | zh | ja
profile: default
output: rewrite           # rewrite | diff | audit | score
tone:                     # casual | professional | academic | narrative | marketing | instructional | auto

Project .patina.yaml overrides defaults. Pattern packs are auto-discovered by language prefix. Additive list keys (blocklist, allowlist, skip-patterns) merge; other arrays replace.

Documentation

Start here:

Brand assets and usage rules live in Branding. Design notes live in DESIGN.md.

Acknowledgements

Inspired by oh-my-zsh's plugin architecture, Wikipedia's "Signs of AI writing", and blader/humanizer.

License

MIT. See LICENSE and NOTICE.

About

Detects and rewrites AI writing patterns in Korean, English, Chinese, and Japanese. Runs as a skill for Claude Code, Codex CLI, Cursor, and OpenCode, or as a standalone Node.js CLI.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages