AI-writing humanizer for KO/EN/ZH/JA
> /plugin marketplace add devswha/patina> /plugin install patina@patina
Repo: devswha/patina
What's inside
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.
--diff shows exactly what changed and why.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.
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.
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
| 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.
MIT. See LICENSE and NOTICE. Inspired by oh-my-zsh, Wikipedia's "Signs of AI writing", and blader/humanizer.
.claude-plugin/
marketplace.json
plugin.json
.cursor/
rules/
patina.md
.dockerignore
.env.example
.github/
ISSUE_TEMPLATE/
benchmark_corpus.yml
bug_report.yml
calibration_concern.yml
config.yml
false_positive.yml
feature_request.yml
pattern_proposal.yml
research_proposal.yml
PULL_REQUEST_TEMPLATE.md
workflows/
release.yml
test.yml
.gitignore
.insane-review/
FIX_DIFF.txt
pack_patina_20260715_220042_3496957_c27684.md
pack_patina_20260715_220307_3520503_074137.md
pack_patina_20260715_220619_3553582_b86ac4.md
pack_patina_20260715_220958_3584552_44eb09.md
pack_patina_20260715_221053_3598219_89ec42.md
pack_patina_20260715_221233_3613593_070815.md
pack_patina_20260715_221619_3650250_048c87.md
pack_patina_20260721_202043_587501_d82d35.md
pack_patina_20260721_204623_733340_713e8b.md
pack_patina_20260721_205052_761385_00e2dc.md
pack_patina_20260721_213215_1013817_af235e.md
projects.json
response_patina_20260721_205052_761385_00e2dc.md
response_patina_20260721_213215_1013817_af235e.md
response_prompt_20260715_224336_3884858_3dec3a.md
.mailmap
.patina.default.yaml
.pre-commit-hooks.yaml
agents/
patina-detector.md
patina-fidelity-auditor.md
patina-naturalness-reviewer.md
api/
packs.js
pro-monitor.js
rewrite.js
artifacts/
persona-calibration-2026/
.gitignore
affirmation-terms.json
ai-tells-catalog.md
calibration-round1.json
human-controls/
human-controls.notes.md
ko.jsonl
README.md
README.md
sources.jsonl
sycophancy/
sycophancy-corpus.jsonl
sycophancy-corpus.md
sycophancy-terms.json
ja-zh.jsonl
ja-zh.notes.md
korean.jsonl
korean.notes.md
korean2.jsonl
korean2.notes.md
linkedin-academic.jsonl
linkedin-academic.notes.md
multilang.jsonl
multilang.notes.md
press.jsonl
press.notes.md
reddit-hn.jsonl
reddit-hn.notes.md
video.jsonl
video.notes.md
x.jsonl
x.notes.md
tells/
tells-corpus.jsonl
tells-terms.json
lexical.jsonl
lexical.notes.md
structural.jsonl
structural.notes.md
rebaseline-2025/
.gitignore
human-controls.public.jsonl
intake.example.jsonl
intake.local.example.jsonl
manifest.en.scored.public.jsonl
manifest.ko.scored.public.jsonl
prompts.template.jsonl
README.md
rebaseline-2026.scored.public.jsonl
sources.ja-public.jsonl
sources.ko-public.jsonl
sources.zh-public.jsonl
assets/
brand/
patina-badge.svg
patina-icon.svg
patina-logo.svg
patina-mark.svg
demo/
patina-demo-live-en.gif
patina-playground-en.gif
patina-playground-en.png
patina-preview-en.gif
patina-preview-en.png
patina-preview-ko.gif
patina-preview-ko.png
README.md
social/
patina-before-after.svg
patina-og.svg
bin/
patina.js
CHANGELOG.md
CODE_OF_CONDUCT.md
CONTRIBUTING_KR.md
CONTRIBUTING.md
core/
scoring.md
standalone-prompt.md
stylometry.md
voice.md
cspell.json
custom/
patterns/
.gitkeep
profiles/
.gitkeep
DESIGN.md
Dockerfile
docs/
agents.md
AI-SLOP-TAXONOMY.md
API.md
ARCHITECTURE.md
audits/
2026-05-deep-research.md
AUTHENTICATION_KR.md
AUTHENTICATION.md
benchmarks/
detector-comparison.json
detector-comparison.md
katfish-ko-latest.json
katfish-ko-latest.md
latest.json
latest.md
lexicon-candidates.md
lexicon-freshness-en-2026-05-22.json
lexicon-freshness-en-2026-05-22.md
lexicon-freshness-ko-2026-07.md
perf-latest.json
perf-latest.md
README.md
rebaseline-audit-en-latest.md
rebaseline-audit-ko-latest.md
rebaseline-en-latest.json
rebaseline-en-latest.md
rebaseline-ko-latest.json
rebaseline-ko-latest.md
rebaseline-latest.json
rebaseline-latest.md
rebaseline-low-fpr-en-latest.json
rebaseline-low-fpr-en-latest.md
rebaseline-low-fpr-ko-latest.json
rebaseline-low-fpr-ko-latest.md
register-stratified-latest.json
register-stratified-latest.md
register-stratified.md
robustness-latest.json
robustness-latest.md
BRANDING.md
CLI.md
COMPARISON.md
COOKBOOK.md
DEMO.md
ETHICS.md
EXAMPLES_KR.md
EXAMPLES.md
EXIT-CODES.md
FALSE-POSITIVES.md
FAQ_KR.md
FAQ.md
FLAG-PARITY.md
GLOSSARY.md
HARNESS.md
integrations/
docker.md
github-action.md
playground.md
pre-commit.md
release.md
static-sites.md
ISSUE-WAVES.md
operations/
dashboards/
pro-launch-v1.md
dep-prod-disabled-20260803.md
free-tier-deepseek-flip-20260803.md
g002-collector-redesign.md
gate-b-readiness-20260803.md
live-open-20260804.md
number-safety-failure-rate-20260730.md
owner-actions-go-live.md
pay-b-binding-20260723.json
pay-b-binding-polar-20260729.json
pay-b-cost-20260724-cached.json.bundle.json
pay-b-cost-20260724.json.bundle.json
pay-b-cost-v1.md
pay-live-runtime-polar-20260729.json
pay-stg-binding-20260716.json
pay-stg-runtime-20260716.json
payment-provider-reset-20260729.md
polar-application-prep.md
polar-approval-20260803.md
polar-binding-migration.md
polar-form-answers.txt
polar-integration-evidence-20260729.md
polar-onboarding-steps.md
pricing-claude-sonnet-5.json
pricing-gemini-3.6-flash.json
pro-launch.md
pro-margin-decision-20260729.md
production-go-live-checklist.md
queries/
pro-launch-v1.md
register-failure-handoff-20260726.md
rollback-drills.md
secret-manager-record-20260803.md
serving-engine-cost-20260725.md
serving-engine-deepseek-0731-20260803.md
serving-engine-deepseek-0731-correction-20260803.md
synthetic-license-20260804.md
v6.4-preflight-hold.json
PATTERNS-EN.md
PATTERNS-JA.md
PATTERNS-KO.md
PATTERNS-ZH.md
PATTERNS.md
PRO-PACKS.md
research/
RESEARCH-DOCS-PLATFORM.md
2025-rebaseline-plan.md
2026-det-doc-verdict-calibration.md
2026-judge-calibration-prereg.md
2026-judge-calibration.md
2026-panel-v2-design.md
2026-rebaseline.md
2026-rewrite-efficacy-prereg.md
2026-rewrite-efficacy-study1.md
2026-rewrite-efficacy-study2.md
2026-rewrite-efficacy-study3.md
2026-rewrite-efficacy.md
adversarial-mps.md
ai-human-metrics.md
corpus-expansion-plan.md
human-eval-panel.md
humanization-data-backlog.md
ja-source-feasibility.md
judge-agreement.md
kakao-mimic/
artifacts/
engine_patina_judge.py
humanness_rewrite_dispatch.py
kakao_style_retrieval.py
kakao_style.py
root_patina_judge.py
test_patina_judge.py
ORIGIN-MANIFEST.md
README.md
ko-2025-corpus-sources.md
ko-translationese-scholarship.md
lexicon-freshness-audit.md
zh-ja-lexicon-calibration.md
zh-source-feasibility.md
ROADMAP.md
social/
gstack-cardnews.html
gstack-cardnews.md
gstack-thread.md
patina-launch-copy.md
patina-launch-korean-first.md
signs-of-ai-writing_KR.md
signs-of-ai-writing.md
x-content-backlog.md
superpowers/
specs/
2026-04-03-meaning-preservation-design.md
TRANSLATIONESE-KO.md
WORKFLOW.md
document-types/
academic.md
blog.md
casual-conversation.md
code-comment.md
commit-message.md
default.md
email.md
formal.md
instructional.md
legal.md
marketing.md
medical.md
namuwiki.md
narrative.md
release-notes.md
social.md
technical.md
eslint.config.js
examples/
01-failure-01.md
01-success-01.md
02-failure-01.md
02-success-01.md
03-failure-01.md
03-success-01.md
04-failure-01.md
04-success-01.md
05-failure-01.md
05-success-01.md
06-failure-01.md
06-success-01.md
07-failure-01.md
07-success-01.md
08-failure-01.md
08-success-01.md
09-failure-01.md
09-success-01.md
10-failure-01.md
10-success-01.md
11-failure-01.md
11-success-01.md
12-failure-01.md
12-success-01.md
13-failure-01.md
13-success-01.md
14-failure-01.md
14-success-01.md
15-failure-01.md
15-success-01.md
16-failure-01.md
16-success-01.md
17-failure-01.md
17-success-01.md
18-failure-01.md
18-success-01.md
19-failure-01.md
19-success-01.md
20-failure-01.md
20-success-01.md
21-failure-01.md
21-success-01.md
22-failure-01.md
22-success-01.md
23-failure-01.md
23-success-01.md
24-failure-01.md
24-success-01.md
25-failure-01.md
25-success-01.md
25-success-02.md
26-failure-01.md
26-success-01.md
26-success-02.md
27-failure-01.md
27-success-01.md
28-failure-01.md
28-success-01.md
28-success-02.md
29-failure-01.md
29-success-01.md
30-failure-01.md
30-success-01.md
31-failure-01.md
31-success-01.md
32-failure-01.md
32-success-01.md
33-failure-01.md
33-success-01.md
34-failure-01.md
34-success-01.md
35-failure-01.md
35-success-01.md
36-failure-01.md
36-success-01.md
37-failure-01.md
37-success-01.md
document-types/
namuwiki-01-after.md
... 839 moreFAQ
patina is a Claude Code plugin with 1 hand-picked skill for content work, indexed on Flowy. Install it with the command on its page. It includes patina. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.