A local-first personal voice layer for AI agents. Bring your voice to any agent. Adapt to any audience without losing yourself. Humanize AI-generated drafts by rewriting them in your own calibrated voice: PR comments, Slack replies, docs, RFCs, and emails.
FAQ
voice-layer is a Claude Code plugin with 4 hand-picked skills for content work, indexed on Flowy. Install it with the command on its page. It includes calibrate-my-voice, write-in-my-voice, calibrate-my-voice. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
> /plugin marketplace add ymeiri/voice-layer> /plugin install voice-layer@voice-layer
Repo: ymeiri/voice-layer
A local-first personal voice layer for AI agents.
Bring your voice to any agent. Adapt to any audience without losing yourself.
Humanize AI-generated drafts by rewriting them in your own calibrated voice: PR comments, Slack replies, docs, RFCs, and emails.
voice-layer gives Claude Code and Codex a reusable local profile for writing
like you: direct where you are direct, careful where you are careful, and shaped
for the channel without flattening into generic AI prose. It is a local-first AI
writing assistant for personal voice, not a generic humanizer prompt.
generic AI draft + local voice-profile.md -> PR comment | Slack reply | RFC | email

The demo uses only the synthetic profile in this repo.
Homebrew install:
brew tap ymeiri/voice-layer
brew install voice-layer
voice-layer install --agent both
voice-layer doctor --agent both
Remove skills while preserving your profile:
voice-layer uninstall --agent both
Delete local profile data only when you explicitly mean it:
voice-layer purge --yes
Clone-based install also works:
./voice-layer install --agent both
./voice-layer doctor --agent both
This repo currently ships the reference implementation as two Agent Skills:
write-in-my-voice: drafts or rewrites Slack replies, emails, PR
descriptions, review comments, docs, design docs, RFCs, issue updates, and
similar text.calibrate-my-voice: builds a local voice profile from samples you
explicitly approve.The repo and plugin packages use the voice-layer name. The commands are
verbs: one for writing, one for calibration.
Current packaged support is Claude Code and Codex. "Bring your voice to any agent" is the long-term direction; Cursor and other agents are not claimed as supported until their package and invocation behavior are verified. See docs/support-matrix.md.
Why this is not just a prompt:
voice-profile.md, stored outside the repo.AI agents are good at producing text. They are much worse at preserving the person behind the text.
Most AI-polishing tools remove a few cliches. That is not enough. Real writing depends on voice, channel, audience, context, document shape, and boundaries. A message can be more corporate-friendly, more direct, or easier for a different audience to read without erasing the person who wrote it. A design doc can also keep the user's structure, depth, risk framing, and decision style.
If you are searching for an AI text humanizer, voice-layer is the stricter
version of that idea: it humanizes AI-written text by applying an explicit,
auditable voice profile that you control.
voice-layer treats style as a portable profile:
voice + vibe + channel + audience + guardrails -> usable draft
You can test the core loop without connecting Slack, Google Docs, GitHub, email, or any private workspace. The repo includes a synthetic profile at tests/fixtures/profiles/valid-profile.md.
Install the Claude Code skill from this checkout, then launch Claude Code with the bundled profile:
./voice-layer install --agent claude --mode symlink
VOICE_LAYER_PROFILE="$PWD/tests/fixtures/profiles/valid-profile.md" claude
Then ask Claude Code:
/write-in-my-voice draft a PR comment from this:
Change parseWidgetConfig() in src/widgets/config.ts.
Goal: fix FOO-123.
Behavior is behind ENABLE_WIDGET_V2=true.
Tests: npm test -- widgets/config.test.ts.
Concern: we should make sure invalid widget types still return the existing validation error.
A real zero-data Claude Code run produced:
Patch parseWidgetConfig() in src/widgets/config.ts for FOO-123. Gated on
ENABLE_WIDGET_V2=true.
One thing to confirm before this lands: invalid widget types should still
return the existing validation error, not fall through to the new path. Worth
an explicit test case alongside npm test -- widgets/config.test.ts.
The same facts can be shaped for another channel:
/write-in-my-voice make this suitable for a short Slack update to the team:
Change parseWidgetConfig() in src/widgets/config.ts.
Goal: fix FOO-123.
Behavior is behind ENABLE_WIDGET_V2=true.
Tests: npm test -- widgets/config.test.ts.
Concern: invalid widget types should still return the existing validation error.
Output:
Patching parseWidgetConfig() in src/widgets/config.ts for FOO-123, gated on
ENABLE_WIDGET_V2=true. Tests: npm test -- widgets/config.test.ts. Watch item:
invalid widget types should still hit the existing validation error. Flagging
in case anyone sees otherwise.
The broader synthetic example set lives in examples/README.md. No examples are based on a real person.
From a clone of this repo, if you are not using Homebrew:
./voice-layer install --agent both
./voice-layer doctor --agent both
Restart Claude Code or Codex after installing.
The CLI links the skills into:
~/.claude/skills~/.agents/skillsIt also creates the local profile path:
~/.config/voice-layer/voice-profile.md
Preview file changes before installing:
./voice-layer install --agent both --dry-run
Remove skill links without deleting your profile:
./voice-layer uninstall --agent both
Delete local profile data only with an explicit purge:
./voice-layer purge --yes
For Homebrew, plugin/marketplace installs, uninstall, and troubleshooting, see docs/install.md.
Before calibration, write-in-my-voice can still remove generic AI writing
patterns, but it does not know your voice yet.
Claude Code:
/write-in-my-voice rewrite this Slack reply:
Great question! It is important to note that we could potentially leverage this robust approach.
Codex:
Use $write-in-my-voice to rewrite this Slack reply:
Great question! It is important to note that we could potentially leverage this robust approach.
Start calibration when you want the skill to learn your style:
/calibrate-my-voice build my local voice profile.
The calibrating agent should first inspect what source tools are available in the current session, then ask which sources it may use. It can work from pasted samples, exports, local git commits, code reviews, chat, email, docs, or project-management tools such as Linear, Jira, Asana, Monday.com, or internal trackers.
It must not read any source until you approve the source, scope, date range, author filter, and retention mode.
voice-layer separates stable identity from temporary adaptation:
corporate-friendly or
chill-rock-star.The key rule:
Voice is portable. Culture is not a costume.
This repo does not include a hosted service, telemetry, or personal samples. CI runs a static no-silent-telemetry guard over executable repo code:
voice-layer is not an AI detector bypass tool. It is meant to help users
communicate honestly in their own style, with local profile data they can
inspect and delete.
python3 scripts/check_no_silent_telemetry.py
The generated profile stays local by default at:
~/.config/voice-layer/voice-profile.md
Read PRIVACY.md before calibrating from private workspaces.
python3 scripts/sync_core.py --check
python3 scripts/validate_repo.py
python3 scripts/check_no_silent_telemetry.py
python3 scripts/validate_profile.py ~/.config/voice-layer/voice-profile.md
python3 scripts/evaluate_examples.py
python3 scripts/evaluate_behavior.py
python3 scripts/evaluate_behavior.py --print-pilot-prompts
python3 -m unittest discover -s tests
.agents/
plugins/
marketplace.json
.claude-plugin/
marketplace.json
.github/
ISSUE_TEMPLATE/
bug_report.yml
feature_request.yml
PULL_REQUEST_TEMPLATE.md
workflows/
ci.yml
.gitignore
AI_TELLS.md
assets/
brand/
demo-thumbnail.png
logo-dark.svg
logo-mark.svg
logo.png
logo.svg
previews/
logo-dark.png
logo-on-white.png
logo.png
package-icon-on-white.png
package-icon.png
prompts.md
readme-hero.png
readme-hero.svg
social-preview.png
demo/
voice-layer-demo.gif
CHANGELOG.md
CODE_OF_CONDUCT.md
CONTRIBUTING.md
core/
profile/
schema.json
voice-profile.template.md
README.md
references/
ai-tells.md
channel-conventions.md
profile-contract.md
source-adapters.md
source-menu.md
scripts/
collect_git_samples.py
skills/
calibrate-my-voice.md
write-in-my-voice.md
docs/
evaluation.md
implementation-roadmap.md
install.md
launch-playbook.md
rc0-results.md
rc0-validation.md
release-audit.md
release-checklist.md
support-matrix.md
visual-identity.md
evals/
behavior/
runs/
README.md
scenarios.json
examples/
archetypes/
diplomatic-manager.yaml
product-launcher.yaml
staff-engineer.yaml
evals/
rollout-update.json
inputs/
rollout-update.md
outputs/
rollout-update.diplomatic-manager.md
rollout-update.product-launcher-chill-rock-star.md
rollout-update.staff-engineer.md
README.md
vibes/
chill-rock-star.yaml
corporate-friendly.yaml
install.sh
LICENSE
NOTICE
packages/
claude-code/
.claude-plugin/
plugin.json
assets/
voice-layer.svg
skills/
calibrate-my-voice/
agents/
openai.yaml
assets/
voice-profile.template.md
evals/
evals.json
references/
profile-contract.md
source-adapters.md
source-menu.md
scripts/
collect_git_samples.py
SKILL.md
write-in-my-voice/
agents/
openai.yaml
assets/
voice-profile.template.md
evals/
evals.json
references/
ai-tells.md
channel-conventions.md
profile-contract.md
SKILL.md
codex/
.codex-plugin/
plugin.json
assets/
voice-layer.svg
skills/
calibrate-my-voice/
agents/
openai.yaml
assets/
voice-profile.template.md
evals/
evals.json
references/
profile-contract.md
source-adapters.md
source-menu.md
scripts/
collect_git_samples.py
SKILL.md
write-in-my-voice/
agents/
openai.yaml
assets/
voice-profile.template.md
evals/
evals.json
references/
ai-tells.md
channel-conventions.md
profile-contract.md
SKILL.md
packaging/
homebrew/
README.md
voice-layer.public.rb
voice-layer.rb
PRIVACY.md
pyproject.toml
README.md
scripts/
check_no_silent_telemetry.py
evaluate_behavior.py
evaluate_examples.py
install.py
sync_core.py
validate_profile.py
validate_release_archive.py
validate_repo.py
SECURITY.md
tests/
fixtures/
behavior/
claude-code-rc0-real.json
claude-code-valid.json
codex-direct-install-real.json
codex-manual-real.json
codex-rc0-real.json
README.md
profiles/
invalid-profile-missing-section.md
invalid-profile-raw-sample-risk.md
valid-profile.md
test_repo.py
VOICE_PROFILE_SPEC.md
voice-layer© 2026 Flowy · Free and open source
Built for Claude Code · Not affiliated with Anthropic