Local-first writing voice memory for AI agents.
Write Like Me learns from the prompts, documents, and speech transcripts you choose to capture. It builds a portable voice profile that Codex, Claude Code, OpenCode, Cursor, and other agents can use when you ask them to write in your style.
- Writing data stays local: prompts, excerpts, and profiles are never sent as telemetry
- Explicit opt-in before prompt capture starts
- Automatic secret and email redaction
- Automatic daily background updates from the GitHub
mainbranch - Anonymous PostHog product telemetry with strict event/property allowlists
- Native prompt hooks plus a portable agent skill
- Scenario substyles: agent commands, chat, email, and long-form docs are profiled separately (
wlm context --scenario email) - Statistical voice model with a personalization benchmark:
wlm scorerates any text 0-100 against your own held-out writing,wlm benchgrades candidate sets - Learning mode:
wlm coachsuggests small vocabulary, rhythm, and mechanics improvements grounded in your own samples - Inspect, pause, export, or delete the profile at any time
- Dependency-free runtime on Python 3.9+ (works with the stock macOS
python3)
Roadmap designs live in docs/plans/: small-LLM fine-tuning, benchmark tiers, and online sync with login.
curl -fsSL https://raw.githubusercontent.com/Bennyoooo/write-like-me/main/scripts/bootstrap.py \
| python3 - --agent autoThe bootstrap script clones the repository into an operating-system temporary directory, runs the installer, and removes the checkout. The runtime and copied adapters remain under ~/.write-like-me and the relevant agent config directories, so installation does not depend on where you ran the command.
Inspect bootstrap.py before piping it to Python if required by your security policy. The installer discloses local prompt storage, daily background updates, and anonymous PostHog telemetry before asking for consent. Use --yes only when you intentionally want a non-interactive install:
curl -fsSL https://raw.githubusercontent.com/Bennyoooo/write-like-me/main/scripts/bootstrap.py \
| python3 - --agent all --yesPin a tag or branch with --ref <name>. For example, append --ref v0.2.0 after python3 - once that release exists.
Disable either network feature during installation:
curl -fsSL https://raw.githubusercontent.com/Bennyoooo/write-like-me/main/scripts/bootstrap.py \
| python3 - --agent auto --no-telemetry --no-auto-updateThen write normally in an installed agent. Once the profile has useful evidence, ask:
Rewrite this so it sounds like me.
Draft this update in my voice.
Write a concise reply using my style.
| Agent | Capture integration | Voice integration | Install |
|---|---|---|---|
| Codex | UserPromptSubmit hook |
Native skill/plugin | --agent codex |
| Claude Code | UserPromptSubmit hook |
Native skill/plugin | --agent claude |
| OpenCode | chat.message plugin hook |
Native skill | --agent opencode |
| Cursor | beforeSubmitPrompt hook |
Native skill | --agent cursor |
| Other agents | Manual or external hook | Portable instructions | See Other agents |
The Codex CLI asks you to review and trust a new command hook. Run /hooks after installation and approve the Write Like Me hook. Other agents may show a similar trust prompt.
Pass the listed option to the Quick Start command. Run the installer again to upgrade the runtime and refresh adapters. Existing Cursor hooks are preserved.
Short coding prompts are weak evidence for prose. Import representative writing for better results:
~/.write-like-me/runtime/bin/wlm learn essay.txt emails.txt
~/.write-like-me/runtime/bin/wlm learn --channel spoken meeting-transcript.txtTranscripts teach spoken phrasing; Write Like Me does not record a microphone or transcribe audio. Only text passed to wlm or a configured prompt hook is captured.
The installer keeps the isolated runtime at ~/.write-like-me/runtime and creates a stable wlm command in a user-owned directory already on PATH. If no suitable directory exists, it uses ~/.local/bin and updates the active shell profile; open a new shell after installation in that fallback case.
wlm status # capture state, sample count, and data path
wlm profile # human-readable analysis
wlm profile --json # machine-readable metrics
wlm context # instructions and redacted excerpts for an agent
wlm capture "sample text" # add one sample manually
wlm learn file.txt # learn from a document
wlm pause # stop new capture
wlm resume # resume capture
wlm update # check and install an update now
wlm auto-update status # inspect automatic update state
wlm auto-update off # disable background updates
wlm telemetry status # inspect anonymous telemetry state
wlm telemetry off # disable PostHog telemetry
wlm export profile.json # export redacted samples and metrics
wlm restore profile.json # restore an exported profile
wlm forget --yes # delete every learned sampleSet WLM_HOME to move all state, or XDG_STATE_HOME to use an XDG state directory.
- A native hook receives the submitted user prompt and passes JSON to
wlm hook. - The capture pipeline ignores short, duplicate, and code-dominant samples, then redacts common credentials and emails.
- Samples are stored in a private SQLite database with bounded retention.
wlm contextmeasures sentence rhythm, paragraph density, punctuation, contractions, vocabulary, phrases, openers, and pronoun use.- The agent skill applies those tendencies and a few bounded redacted excerpts when the user requests voice-matched writing.
- Prompt hooks schedule a detached update check at most once every 24 hours.
- Allowed anonymous product events are queued locally and sent to PostHog by a detached batch worker.
Analysis is deterministic and runs locally. No model is used to build the profile. The final quality still depends on the installed agent and the quality of the samples.
See Architecture, Privacy, and Telemetry for the detailed design and complete event schema.
Agents that can run commands can use the project without a native adapter:
- Install the runtime with the Quick Start command or
pipx install .from a checkout. - Add WRITE_LIKE_ME.md to the agent's global instructions.
- Send each eligible user prompt to
wlm hook --agent <agent-name>on standard input when the agent exposes a prompt hook.
The hook command is silent, always exits successfully, and never blocks the agent loop.
git clone https://github.com/Bennyoooo/write-like-me.git
cd write-like-me
python3 -m venv .venv
. .venv/bin/activate
pip install -e '.[dev]'
pytest -q
python -m buildTo test plugins directly from a development checkout, run ./scripts/install.sh --local --agent <agent>. Normal installs register the GitHub marketplace and do not retain a checkout path.
Plugin manifests live under plugins/write-like-me; agent-specific adapters live under adapters. Contributions for additional agents should reuse wlm hook rather than implement a second profile store.
See CONTRIBUTING.md before opening a pull request.
MIT