@ashish-tradex/wryt
v0.28.1
Published
Creative-copy + long-form CLI grounded in your best examples. Short-form: a spread of candidates judged through the recipient's eyes. Long-form: full blog posts in a matched writer's style and from-scratch CVs, both held to a reference standard. Opt-in we
Maintainers
Readme
wryt
A tiny CLI for short-form creative copy — dating openers, taglines, titles, hooks, blog intros — grounded in your library of best examples. It writes something new at or above the level of those examples, never a reworded copy of them, and gets better as you tell it which outputs land.
your task ─▶ writer ─▶ recipient judge ─▶ deliverable
(5 candidates, (ranks them as the person
keeps the who has to reply / click /
fresh ones) keep reading — ships the best)
primary model → failover · 2 model callsTwo calls, no planning crew, no refinement loops. The quality pressure comes from your examples and a recipient's-eye judge — not from telling a model to "be creative."
Install
npm i -g @ashish-tradex/wrytSetup
wryt login <your-gateway-key>If you already use the sibling nexel-cli, wryt reuses that key automatically — no setup.
Use
wryt # interactive chat — just type, keep talking
wryt "give me a tinder opener"
wryt "a tagline for my note-taking app"
wryt "a blog intro about remote work"
# paste real material and it gets far sharper — this is the biggest lever:
wryt "opener for this profile: golden retriever named Biscuit, hikes, bio says 'fluent in sarcasm'"Long-form
wryt "write a blog post about X" # full post in a matched writer's style, held to a reference standard
wryt cv # from-scratch CV via a short interview — grounded, never fabricatesBlog and CV modes ship their own reference library (writer-style profiles + CV conventions), installed into ~/.wryt/library/ on first run — edit any card to change the bar, they're never overwritten.
Fresh (opt-in web search)
Time-bound topics ("latest", "2026", "trends") pull live web context before writing so the copy isn't stale — automatic for blogs and for short-form asks naming a concrete thing (a product, a company). Force it with --fresh, or off with --no-search. Search grounds facts only; your voice and library still set the bar.
How it works
- Writer (Verbalized Sampling). Instead of one answer, the writer returns 5 candidates with its own probability for each, and wryt keeps the low-probability tail — the fresh, non-default lines. (Asking for the distribution is a known fix for the "every answer sounds the same" problem.)
- Recipient judge. A different model role-plays the actual reader — the person deciding in two seconds whether to reply, click, or keep reading — ranks the candidates the way they'd really react, and checks whether the best one beats your proven examples.
- Copy gate. A free local check ships the top-ranked candidate that doesn't reuse or overlap a library line.
Teach it — the flywheel
Your judgments become the system's taste. Each writes a plain, editable card the next matching task reads automatically:
wryt like # this is the level to hit → my-winners.md
wryt worked # this got a real result → my-worked.md (strongest bar)
wryt nah "reason" # avoid this pattern → my-rejects.mdRate ruthlessly — the system faithfully learns whatever you actually reward.
The library (all plain markdown, matched by keyword)
Drop cards into ~/.wryt/library/ (or ./.wryt/library/, or your existing ~/.nexel/knowledge/). Each has frontmatter with match: keywords; nothing loads unless it earns its place. Card kinds:
| name pattern | what it holds | who reads it |
|---|---|---|
| *-sourced | your best example lines | writer (as the bar) + copy gate |
| *-problems | known failure modes | the judge |
| *-audience-voice | how the recipient reacts — what earns a reply/click, what's burned out | the judge (as its persona) |
| my-winners / my-worked / my-rejects | grown by like/worked/nah | judge + writer |
---
name: dating-openers-sourced
description: openers that actually get replies
match: tinder, hinge, first message, opener
---
## High-response openers
- What's something you're irrationally competitive about?wryt lib # list your cards + their match keywords
wryt lib add my-examples # scaffold a new cardAll taste lives in these cards, not in code — to change what wryt considers good or bad, you edit markdown, not TypeScript. That's also how you extend it: add a *-sourced card for a new content type, or an *-audience-voice card (yours, or mined from what real readers say online) to sharpen the judge.
One honest limit
A context-free ask ("give me a tinder opener", no profile) caps at excellent-generic — even a perfect line can't reference specifics it doesn't have. Paste the real material and the ceiling disappears. wryt marks the one detail it can't know with a single [slot] rather than inventing it.
