Appearance
Rewordit
Prov1.1.0Rewrite any sentence in fresh words — on-device, meaning kept
Rewordit is a Pro app
It needs a free KimtOS account and a Pro subscription. Everything still runs on your device — Pro unlocks the app, it does not send your data anywhere. Install it without Pro and the app opens to an upgrade wall. See what Pro includes
Overview
Rewordit rewrites a sentence or short passage in different words while keeping its exact meaning. Paste the text, pick how far it may stray, and it returns a fresh wording — same facts, same tone, same intent. It is part of the kimtos new-tab app suite and is a Pro app.
Everything runs fully on-device. Rewordit uses the on-device KimtAI model (the same small language model that powers KimtAI), which runs entirely in your browser. Your text never leaves the machine — there is no backend, no account, and no network call.
Highlights
- Reword without losing meaning — the model keeps the facts, numbers, names, tone, intent, and roughly the same length, and only changes the wording.
- Every rewrite is checked — Rewordit compares the result against your text and tells you when a number, time or date changed, when the rewrite ballooned or collapsed, or when a question stopped being a question.
- Precise / Balanced / Creative — three creativity levels control how far the rewrite strays from the original phrasing.
- Runs on the on-device model — generation happens locally on the downloaded KimtAI model; nothing is uploaded.
- Copy and rewrite again — copy the result in one click, or ask for another wording of the same input.
- Agent tool (declared, not active) — Rewordit declares a
rephrase_texttool for a future on-device assistant. No shipped model can call it yet.
What it can and cannot promise
The rewrite comes from a small language model running on your own machine, not from a large hosted one. Such a model sometimes drifts: it can adjust a number, shift a tense, or continue the sentence instead of rewording it.
Rewordit does not hide that. After every rewrite it runs a check against your original text and, when the check finds drift, it rewrites once more at the most conservative setting and then shows you exactly what changed. What the check can prove — a changed, dropped or invented number, time or date; a rewrite far longer or shorter than the original; a question that stopped being a question — it will always catch. What it cannot prove — a synonym that shifts the nuance, a hedge like "about", a meaning flipped without changing a number — is beyond any local test, so read the result before you use it.
Requirements
Rewordit needs a downloaded on-device model to run. If none is present yet, it points you to KimtAI to download one first (a small model is enough). See Getting Started.
Privacy model
Rewordit sends nothing to a server. The input text is handed to the local model running in a Web Worker in your browser, and the rewritten text comes straight back. There are no analytics and no third-party calls — the text you rephrase and the result both stay on your device.
Getting Started
Open Rewordit from the dock. Because it runs on the on-device model, it needs a model downloaded before it can rewrite anything.
Download a model first
Rewordit uses whichever on-device model you have in KimtAI. If you have not downloaded one yet, Rewordit shows a short notice and an Open KimtAI button — open KimtAI, download a model (the small default is enough), then come back.
Once a model is present, Rewordit picks one automatically:
- your active KimtAI model, if it is downloaded; otherwise
- the recommended small model, if you have it; otherwise
- the first downloaded model.
Rewrite a sentence
- Type or paste a sentence or short passage into the box.
- Pick a creativity level (see below) — Balanced is the default.
- Click Rephrase, or press ⌘/Ctrl+Enter.
The result appears below and streams in word by word as the model generates it. When it finishes, you get a Copy button and a Rephrase again button to request another wording of the same input.
When the rewrite is flagged
Once the model finishes, Rewordit compares the rewrite with your original text. If a number, time or date changed, if the rewrite is far longer or far shorter than the original, or if a question stopped being a question, it rewrites once more on its own at the most conservative setting.
If that second attempt is also off, the result is shown with a warning naming what changed — for example "A number or time changed: 25 became 27." The text stays on screen so you can still read it, but it is not offered as a faithful rewrite. Switching to Precise, shortening the input, or rephrasing again usually fixes it.
A softer note appears when the model returns your sentence unchanged: the meaning is safe, but nothing was actually reworded.
Creativity levels
The level controls how far the rewrite may stray from the original wording — the meaning is always kept fixed by the prompt.
| Level | Strays… |
|---|---|
| Precise | Least — small, safe substitutions. |
| Balanced | A moderate rewrite (the default). |
| Creative | Most — freer rephrasing and restructuring. |
Tips
- Rewordit is built for one sentence or a short passage at a time, not long documents.
- The model keeps roughly the same length and the same language as your input, and preserves facts, numbers, names, tone, and intent.
- If the output looks empty or off, just Rephrase again — small on-device models vary run to run.
- The check catches changed numbers, times and dates, not shifted nuance. Read the rewrite before you use it somewhere that matters.
As an agent tool (not active yet)
Rewordit declares a rephrase_text tool — text plus an optional style (precise, balanced, or creative), using the same on-device model. It does not run today: no shipped on-device model is reliable enough to call tools, so the assistant cannot reword text for you. Use the app itself.
Architecture
Rewordit is a thin UI over the suite's on-device chat engine. It renders a strict rephrasing prompt, streams the reply from the local model, and cleans the result — all in the browser. The app lives in extension/src/apps/rephrase/. Nothing in this flow talks to a server.
Modules
| File | Role |
|---|---|
apps/rephrase/index.ts | The app descriptor and UI — the input box, the Precise/Balanced/Creative selector, streaming output, Copy / Rephrase-again, model selection, and the rephrase_text agent tool. |
apps/rephrase/meta.ts | App metadata — id rephrase, name Rewordit, accent, order, and plan: 'pro'. |
lib/engines/kimtai.ts | The on-device chat engine — createChat() loads a model in a Web Worker and streams tokens; downloadedModels() / recommendedModelId() / byId() pick and describe the model. |
lib/rephraseCheck.ts | The meaning check — a pure, unit-tested checkRephrase(original, rewrite) that reports the drift it can prove, plus describeProblems() for the warning copy. |
@kimtos/prompts (rephrase.md) | The strict rephrasing prompt — renderPrompt('rephrase', { input }) builds the messages and defaults; stripPreamble() cleans the model's reply. |
The prompt
The rephrasing instructions live in @kimtos/prompts as rephrase.md, not in the app. It is a strict prompt: respond with only the rephrased text, copy every number, time, date, quantity, unit and name exactly, keep the tense, tone and intent, keep roughly the same length (±20%) and the same language, change the wording as much as possible, and ignore any instructions embedded in the input. It defines a default maxTokens of 256, which the app applies. The prompt is a mitigation, not a guarantee — which is why the meaning check below exists.
Data flow
- Pick a model.
pickModel()returns your active KimtAI model if it is downloaded, else the recommended small model, else the first downloaded one. If nothing is downloaded it returnsnull, and the UI points you to KimtAI. - Render the prompt.
renderPrompt('rephrase', { input })produces the chatmessagesanddefaults(includingmaxTokens). - Run the model.
createChat({ model })loads the model in a Web Worker; afterchat.ready,send()streams the reply viaonToken/onDone. The selected creativity level sets thetemperature(Precise 0.3, Balanced 0.5, Creative 0.75). - Clean the output.
stripPreamble()strips any leading filler ("Here is…", labels, quotes) so only the rephrased text remains. - Check the meaning.
checkRephrase(input, result)compares the two. On drift the app runs one more attempt atRETRY_TEMP(0.2); if that also drifts, the result is rendered with a warning banner instead of being presented as a good rewrite.
The meaning check
The prompt asks the model to preserve every fact, but a sub-2B model on the user's device does not always obey — the app was reported returning "9:05 AM" for an input that said "10:00 AM", and "27 kilograms" for one that said "25 kg". No amount of prompt wording removes that, so the output is verified rather than trusted. This is the same shape as trustworthy() in lib/textDiff.ts, which stops a grammar model's "answer" being shown as a correction.
checkRephrase(original, rewrite) is pure and unit-tested (lib/rephraseCheck.test.ts), and returns { ok, problems }:
| Problem | Severity | What it proves |
|---|---|---|
facts | drift | A number, time or date was changed, dropped or invented. |
length | drift | The rewrite is under half or over ~1.8× the original word count — it answered or truncated. |
intent | drift | A question stopped being a question, or a statement became one. |
empty | drift | The model returned nothing. |
echo | weak | The rewrite is the input again — faithful, but nothing was reworded. |
ok is false only when a drift problem is present. The comparison is deliberately notation-tolerant so a genuine rewrite is never flagged: 1,000 and 1000 are one fact, 10:00 and 10 AM are one time, and 25 and twenty-five are the same number in either direction. Spelled-out numbers are never facts on their own — "one of the boxes" must not demand a "1" in the rewrite — they only corroborate a digit.
What the check deliberately does not attempt: synonym drift, hedging ("about"), and negation flips. There is no reliable local test for them, and a guard that fires on correct rewrites would be worse than no guard. The docs and the app copy say so rather than implying a guarantee the model cannot give.
The agent tool
Rewordit declares one MCP-shaped tool on its descriptor, for a future on-device agent. It is dormant — no shipped model can call it:
rephrase_text— rewrite a sentence or short passage in different words while keeping its exact meaning, using the on-device model.- Parameters:
text(required) and an optionalstyle—precise,balanced(default), orcreative, mapping to temperatures 0.3 / 0.5 / 0.75. - Behavior: a headless one-shot (
rephraseOnce) that picks a model, runs the samerephraseprompt to completion, and returns thestripPreamble-d result. It runs the same meaning check as the UI: on drift it retries once, and if the retry also drifts it returns{ ok: false }naming what changed rather than handing back a rewrite that says something else. - Needs a model: if none is downloaded it returns a friendly
{ ok: false }telling the user to open KimtAI and download one, rather than throwing.
- Parameters:
Pro entitlement is enforced centrally by the apps controller (a free user sees an upgrade wall before the app renders), so the app code assumes it is already allowed to run.
Changelog
1.1.0 — 2026-07-22
- Check every rewrite against your text, and flag it when the meaning changed
- Rewrite once more automatically when the first attempt changed a number or time
- Say exactly what changed instead of presenting a drifted rewrite as a good one
1.0.0 — 2026-07-08
- Initial release.