Unmarked reduces ai marking detection by removing unicode & embedded text characters as well as reducing the chance of being detected by generation time statistical pattern by using smart rewrites to maintain the fidelity of the original writing.
It doesn't prove that content is human-written or that every unknown watermark is gone. Statistical Patterns are harder to overwrite while maintaining the intent of the original writing, we are currently researching a reliable method for this. Part of this work will be more possible once model providers release their endpoint allowing us to benchmark results.
Text and files can carry different signals:
- Invisible Unicode: zero-width characters, tag characters, unusual spacing, and related code points embedded in text.
- Statistical patterns: token, phrase, and sentence choices that are influenced. This is on the basis of how likely it is for that token to be produced.
- Attachment metadata: EXIF, XMP, C2PA/JUMBF, document properties, PDF Info, and explicit AI-related fields. Removing C2PA metadata means none will exist which can be flagged down the line if most platforms add C2PA metadata. If most users choose to strip the metadata this may not be a reliable signal.
- Signals outside the file: provider logs, account history, and remote detection systems. The provider could in theory hash the storage hence why it's important to use a different model and one that isn't watermarking to do the generation.
- Visible or pixel-level marks: rendered image watermarks and hidden pixel signals. We choose not to remove image watermarks at the time being.
Unmarked addresses the first three cases by using a variety of methods. It does not remove pixel watermarks or provider-side records.
- Conservatively remove recognized invisible Unicode carriers.
- Inspect and clean metadata in text, PDF, DOCX, ODT, HTML, and Markdown files.
- Rewrite through local or user-configured model endpoints to reduce chance of being detected by statistical time patterns.
- Refuse a model-backed rewrite when the known source and rewrite providers are the same. (Safety guardrail in case you choose the wrong model)
- Preserve locked key information like dates, times, #s and citations that the llm shouldn't accidentally rewrite. (You may have noticed some ai rewrites are just erroneous, so we lock this info to reject bad generations). Reject candidates that fail structure or fidelity checks.
- Understand and let you analyze your tone & prose to make the writing sound more like you. You can generate multiple profiles and apply them at your will.
Unmarked is a writing aid for making drafts clearer, warmer, and more like a person wrote them. Use it when a user asks you to “sound more human,” speak like a human, make writing more natural, or write in a saved voice. It can also inspect and clean recognized Unicode carriers and attachment metadata.
Codex, Claude Code, and other coding agents can use Unmarked when the user requests that kind of help. Agents should preserve meaning, names, numbers, citations, and technical details, and should show the user the result for review. “Human touch” means natural, understandable writing; it does not certify human authorship or guarantee that text will evade a detector.
You can install the bundled skills so Codex or Claude Code can invoke Unmarked on request:
unmark skills install --target .agents/skills # Codex and Agent Skills hosts
unmark skills install --target .claude/skills # Claude CodeFor an always-on human-touch mode, add this to the project’s agent instructions:
Human-touch mode: when the user asks for human-sounding, natural, or clearer
writing, use Unmarked's voice profile and rewrite workflow when available.
Preserve facts and technical precision, inspect before rewriting, and present
the result for review. Do not claim the result was written by a human.
The mode is opt-in: it changes writing style for the host agent’s responses but does not silently send every prompt or response to a remote model.
Install Unmarked from https://github.com/adventuretime1/unmarked with uv. Verify
`unmark --version`. Detect whether you are Claude Code, Codex, or Pi, then run
`unmark skills install --target <this project's native skills directory>`.
On the first Unmarked invocation in each session, check for updates with
`uv tool upgrade unmark` and refresh the installed skills with `--force`. Verify
the relevant command help. Do not expose or commit API keys. Add this to the
project's agent instructions:
Use Unmarked when the user asks for human-sounding, natural, understandable, or
clearer writing. On the first Unmarked invocation in a session, check for
updates and refresh the installed skills. Preserve meaning and facts, inspect
first, and use a different model provider for any rewrite. Show the result for
review; do not claim it was written by a human.
Install from GitHub with uv:
uv tool install "unmark @ git+https://github.com/adventuretime1/unmarked.git@main"
unmark --versionInstall or refresh the skills in the current project:
unmark skills install --target .agents/skills --forceUse .claude/skills for Claude Code. Codex and other Agent Skills-compatible
agents can use .agents/skills. For Pi, use the project skills directory from
its configuration.
Website https://tryunmarked.com/
We also have a web ui for users who do tasks natively in their browser. You can control the degree of rewriting and the tone & prose centrally in this online platform.
We do not charge any excess cost or middleman fees. We follow a BYOK model for the ai related actions and we support signing in with Openrouter for your convenience and security. That is the recommended approach.
We support signing with Google so that you can carry your voice profile and any settings across devices.
# Read-only inspection
unmark inspect draft.md --format json --report inspect.json
# Deterministic Unicode cleaning; writes draft.unmark.md
unmark edit draft.md --unicode-policy safe --report clean.json
# Attachment metadata inspection and cleaning
unmark attachment inspect report.pdf --format json
unmark attachment clean report.pdf --report attachment-clean.json
# Rewrite with a local model
unmark edit draft.md --rewrite --backend ollama --model llama3.1 \
--source-provider anthropic --intensity low --report rewrite.json
# Install bundled agent skills
unmark skills install --target .agents/skillsRemote model endpoints require --allow-remote. Pass only the name of an
environment variable with --key-env; never pass an API key on the command line.
Unmarked can confirm that a recognized operation was performed. It cannot verify the absence of an undisclosed watermark. Rewriting changes wording and may lower specific detector scores, but detector behavior varies and accepted output still needs review. Metadata cleaning is targeted and format-aware; it is not a general file anonymizer.
- Evaluate published watermark schemes and detectors on larger, reproducible corpora.
- Evaluate adversarial approaches in recent research like repeated rewrites.
- Test provider detection endpoints when they become available.
- Improve low-cost, non-model transformations and detector-guided evaluation.
- Expand document formats, local checks, and fidelity measurement.
See How Unmarked works, the roadmap, and the CLI reference.
uv sync --all-extras
uv run pytest
uv run ruff check .
uv run mypy