A flag row, a decision, a real gate
A flag per finding, a decision that carries who decided and when, and a document that cannot reach approved while a flag on its current version is open.
Works todayAvailable now
In build
The whole team
Nineteen specialists, each with a defined job and an honest status label.
See all nineteen“Do not invent numbers” in a prompt is a request a model can miss under the right pressure. Lekha scans every draft after it is written for a price, statistic, rating or claim that traces to nothing you supplied, and holds it for review — visible, not blocked — rather than publishing quietly. A document cannot reach approved while a flag on its current version is open, and editing an approved document takes it back out of approved.
Why this exists
Almost every AI copywriting tool tells its model, somewhere in the system prompt, not to invent specifics — a price, a statistic, a certification, a customer count. That instruction works most of the time, which is exactly the problem: "most of the time" is not a property you can point at when a shop's ₹499 offer goes out reading ₹399 because the model rounded down under a length constraint and nobody caught it before it published. A request inside a prompt has no way to prove it was followed. It just produces text, and the text either happens to be right or it does not.
Lekha's guard is not a request. It is a function that runs on the output after generation, independent of whatever the model was told: every specific number, price, rating, count, founding year or warranty duration in a draft is checked against the brief, any pasted source material, and the workspace's own recorded facts, and anything that appears in none of them is held for review. The same applies to regulated language — a health, financial or legal claim is held even when the person writing the brief typed the exact words themselves, because "I wrote it" and "it is safe to publish" are not the same claim. The check is never a gate that swallows the draft: the text always comes back, held for a human to look at rather than withheld until it happens to pass. And because a hold that survives one edit but not the next is not really a guard, every rewrite, every new version, and even a restore of an old one runs through the identical check — which is also why an approved document drops back out of approved the moment new content lands on it.
What it refuses to do
Every draft is scanned for prices, percentages, ratings, customer counts, founding years and warranty durations, and anything that appears in nothing you supplied — the brief, pasted source material, or your workspace's own recorded facts — is held for review rather than published quietly. The check never withholds the text itself; withholding it would just push you to regenerate until the guard happened to stay quiet, which selects for copy that evades the check rather than copy that is true.
Health, financial and legal language is held for a human even when you typed the words into the brief yourself — a claim you wrote does not become safe to publish because you wrote it. There is deliberately no rewrite action that means 'make this pass review'; every rewrite re-runs the same guard over its own output.
Every write path — a new version, a rewrite, a restore — runs through the same function, and a document that was approved drops back out of approved the moment new content lands, because an approval is of specific words, not of the document forever. There is no override parameter and no role that skips a flag decision.
Lekha hands back text. There is no send route and no published status inside this module — Socie, Patri and Wavy each carry their own approval gate and consent machinery, and a shortcut from here into any of them would route around all three.
There is no Lekha-owned brand-voice table. It reads the one profile your workspace already set for Socie, because a shop's tone forking depending on which agent it was last edited from is a worse failure than the coupling.
How it works
Three steps. The first is the one that determines whether your own true price ever gets flagged by mistake.
Add your real prices, materials, certifications or hours as facts. This is the single highest-leverage step: the guard holds any specific your sources do not contain, so a shop with a real price list that never records it gets its own true price flagged every time it writes.
Give a brief, pick a format and a language, and get back copy in your brand voice — with the guard's verdict attached to the same response, not a separate step you have to remember to run.
Turn a draft into a document to get version history, a diff on every change, and the approval workflow — or paste your own copy into the checker with no model configured at all.
The claim guard
A prompt that says 'do not invent numbers' is a request a model can ignore under the right pressure. Lekha's guard runs on the output instead: every draft is scanned for a specific number, price, rating or proper noun that traces to nothing you supplied, and for language that reads as a health, financial or legal claim regardless of who typed it. Neither check is a request — both are code that runs on text that already exists.
Version history
Shorten a piece of copy and the guard catches what got added. It does not catch what got quietly removed — a price a shorter draft dropped is not a false claim, it is a true one gone missing, and a customer working from the shortened version never sees it. A word-level diff reports every dropped specific alongside every version, and a restore writes a new version rather than rewinding, so the history between never disappears.
Review that means something
A flag is a finding — an unsupported specific, a regulated claim — and a decision on it carries who decided and when. Approval is refused outright while any flag on the current version is still open, and the refusal names how many and why, rather than a greyed-out button with no explanation. Needs no model: the detection is the same offline pattern-match guard Patri already enforces a hold with.
What it does
Each card carries its own limit, and the label is derived from the backend's capability module rather than written here.
A flag per finding, a decision that carries who decided and when, and a document that cannot reach approved while a flag on its current version is open.
Works todayEvery version is kept, never overwritten. A word-level diff names what a later version dropped, and a restore writes a new version rather than rewinding.
Works todayReuses the one brand voice your workspace already set for Socie — tone, audience and an avoid list — rather than keeping a second copy that could drift.
Works todayThe workspace's avoid list, per-format length limits, and its own forbidden-term and required-phrase guideline rules are all pattern-matched in the output — no model, no credential. Only the tone/style half ('always write in second person' is not a regex) can't be pattern-matched, and is skipped and named as skipped rather than silently passed until an LLM key is configured.
Needs a keyThe three states work, with approval gated on flag decisions. Inline comments anchored to a position, and per-role permissions (viewer, editor, approver, admin) a workspace can opt into, now sit beside it — no roles configured means no restriction, the right default for a one-person workspace. A comment or status change notifies everyone with a role, with no credential.
Works todayWhatsApp message, social caption, product description, email, SMS, ad headline and website section, each with a real limit now measured, not just described in the prompt. Needs an LLM key; the fact store does not.
Needs a keyHinglish, English, Hindi, Marathi, Gujarati, Tamil, Telugu, Kannada, Bengali, Punjabi and Malayalam — named individually, because a model told only 'Hindi' produces transliteration nobody speaks.
Needs a keyHolds numbers, prices and proper nouns fixed while the rest reads as a native speaker would write it. The avoid list is skipped here — a Hindi draft cannot be honestly checked against terms you wrote in English.
Needs a keyThe guard re-checks that the rewrite introduced no fact the original lacked, and a word-level diff reports any price, number or proper noun the rewrite dropped.
Needs a keyShorten, expand, simplify, fix grammar, more formal, more casual — each returns what it dropped. There is deliberately no action that means 'make this pass review'.
Needs a keyCaptions guarded and length-checked the same way every other Lekha draft is, with hashtags returned alongside. An attached photo is passed to the model as text context only — there is no vision call, so a caption is not actually grounded in what the photo shows; that gap is real. Needs an LLM key.
Needs a keySingle-item and row-by-row bulk generation, each guarded against inventing a material, ingredient or spec the row did not supply — capped at fifty rows per batch, with one bad row marked failed while the rest of the batch still completes. Rows arrive as a JSON array, not a spreadsheet upload. Needs an LLM key.
Needs a keySubject, body and CTA drafted together, with subject-only regeneration available as its own short call so an A/B test can be refreshed without redrafting the body. Also checked for unverified promotional superlatives — 'guaranteed', 'the best' — on top of the usual guard. Needs an LLM key.
Needs a keyOutline, then one model call per section, then a meta description and FAQ — chained so a 1200-word article costs roughly what its length costs, and checked by the same guard plus a pattern that catches uncited 'studies show' statistics. Capturing the brief and hand-editing a draft need no credential; generation needs an LLM key.
Needs a keyReuses Khoji's own on-page checklist and keyword-placement scorer rather than rebuilding either — a URL is fetched through the same SSRF-guarded client Khoji's audits use, or pasted body copy is scored directly with no fetch. Every score carries when it was checked, so it never implies a live rank. No model, no vendor.
Works todayCTA presence, hook strength, specificity, length-for-format and filler-word count — genuinely deterministic, and every response says outright there is no real outcome data behind it, unlike a vendor score dressed up as machine learning. Scoring and ranking several drafts needs no credential; the boost rewrite targeting the weakest factors needs an LLM key.
Needs a keyA persona is created once, with a 'reviewed' gate before it's treated as ready to use broadly, and referenced by id afterward — deleting one retires rather than removes it, so a document generated against it keeps a resolvable reference. Persona CRUD needs no credential; blending a persona into a draft needs an LLM key, the same requirement drafting already carries.
Needs a keyA URL (through the same SSRF-guarded fetch Khoji's audits use) or pasted text is extracted once, then one guarded generation call per target format, all conditioned on that same source. Each output carries the source sentence it overlaps with most, so it's traceable back for a quick fact check. Audio and video sources are refused by name — paste a transcript instead. Needs an LLM key.
Needs a keyOne key message derived from the brief, then one generation call per asset type conditioned on that same message rather than each asset inventing its own summary — and a real consistency check compares every asset's own offer numbers against the brief's declared facts, flagging the ones that disagree. Creating a campaign needs no credential; generating assets needs an LLM key.
Needs a keyChecking against everything published on the web needs a web-scale index nobody builds in-house — this deployment routes the check to a licensed originality provider instead, with request storage and a fix for the false-positive problem of re-flagging standard legal boilerplate on every check. Needs an Originality.ai API key this deployment hasn't set; every check refuses with a clear 503 until then.
Needs a keyUses the same provider account as the originality check, since telling AI-generated text from human text needs a classifier trained for exactly that, not a language model guessing about its own kind. No accuracy percentage is ever stated in a response. Needs the same Originality.ai API key this deployment hasn't set; every check refuses with a clear 503 until then.
Needs a keyStill needed
Fourteen need an AI model configured. Two need a third-party detection API this deployment hasn't bought. Neither kind is hidden.
Every drafting, rewriting, translating or asset-generation route needs an LLM key — the fact store, the guard, the diff and the approval workflow do not. This deployment has not set LLM_API_KEY (or an LLM_API_KEYS rotation pool), so these routes are real code waiting on that one credential, not a feature that doesn't exist.
Both checks route to Originality.ai rather than being built in-house — a web-scale similarity index and a text classifier trained specifically to spot AI output are not something this product can approximate honestly. Both need ORIGINALITY_API_KEY, unset on this deployment, and both return a clear 503 naming it until one is configured.
Before you switch
Tell us what you write most and we will show you exactly what the guard catches — and what it leaves alone.
Questions
No — it will mark the gap or hold the draft instead. Every specific number, price, rating, count, year or duration in the output is checked against your brief, any pasted source material, and your recorded facts; anything that appears in none of them is held for review, and the draft is still returned to you, never withheld outright.
There is no action for that. Every rewrite re-runs the same guard over its own output, so a held phrase only clears the hold if it genuinely stopped being a claim — not because it was rephrased around the check.
No. Any new content — a rewrite, a new version, even a restore of an older version — takes the document back out of approved, because the approval was of specific words a person read, not a permanent state.
No, never. It hands back text. Posting it is Socie's, Patri's or Wavy's job, each with its own approval and consent gate — a shortcut from here into any of them would route around all three.
No — Lekha reads the one brand voice profile your workspace already set for Socie. There is no second profile to keep in sync, on purpose: a shop's tone forking depending on which agent it was last edited from would be worse than the coupling.
It is reported, not silently lost. A word-level diff on every rewrite names every price, number or proper noun the shortened version dropped, alongside what it added — the guard catches inventions, the diff catches omissions.