SuggestionsBeta

Add suggesting mode to any editor or custom component.

Inline edits from humans or agents, accepted or rejected like a diff.

Stop letting humans or agents change user content without a consent step.

Free tier. No credit card. First comment in 5 minutes.

CTcontract.md / Clause 4
live
BIUH1</>

The Provider shall deliver the project within 30 calendar days 14 business days of the signed order.

Open
SarahSarah· Legaljust now

Suggested edit30 calendar days 14 business days

a suggested edit anchored to the exact clause · accept to apply the redline

Build this

Suggesting mode running inside products at

Migrating from an in-house build or another SDK?Compare·Migration guide

What it is

Both actors propose. The owner decides.

Google Docs suggesting mode for your product. Humans or agents propose edits inline; the owner accepts or rejects each one like a diff. A suggestion is a comment of type suggestion, anchored to the exact content it proposes to change. With suggestion mode on, edits are never written to your data: the SDK captures the before and after value and stores a pending proposal. The accept and reject UI renders on the comment dialog, and on accept your code applies the change. The anchor model does not depend on the editor, so the same flow works inside supported editors and your own custom components.

Pricing table · Rate cellone cell · agent + human
Rate Checkeragentaccepted
Rate12.010.5

Vendor rate is 12% over the contracted cap

Analysthumanrejected
Rate12.011.4

reasonUse the agent's contracted figure

applied value · Rate

Owner accepted Rate Checker’s edit — 10.5 written by your code, never by Velt.

consent visible·one primitive, both actors

How it works

Three steps to suggesting mode.

Wrap your app, set up Velt Comments so the review UI has a home, then tag any target and turn on suggestion mode. Accept and reject render on the comment dialog; your handler applies accepted changes.

01Install
terminal
npm install @veltdev/react
02Wrap
_app.tsx
<VeltProvider
  apiKey={VELT_API_KEY}>
  <YourApp />
  <VeltComments />
</VeltProvider>
03Enable
your-file.tsx
// accept/reject render on the comment dialog
<div data-velt-suggestion-target="qty" />
const { enableSuggestionMode } = useEnableSuggestionMode();
With Velt

The mechanics

A suggestion is a comment of type suggestion, anchored to the exact content it proposes to change. With suggestion mode on, edits are not written to your data: the SDK snapshots the value when editing starts, diffs on commit, and stores the proposal as a pending suggestion. No-op edits create nothing. Accept and reject render on the comment dialog. Accept fires a frontend event with the old and new values and your handler applies the change; reject records an optional reason. The SDK never mutates your data, and because the anchor model does not depend on the editor, the same flow works inside supported editors and your own custom components.

// suggestionAccepted / suggestionRejected · your handler applies the change

Build it yourself

What an in-house version requires

  • edit interception per input type (text, select, checkbox, contenteditable)
  • before-and-after capture that reads intent, not keystrokes
  • a proposal model with pending, accepted, rejected, stale, and failed states
  • accept and reject UI in context
  • reject reasons
  • staleness and drift checks against live values
  • idempotent apply across tabs and reconnects
  • an event stream
  • queries for pending-change indicators

Teams that build it budget a quarter for one editor and start over for every other surface. The 3 steps above work on any element.

MCP: the faster path.

Skip the steps. Have your agent set it up.

npx -y @velt-js/mcp-installer

Launch suggesting mode this week.

No credit card. Works with React, Next.js, Vue, Angular, and HTML.

Get Free API Key

Capabilities

Changes that ask first.

Each card is the live SDK. Toggle to Code for the exact snippet that renders it.

01targets
Suggestion targetsany element
cellRate · $12.0data-velt-suggestion-target
inputQty · 12data-velt-suggestion-target
fieldDraftIn Reviewsuggesting
// targets
<div data-velt-suggestion-target="qty" />

Suggestion targets on any element

Tag an input, cell, or field with one attribute and edits become proposed changes. Suggesting mode for the rate column and the qty field, not just the doc body.

02diff
Suggested editField · Rate
Sarah2m
$12.0$10.5
// diff
// accept or reject on the comment dialog
{ from: "12.0", to: "10.5" }

Diff-style accept and reject

The SDK captures the before and after value; the reviewer accepts or rejects from the comment dialog, with a reason on reject. Clause-level consent, on the record.

03agents
Rate Checkernow

Vendor rate on row 14 is 12% above the contracted cap. Proposing a corrected value.

8.25%7.35%
1 Reply
// agents
commitSuggestion({
  target: "qty", value: 10.5,
});

Agent-proposed changes

An agent’s fix lands as a pending suggestion on the exact field, accept and reject attached. The suggestion is the consent step: the agent proposes, the agent never writes.

04intent
Intent capturesnapshot → diff
Edit startssnapshot 12.012.010.5
No-op editnothing created
// intent
// snapshot on start · diff on commit
// no-op edits create nothing

Intent capture, not keystrokes

The SDK snapshots the value when editing starts and diffs on commit; no-op edits create nothing. One reviewable proposal per edited field, not one per keystroke.

05apply
Apply logicyour code
eventsuggestionAccepted12.010.5your handlerapplyToBackend(newValue)your backendYour DB
consentVelt never mutates your data: your code writes the change
// apply
const accepted = useCommentEventCallback('suggestionAccepted');
applyToBackend(accepted?.commentAnnotation?.suggestion?.newValue);

Apply logic in your code

Accept fires an event with the old and new values; your handler writes the change to your state or backend. Velt never mutates your data, and neither does the agent.

06multi-control
One targetrow-3
Qty1210
Price$8.25$7.35
1 suggestionqty + price diff as one object
// multi-control
registerTarget("row-3", { getValue });

Multi-control targets

Register a getter and one target spans several controls: the qty and price inputs on a row diff as one object. Propose the line item, not two disconnected edits.

07stale
Safety checksat accept
Target removeddoes not applystale
Live value movedrecorded, best-effortdrift
// stale
// status: stale · does not apply
// driftDetected: true · best-effort

Stale and drift detection

If the target is gone at accept time, the suggestion goes stale and does not apply; if the live value moved since capture, a drift flag is recorded, best-effort, not blocking.

08queries
useSuggestions()status: pending
Review panel3 pending
Rate12.010.5pending
Qty1210pending
Tax8.25%8.875%accepted
// queries
useSuggestions({ status: "pending" });

Suggestion queries for custom UI

Query suggestions by target or status, reactively. A pending-change badge on the row, a count in the toolbar, a review panel that matches your design system.

Our agent proposes the fix and waits. Accept applies it through our code, reject logs the reason, and our users finally trust the AI because it asks first.

Product lead · AI-native SaaS

Little big details

The long tail, already built.

Shipped functionality only. The confirmed set leads; draft items render after engineering sign-off. This is the part of an in-house build that never ends.

One-attribute targets (data-velt-suggestion-target) with delegated listeners that track elements added to the DOM laterCommit semantics per input type: text-like inputs commit on blur; select, checkbox, and radio commit on changeNo-op guard: focus and blur without a change never create a suggestion; unchanged values are rejectedPer-user suggestion mode toggle, global and not persisted across reloadsReactive mode state: useSuggestionModeState and isSuggestionModeEnabled$Auto-commit hook (onTargetEditCommit) with custom summary and metadata per suggestionDeferred commit via the targetEditCommit event with a pre-bound commitSuggestion builderManual startSuggestion and commitSuggestion for non-DOM flows (canvas, custom widgets, an AI propose action)registerTarget and unregisterTarget with getters for complex multi-control valuesTyped Suggestion model stored as a CommentAnnotation with type suggestionStatuses: pending, accepted, rejected, stale, apply_failedReject reasons on the reject eventsuggestionAccepted and suggestionRejected events on the comment elementsuggestionCreated, suggestionStale, targetEditStart, and targetEditCommit on the SuggestionElementDrift detection flag when the live value moved since capture, with stale taking precedence over driftIdempotent-apply contract; handler errors surfaced as apply_failedReactive queries: getSuggestions (target and status filters), getPendingSuggestion, useSuggestions, usePendingSuggestionReact hooks for the full surface; other frameworks via the SuggestionElement singletonAccept-time confirmation prompt on driftComing soon

Make it yours

Your review surface, your rules.

The accept and reject UI on the comment dialog for the fast path, wireframes and primitives to restyle it, and configuration, events, and queries underneath.

Look

The accept and reject UI renders on the Velt comment dialog, so comment dialog wireframes and primitives restyle the review surface. Build your own indicators — pending badges, review panels, toolbar counts — on the suggestion queries.

Sarahsuggestion
30 days14 days
accept / rejectrestyle the surface
your UIpending badgereview panel

Behavior

Custom summary and metadata per suggestion, commit gating behind your own validation, custom apply logic on accept, reject reasons, and the full event stream.

Apply logicyour code
targetdata-velt-suggestion-target
on acceptapplyToBackend(value)
on rejectreason logged
eventssuggestionUpdated
consentVelt never writes: your handler commits
We restyled the comment dialog to match our design system and drove our own pending badges off the suggestion queries. The review surface looks like our product, not a widget.

Staff engineer · collaborative editor

In production

Suggesting mode, in products like yours.

Tabbed by vertical, with verified customer screenshots.

SummaryNext StepsDemoCustomer Stories

Hey Conductor!

This Digital Sales Room gives you everything you need to move forward — from proposal to plan.

Our Mutual Action Plan
Training2 / 5
Creating a new Room1
Build a working demo room
Contract sign-off
Maya2m

@Fin We need to make a working demo for Rene and his team

Brand proposes the copy edit on the live email and the owner accepts or rejects each one. The redline happens in the asset, not in a forwarded Word doc.For sales enablement

See it running in products like yours.

30 minutes, with an engineer, not a sales deck.

Book Demo
SOC 2 Type IIHIPAAEU data residencySelf-host data

Suggestions persist as comment annotations, so suggestion content can live on your infrastructure via the comments self-host data provider, with only minimal identifiers on Velt. Accept and reject decisions are recorded for the audit trail, and the same isolation guarantees cover the rest of the SDK. See self-hosting and governance.

Book Demo

Proof

Changes that asked first.

Nothing changed without a name attached.

0 silent edits

Every change to a customer record is now a proposal someone accepts. Nothing moves without a name attached, and our auditors stopped asking how.
Compliance lead, fintech platform

1 afternoon

We added suggesting mode to our custom invoice grid in an afternoon. The diff capture and the accept-reject UI were already built.
Staff Engineer, billing platform

0 write access

We shipped agent fixes without ever granting the agent write access. It proposes on the exact field, a human accepts, and our users keep the AI on because it asks first.
Product lead, AI-native SaaS

FAQ

Questions about suggesting mode.

Anything that renders on the web. Suggestion targets are DOM elements, so inputs, selects, table cells, contenteditable surfaces, and your own custom components work through the same attribute and anchor API; editor libraries connect through their setups.

Install @veltdev/react, set up Velt Comments (the accept and reject buttons render on the comment dialog), tag elements with data-velt-suggestion-target, and call enableSuggestionMode. Handle the suggestionAccepted event to apply accepted values to your state or backend.

Yes. An agent's proposed value is committed as a pending suggestion on the exact target, and a human accepts or rejects it before anything is applied. The agent never holds write access to your data.

Velt records the outcome and fires suggestionAccepted with the old and new values; your handler applies the change to your state or backend. The SDK never mutates your data. Rejections fire suggestionRejected with an optional reason, and nothing is applied.

If the target no longer resolves at accept time, the suggestion goes stale instead of applying. If the live value moved since the proposal was captured, a drift flag is recorded (best-effort, requires a registered getter); in v1, the accept still applies, with a confirmation prompt planned. A stale target never applies.

Yes. A suggestion is stored as a comment annotation of type suggestion, and the accept and reject UI renders on the comment dialog, so Comments must be set up first. See /comments.

Yes. Restyle the comment dialog with wireframes and primitives, and query suggestions by target or status to drive your own badges, counts, and review panels.

Velt is priced on usage, not seats: you pay for documents with review activity in a month, and there is a free tier for development and early production. Suggestions is part of the SDK, not a separately priced add-on.

Add suggesting mode to any editor or custom component.

Free tier. No credit card. First comment in 5 minutes.

30 minutes, with an engineer, not a sales deck.