npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

patina-cli

v6.2.0

Published

AI text humanizer CLI — detects and removes AI writing patterns

Readme

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

Paste AI-sounding text into the playground and patina rewrites it in place. The meaning floors verify the rewrite (MPS 100 / Fidelity 75 here — the "30 templates" fact survives), and the deterministic AI signal is measured before → after: the hot-paragraph ratio falls 100 → 0 while the hype ("thrilled to announce", "revolutionize your workflow", "unlock their full potential") is gone.

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

Quick Start

Browser playground

Open patina.vibetip.help — paste KO / EN / ZH / JA text for a real rewrite gated by the MPS/fidelity floors, with the deterministic AI signal measured before → after. Rewrites and scoring run server-side; the free tier uses the service's own model key (rate-limited). API mode forwards your own key per request through the patina server to the provider you pick — never stored or logged (metrics are sanitized: no text, prompt, output, key, or IP).

Agent skill

Let your coding agent install it — paste this into Claude Code, Codex CLI, Cursor, Gemini CLI, or any agent:

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

The agent fetches INSTALLATION.md (written for AI agents) and runs the right install path for your host, then verifies it. Or do it yourself:

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 professional
/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 — patina passes the strongest documented default model per backend. See Authentication (한국어).

For large --batch runs, prefer an OpenAI-compatible HTTP backend; local CLI backends are agent runtimes, capped conservatively with --timeout-ms, --max-concurrency, --max-retries, and --max-failures 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 · verify · audit · score · diff | | Surfaces | agent skill · Node CLI · in-place preview · browser playground (rewrite + score) | | Voice | --persona (built-in + your own, ko/en/zh/ja) is the sole voice axis · --tone register · --profile pattern policy — composable with a fixed precedence | | 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 --verify input.txt | rewrite, then check MPS/fidelity floors with one retry | | patina --tone auto --lang en input.txt | infer and apply a KO/EN tone axis | | patina --persona pragmatic-founder input.txt | rewrite in a built-in voice persona | | patina persona new my-voice --from-sample past.txt | author your own persona from a writing sample | | patina persona list | list built-in + custom personas | | patina persona show my-voice --json | print a persona's normalized config (never the docs body) | | patina persona edit my-voice --name "New Name" | copy-on-edit a persona into custom/personas/ | | patina persona rm my-voice | remove a custom persona (built-ins + preserve protected) | | 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.

Personas (voice)

A persona is a reusable voice — a built-in (patina persona list) or your own, authored without editing source:

patina persona new my-voice --from-sample past-posts.txt   # learn from your writing
patina persona new my-voice --describe "plain-spoken founder, casual"
patina --persona my-voice draft.md                          # then reuse it

patina persona show my-voice                                # inspect the normalized config (--json for machine output)
patina persona edit my-voice --name "Founder voice"         # copy-on-edit into custom/personas/ (built-ins stay intact)
patina persona rm my-voice                                  # remove a custom persona (--force to skip the confirm)

Works on ko/en/zh/ja and composes with --tone (register) and --profile (pattern policy). The persona is the sole voice owner; register precedence is --tone > persona. A persona shapes voice but never lowers the meaning floors — authored personas are validated on save, and the safety gate still enforces MPS/fidelity + dropped-number checks.

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: "6.2.0"
language: ko              # ko | en | zh | ja
profile: default
output: rewrite           # rewrite | diff | audit | score
tone:                     # casual | professional | auto  (register; genre = profile)

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.