ghost

A writing tool that rewrites or drafts text to match the user's established writing style. It can use a personal profile describing preferred wording, sentence patterns, and sign-offs.

In plain words
What is it for?
Use it to rewrite messages, improve drafts, or prepare replies in the user's own voice.
Why use it?
It reduces generic-sounding edits and avoids repeatedly explaining how the user normally writes.

Skill for Claude CodeCodex

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add skills/an2n/ghostwriter/ghost
Any agent
npx skills add an2n/ghostwriter --skill ghost
Clone the repo
git clone --depth 1 https://github.com/an2n/ghostwriter

Made for: Claude Code, Codex.

Per session 83 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 2,585 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00083 $0.02585
Opus 5 $0.00042 $0.01293
Sonnet 5 $0.00017 $0.00517
Haiku 4.5 $0.00008 $0.00259

Measured 2d ago against content hash 79fd32dced5f, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

ghost scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

skills/ghost/SKILL.md · 161 lines

How it starts

The opening of the file, as written. The whole thing — 161 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Ghost

Write or rewrite text so it sounds like the user wrote it, not like an assistant wrote it.

Voice profile

This skill ships in a shared repo, so the profile itself does NOT live in this repo or in any project's memory system (project memory is scoped to one working directory; this skill needs to work from any of them). It lives in one fixed personal file:

~/.claude/ghostwriter-profile.md

  • If that file exists: read it and apply it. It has the user's real sentence-length pattern, vocabulary they actually use vs. avoid, how they open paragraphs/messages, and specific tics. Trust it over any generic default below.
  • If it doesn't exist yet: ask once for 2-3 samples of things the user has actually written (Slack, email, LinkedIn, whatever's natural for the register in question). Distill a profile (sentence length variance, real vocabulary, opener habits, tics, how they sign off or don't) and write it to ~/.claude/ghostwriter-profile.md so future invocations, in any project, skip this step. Then apply it to the task at hand.
  • Never commit or copy this file into a project repo. It's personal, machine-local data, not part of the plugin.
  • If the user corrects the tone, register, or a specific word choice more than once in a session, that's a signal the profile has drifted from how they actually write now. Offer to update ~/.claude/ghostwriter-profile.md with what changed — don't rewrite it silently on a single correction, since one atypical piece of feedback isn't a reliable basis for changing a profile built from real samples.

Rules regardless of profile

  • No genre templates. A "new job" post, a "thanks for the feedback" reply, a "following up" email all have a default AI shape (tricolon of nice things, nervous-but-excited contrast, CTA question). Break the shape even when individual sentences pass style checks — templated structure is a stronger tell than word choice.
  • No setup → tease → punchline joke structure ("Can't say more yet. [reveal]. So [ironic tag line].") This is the single most common way AI fakes personality in marketing copy. It isn't a named tell in check's catalog, so it needs calling out here. Everything else that pattern-family covers — comparative framing ("more X than Y"), aphorism/landing-phrase closers, parallel-subject mirrors, repeated openers, binaries — is already covered by the post-rewrite check audit below; it isn't duplicated here since that's a real invocation now, not a remembered checklist.
  • Status lines are plain text, no leading symbol (no >, no bullet, no emoji) — a leading > renders as a blockquote bar in this client, which isn't wanted here.
  • Emit each status line as its own text output immediately after that skill call returns, before invoking the next skill — not batched together at the end. The tool calls and the status lines interleave in the actual order things happen: call check, then write its status line, then call polish, then write its status line, and so on. Never collect them and print them all in a block right before the final text.
  • If there is existing text to rewrite (not a from-scratch draft), invoke check with the Skill tool on that input text first, and use its findings to target the rewrite at what's actually firing instead of running every move uniformly.
  • That input is usually the user's own writing, so read the voice profile before that call and filter what comes back. A tell whose evidence is a documented profile trait is a false positive here: drop it before the findings reach polish, and keep it out of the status line too. The profile is the record of how this person actually writes, so scoring one of its traits as an AI tell and then polishing it out is the rewrite deleting the voice it exists to preserve. Same for anything check's own calibration already weighs toward human, first-person ambivalence and unresolved tension especially.
  • What survives that filter is what the rewrite acts on, so the status line reports the count of surviving findings, never a verdict tier - a verdict on the user's own prose is noise, and on a short post it's an unreliable read besides. Checked input - 2 tells to fix, rest is your voice says the useful part. reads AI, 4 tells fired doesn't. If nothing survives, say that (Checked input - nothing to fix, going straight to voice) rather than inventing work for polish to do.
  • Then invoke the polish skill with the Skill tool. The arguments passed to that call must literally include check's findings from the previous step (the specific tells and quoted evidence, not just "clean this up") — "directed by what check found" only happens if the findings are actually in the args; don't rely on them being visible earlier in the conversation, put them in the call itself. After it returns, write its status line, e.g. Cleaned draft. Do not apply its moves from memory — memory drifts and skips steps the actual skill text enforces (its pre-output gate, its full banned-word list). Load it, then draft the baseline hygiene pass for real (burstiness, no hedge padding, no banned AI vocabulary, punctuation normalization), targeted at what check found on the input.
  • Then layer the voice profile on top, as its own distinct step with its own status line, e.g. Applied voice profile. The profile overrides polish's generic defaults wherever they conflict (e.g. if the user's real writing runs short and fragmented, don't "improve" it toward more complete sentences). This step doesn't call a Skill tool, but it's real work being done to the draft, so it still gets reported like the others — don't let it happen silently just because there's no tool call attached to it.
  • The override only covers structural and mechanical habits the profile actually documents — sentence length, fragments, punctuation like a mid-sentence en-dash aside. It is not a blanket exemption for whatever content happens to sit inside a matching construction. A profile trait says "this shape is how the user writes," not "anything wearing this shape is above scrutiny." If a matching construction is carrying content that's independently generic (a stock compliment, an empty-uplift closer, praise with no specific behind it), that's still worth a redraft using the user's own concrete, specific style rather than kept just because the wrapper matched.
  • Matching a trait also means matching its scale, not just its presence. If the profile's example of an en-dash aside is two words on each side, stuffing a three-item comma list behind the same dash isn't "the same trait" - it's a heavier construction wearing similar punctuation, and check's clause-stacking tell will fire on it regardless of how well the dash itself matches the profile. Same logic for any other trait with a size to it: "sparing emoji" means matching the documented count, not just using an emoji; "drops the subject pronoun sometimes" means sometimes, not in every sentence. Check the actual proportions of the example against what's being produced, not just whether the same kind of thing is present.
  • The profile is built from the user's own first-person writing, so it has nothing to say about phrasing for third-person content where the user isn't the one speaking (a news blurb, an encyclopedia-style paragraph, a quote from someone else). Don't force sentence fragments or personal tics onto that register just because the profile has them. Still report this step — say what actually happened instead of silently skipping the line, e.g. Voice profile - not first-person content, applied general principles only (flat facts over inflated framing, no brochure language, real sentence-length variance still apply regardless of register).
  • For "reply to this": match the register of what's being replied to, but keep the user's voice. A reply to a client email isn't a LinkedIn post.
  • Output the rewritten/drafted text only, no preamble beyond the status lines above. No trailing result line after the text — the status lines already told the user what happened as it happened, so there's nothing left to summarize.
  • Never print check's full report (the Verdict/Confidence/Score block, the signal breakdown table, the evidence log) as part of this flow — only the one-line status per invocation. Give the full report only if the user asks for it afterward.

Read the full file on GitHub · 161 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 2d ago First seen · 161 lines · 83 tokens per session scan A 79fd32dced5f

Subscribe to this mod's changes

ghost is a skill published in the GitHub repository an2n/ghostwriter (1 stars, last pushed 6d ago), licensed MIT. It adds 83 tokens to every session and 2,585 once invoked, about $0.0004 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.

Related

Other skills, from other repositories

writing-antipatterns

When editing, creating, writing content and articles to avoid AI writing patterns ("AI-isms") that make text sound machine-generated. Follow the guidelines in the skill description to audit, rewrite, and summarize changes.

zebbern/termstack · 48 tokens

apm-usage

Activate when the user asks about APM (Agent Package Manager): installing, configuring, authoring, or troubleshooting AI-agent packages, dependencies, compilation, MCP servers, policy, or any apm CLI command.

microsoft/apm · 49 tokens

clean-user-facing-text

Audit and finalize authorized natural-language text meant for readers: strip suspicious invisible Unicode, then rewrite prose while keeping facts, meaning, and the writer's voice. Use when the user asks to clean, humanize, polish, or finalize articles, manuscripts, reports, documentation, emails, product copy, UI…

ShadowAqueduct/watermark-remover · 121 tokens

patina

Detect and rewrite AI writing patterns in Korean, English, Chinese, and Japanese text so it reads as if a human wrote it. Meaning-preservation (MPS) verified.

devswha/patina · 38 tokens

sessions

Search and ask questions about coding agent session history across Claude Code, Codex, and Cursor. Use when asking what was worked on, what was tried before, how a problem was investigated across sessions, what happened recently, or any question about past agent sessions. Also use when the user references prior…

slopus/happy · 78 tokens

codex-autoresearch

Run autonomous, measurable experiments in a Git repository: change one hypothesis, verify a numeric metric, keep improvements, and revert failures. Use when the user wants Codex to keep iterating toward a numeric target in the foreground or as a detached background run. Do not use for ordinary one-shot coding…

leo-lilinxiao/codex-autoresearch · 80 tokens