I built a local voice profile for Claude Code because I was spending more time editing its drafts than writing from scratch
I use Codex Desktop for most of my PR comments, Slack replies, and RFCs. The output is useful but it flattens into the same voice regardless of context -- same filler phrases, same structure, same tone whether it's a quick Slack reply or a design doc.
Prompting my way out of it doesn't stick across sessions. So I built voice-layer.
It gives Codex (and Claude Code) a local voice-profile.md that persists across sessions. You calibrate it from samples you approve, and then $write-in-my-voice rewrites any draft for the right channel.
PR comment, Slack reply, RFC, email - each gets a different shape from the same facts
Profile lives at
~/.config/voice-layer/voice-profile.md, plain Markdown, fully inspectableCalibration is consent-first: it asks before reading any private source
No server, no telemetry
Includes
AI_TELLS.md, a catalog of phrases that make AI writing sound fakebrew tap ymeiri/voice-layer brew install voice-layer voice-layer install --agent both
https://github.com/ymeiri/voice-layer
Curious whether others have hit this same problem, and whether the profile format makes sense or feels overcomplicated.