Promptly is a Chromium (Manifest V3) extension that reviews your prompt as you type on 23 AI sites — ChatGPT, Claude, Gemini, Perplexity, Copilot and more. Ten local checks score it in real time, a floating badge shows where it stands, and one click offers a diffed rewrite you can accept or dismiss. It never edits your prompt on its own — and prompt text never leaves the machine unless you explicitly ask for a cloud rewrite.
Better prompts get better answers — but nobody wants to paste their prompt into a second tool to find out. Promptly puts the feedback loop where you already type: a live score as you write, the reasons behind it, and a one-click, diffed rewrite you accept or dismiss. Analysis runs locally in the page — no server, no telemetry — so your prompt never leaves the machine unless you ask.
Type “make website” and the badge scores it 40 — Weak. Open the breakdown to see why: too short, vague verb, no constraints. Hit Improve and a rewrite appears as a word-level diff — role, constraints, output format and success criteria scaffolded in, with bracketed placeholders for what only you know. Accept, and it lands back in the editor, rescored.
From a keystroke in someone else's web app to an accepted rewrite — everything happens inside the page, in real time.
Hand-tuned adapters pin the exact prompt editor on ChatGPT, Claude, Gemini, Perplexity and Copilot — #prompt-textarea, ProseMirror contenteditables and friends. On the other allowlisted sites, a heuristic scores every visible input by size, position, send-button proximity and placeholder wording — and engages only when confident. A MutationObserver keeps up when SPAs re-render the composer.
Keystrokes are debounced at 200ms; pasted prompts analyze immediately. A requestAnimationFrame loop re-anchors the badge as the composer moves, and a 600ms poll catches sites that rewrite or clear the editor programmatically — with no input event at all.
Ten pure-TypeScript checks run in-page — clarity, context, ambiguity, objective, constraints, output format, success criteria, role, tool readiness and structure. Zero runtime dependencies, synchronous, task-type aware: a coding prompt is judged on different constraints than a research one.
Findings deduct from seven components — info −5, warn −15, high −30 — and a weighted mean makes the overall score: clarity and objective weigh 20 each, context and constraints 15, the rest 10. Under four meaningful words? Hard-capped at 40.
A pill toolbar floats above the composer's corner: the P mark, improve, library and a band-coloured score chip — ≥80 green “Strong”, 50–79 amber “Okay”, <50 red “Weak”. Click it for the full breakdown with per-component bars.
A deterministic local rewriter answers instantly — eight topic profiles scaffold role, constraints, output format and success criteria, with bracketed placeholders for what it can't know. If a provider is enabled, an AI rewrite follows: your Anthropic or OpenAI key, or a fully local Ollama model. Changes render as a word-level ins/del diff.
Accept writes the rewrite back framework-aware — the native value setter plus an input event for React textareas, insertText for ProseMirror and Lexical — and falls back to the clipboard if the editor refuses. An improveEpoch counter guarantees a late-arriving AI response can never resurrect a diff you already dismissed.
Everything between typing a prompt and sending a better one — without leaving the site you're on.
A floating pill scores the prompt as you type and tracks the composer as the page moves — with zero layout shift on the host site.
Seven component bars — clarity, context, constraints, format, objective, ambiguity, AI readiness — plus a plain-language suggestion for every finding.
Instant local rewrite, upgraded by AI when a provider is on. Review the word-level diff, then accept, copy or dismiss — it never edits without you.
Tell it what you want — “make it shorter”, “add acceptance tests” — and the rewrite is steered by your note on top of the analysis.
Save prompts you like and apply them anywhere the extension runs. Device-local by default; sign in and the library syncs through Supabase row-level security.
Provider chain: Anthropic key → OpenAI key → local Ollama → the built-in rewriter. Remote calls need both an explicit opt-in toggle and a key.
From ChatGPT, Claude and Gemini to Poe, DeepSeek, Mistral, NotebookLM, bolt.new, v0, Replit, Cursor and Devin — plus a heuristic fallback for editors it hasn't met.
Ctrl+Shift+P toggles the card. The panel is draggable, clamps to the viewport, and follows the site's light or dark theme live.
Typing is debounced 200ms to stay out of your way; a pasted prompt is scored instantly — the moment you're most likely to want a verdict.
No analytics, no server, no telemetry. The only network call is the opt-in cloud rewrite — on your key, on your click.
The analyzer is pure synchronous TypeScript — no models, no network, no libraries. Each check is a pure function over the prompt text, and each finding carries its own fix. A task-type classifier (coding, research, analysis, writing, general) decides which expectations apply.
Flags prompts under four meaningful words, and vague verbs — make, fix, improve — that carry no measurable request.
Catches “summarize this” and “fix it” — deictic references with no antecedent the model could possibly resolve.
Vague quantifiers — some, a few, stuff — and unresolved either/or choices that leave the model guessing.
No actionable verb and not a question? The model has no task. This is a high-severity finding — −30 to its component.
Task-aware: a coding prompt should name a language or framework; writing wants length, tone or audience; research wants timeframe and sources.
You're asking for an artifact but haven't said what shape — bullets, table, JSON, code block, word count.
Substantial tasks with no measurable bar for “done” get a nudge toward acceptance criteria.
Suggests a persona matched to the detected task type — “act as a senior engineer” — when none is set.
“Latest” and “news” suggest enabling web search; a mentioned attachment prompts a check that it's actually attached.
Sequential connectives — then, after that, finally — without numbered steps earn a structure suggestion.
Running inside two dozen other teams' web apps — without breaking them, lagging them, or leaking from them — is the actual engineering problem.
<promptly-root> Shadow DOM with inlined styles — site CSS can't bleed in, Promptly's can't leak out, and the host page's layout never shifts.storage and activeTab permissions only, with optional host permissions for the two AI APIs and localhost. Sites it shouldn't touch are excluded structurally — they're simply not in the manifest's matches.compromise NLP library is dynamically imported only on the first Improve click, never while you type.improveEpoch counter is bumped on every accept, dismiss and re-improve, so a slow AI response that lands after you've moved on is silently dropped instead of overwriting your editor.input event; ProseMirror and Lexical get select-all + insertText; success is judged by whitespace-normalized comparison, with a clipboard fallback.claude-sonnet-5 at temperature 0.2 with a 15-second timeout — instructed to rewrite the prompt, never answer it, and preserve the user's intent, facts and language.