ύφος — Greek for the style and tone of one's expression.
Rewrite any AI draft so it reads as written by you. hyphos builds register-aware voice profiles from your own writing — chat transcripts, exports, posts — preserves your quirk-level habits with enforcement rules a model can't drift away from, and scores every output for how much it actually sounds like you.
This is the Node/TypeScript implementation, distributed on npm and runnable with
npx. The tool began life as a Python pipeline and was ported to TypeScript
with stage-by-stage output verification at cutover; the porting harness was
removed once the port was proven.
Status: working end to end, with named rough edges. The corpus pipeline —
extraction, curation, register tagging, chat/email ingest, stylometric
fingerprints — and the output side both run today: rewrite (a model pass
over your own claude CLI or Anthropic API credentials, then the deterministic
enforcement pass), score (the model-free fidelity v1, plus the model-judged
half via score --judge), blind self-tests, and the local web app
(serve). Still open: score calibration, fingerprint refinements (sentence
splitting, email quote-fragment cleanup, per-register typo rate), and the
--typos natural rewrite mode — see the roadmap.
- Voice profiles, per register — you don't have one voice; you have modes (technical, informal, editorial). hyphos profiles each: a stylometric fingerprint (sentence lengths, punctuation habits, openers, rhythm) plus a distilled style guide with your quirks and anti-patterns.
- Rewrite — feed it any AI-generated draft and a target register; it rewrites the draft in your voice.
- Hard quirk enforcement — mechanical habits (punctuation policy, banned words, casing) are applied after the model as deterministic rules, because models normalize personal quirks away and drift from style instructions as context grows.
- A fidelity score — every output gets a "how-much-like-you" number (stylometric match plus a judge rubric), calibrated by blind self-tests.
npx hyphos extract # extract your own messages from local transcripts
npx hyphos fingerprint # compute stylometric fingerprints per register
npx hyphos rules --test # self-test the deterministic enforcement rulesCorpus output lands in corpus/ and profiles in profiles/ under the
package root (resolved from the CLI's own location, so commands work from any
directory); point HYPHOS_HOME at another location to relocate both, or
HYPHOS_CORPUS / HYPHOS_PROFILES to override one. Stdout
prints aggregate numbers only — never your text — so it is safe to share.
Writing in another language (including Greeklish — Greek written in Latin characters) contributes rhythm, register and punctuation habits, tagged as such. It is never mined for word choice and never transliterated.
Your corpus and profiles never leave your machine: corpus/ and profiles/ are
gitignored, nothing is transmitted anywhere, and model calls (for the rewrite
stage) use your own credentials.
npm install
npm test # unit tests
npm run build # bundle to dist/ (the published CLI)Roadmap: ROADMAP.md · Decisions: DECISIONS.md
