Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1,077 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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 7.0.0

Try it in the browser — no install

Live screen capture of the hosted patina playground at patina.vibetip.help: an AI-sounding English announcement is typed in, rewritten naturally by the real server-side pipeline while the facts survive, and verified with MPS 100 and Fidelity 75 plus a deterministic AI-signal drop from 100 to 0

Paste AI-sounding text → patina rewrites it in place, keeps the facts (the "30 templates" number survives), and drops the deterministic AI signal 100 → 0 (MPS 100 / Fidelity 75).

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 — built for allowed AI-assisted drafting, not for evading detectors.

  • Auditable, not a black box — 184 named patterns drive every edit; --diff shows exactly what changed and why.
  • Meaning survives, verified — every rewrite is gated by meaning-preservation (MPS) and fidelity floors; drifted rewrites are retried or rolled back.
  • Three independent axes — Document Type owns genre, Persona owns voice, Register owns delivery. Omit any axis to preserve the source.
  • Every surface — agent skill (Claude Code · Codex · Cursor · OpenCode), Node CLI, and a browser playground.
  • Honest about limits — scores are editing signals, not authorship proof; our own pre-registered study publishes where rewriting fails alongside where it works.

Quick Start

Browser — nothing to install. Open patina.vibetip.help and paste text. Rewrites run server-side with the MPS/fidelity gates; API mode forwards your own key per request (never stored or logged).

Agent skill — paste this into Claude Code, Codex CLI, Cursor, or any agent:

Install patina by following https://raw.githubusercontent.com/devswha/patina/main/INSTALLATION.md

Then use it:

/patina --lang en

[paste your text here]

CLI — Node >= 18:

npx patina-cli --lang en input.txt          # rewrite
npx patina-cli doctor                       # check backends and keys

A logged-in codex, claude, or gemini CLI works with no API key: add --backend codex-cli. Full install options: INSTALLATION.md.

Three Independent Axes

patina does not infer one axis from another. Omit Persona and Register to keep the source voice and register.

Axis Controls Does not control Select with
Document Type Genre, purpose, structural conventions, pattern policy Voice, casual/professional delivery, meaning floors --document-type · config document-type · Playground "Document Type"
Persona Reusable voice fingerprint: vocabulary, rhythm, explanation habits Genre, pattern policy, register, meaning floors --persona · config persona · Playground "Persona"
Register casual or professional delivery Genre, persona identity, pattern policy --register · config register · Playground "Register"

Meaning preservation is the outer guard; an explicit value never fills an omitted axis.

Commands

patina input.txt                                          # rewrite with defaults
patina --audit input.txt                                  # detect patterns only
patina --score --offline --exit-on 30 input.txt           # deterministic CI gate, no API key
patina --diff input.txt                                   # pattern-by-pattern changes
patina --verify input.txt                                 # rewrite + MPS/fidelity floor check
patina --document-type email --register professional input.txt
patina persona new my-voice --from-sample past-posts.txt  # learn a reusable voice
patina --persona my-voice draft.md
patina --batch docs/*.md --outdir cleaned/

patina --help prints the full flag list. CI wrapper for GitHub Actions: devswha/patina-action — plus pre-commit, static-site, Docker, and release integrations.

Project config lives in .patina.yaml:

version: "7.0.0"
language: ko              # ko | en | zh | ja
document-type: default    # genre/purpose + pattern policy
persona:                  # optional reusable voice; omit to preserve source
register:                 # casual | professional; omit to preserve source

Facts

184 patterns 37 rewrite-capable + 9 score-only viral-hook per language (46 each across KO/EN/ZH/JA) — see the full 184-pattern catalog in PATTERNS.md
Modes rewrite · verify · audit · score · diff
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.

Documentation

License

MIT. See LICENSE and NOTICE. Inspired by oh-my-zsh, Wikipedia's "Signs of AI writing", and blader/humanizer.