The question line in the corner of this page is Nerv
Your visitors don’t go looking for a chat button — they type the question. Nerv answers from your help center, hands the conversation to your team the moment it’s unsure, and you set it all up from a settings screen, not your code
A line to type in, not a bubble to click
A chat bubble asks for a click, then shows a welcome screen, then wants another click before anyone types. The line takes the question first, and the chat opens on the answer
It shows what to ask
Your suggested questions take turns in the line and line up above it when a visitor clicks in. One click sends the question
It speaks first, in the line
A proactive message appears in the line itself, with a dot, instead of a pop-up over your page. A click opens the conversation
Replies wait in the line
When your team answers after the visitor has moved on, the start of the reply shows in the line with a count. One click and they’re back in the conversation
It stays out of the way. No logo on it and nothing flashing. It steps aside while a visitor types in one of your own forms, and on a phone it becomes a bar above the keyboard only when it’s tapped. Prefer the classic chat bubble? It’s one switch in the panel.
Watch it answer one
A customer asks. It reads your help center, shows the article it used, and answers only above the confidence threshold you set. Click any step
Email addresses, phone numbers, card numbers and IP addresses detected in content sent to AI models are removed before it is sent. Contact details that your workspace publishes for customers in its knowledge base are not removed. Grounding and policy checks run before the reply is sent.
Below its confidence threshold it hands the conversation to a human in Portal, with the sources it was working from.
It answers from the help center you give it. No articles, nothing to answer from. Each article carries its own switch for the customer-facing AI, so you choose what it’s allowed to use.
Below its confidence threshold, it does not answer. It hands the conversation to a person, with a card in the chat and their real name on it — so your customer is never quietly switched from bot to human.
Every element, named and accounted for
Most vendors show you a screenshot. Nothing on this diagram is a mock-up of something we plan to build
Admin panel means you change it yourself and visitors pick it up on their next page load. Built in means the widget just does it — there’s nothing to set.
Your invoice is 6 days old and refunds run for 14 days, so you’re still eligible. Start it from your order page.
Sources:Refunds and returnsAdmin panel means you change it yourself and visitors pick it up on their next page load. Built in means the widget just does it — there’s nothing to set.
Admin panel means you change it yourself and visitors pick it up on their next page load. Built in means the widget just does it — there’s nothing to set.
Nothing you just clicked needs a developer — it’s the panel, or it’s built in.
Set in the panel, not in your code
The launcher, the colour, where it sits and how the chat opens — the controls below are the same settings your admin panel has. Push on them
Change any of this in the panel — no deploy, no developer.
Your product, beautifully supported
The preview covers the look; the same panel screen also holds your logo, the questions the line suggests, the line’s placeholder, which pages it shows on, language, the pre-chat form and white-label — all in the panel, none of them a deploy.
Change it in the panel and visitors pick it up on a page load within the next few minutes — we hold onto your settings for five minutes so the widget starts fast. A chat that’s already open keeps the settings it started with until they reload
Pick any colour. We work out whether the text on it should be black or white so it stays readable, and lift it in dark mode if it’s too dark to see against the panel
One tag, and it's live
You need one line in your page. Everything above happens after that, from the panel
<script
type="module"
src="https://cdn.trusend.ai/widget.js"
data-app-id="YOUR_APP_ID">
</script>- Loads after your page — it never holds up what your visitors see
- Checks the site it's running on is one you allowed
- Loads your settings
- Starts an anonymous session for the visitor
That’s the whole install — no backend, no glue code. Add your domains to the allowlist and the widget only boots on them — an App ID copied off your page won’t load anywhere else.
Want the line inside your page instead of the corner? Put <nerv-ask></nerv-ask> where it should sit — under a pricing table, on a help page. The answer opens right there, and the corner line steps aside while the one in your page is in view.
- 01Create your workspace
Free plan, no card — the panel is yours in a minute
- 02Give it answers
Write help articles in the platform, or import the ones you already have
- 03Paste the tag
One line, on the pages you choose from the panel
- 04Go live
The AI answers from your content; everything else lands in your team's inbox
Catch the visitor who was about to leave
Someone stalls on your pricing page, drifts toward the close button, or comes back for a second look — Nerv can speak first at that moment, right in the question line. Three of the triggers you can build:
Greet first-time visitors
MessageNudge the pricing reader
BannerCatch leads after hours
Collect dataThe copy, the pages, the caps and the cooldowns are all yours, authored in the panel — no code, no deploy.
And it can’t become the annoying kind. Proactive chat got its bad name from tools that let you spam. Nerv’s anti-spam limits are built into the widget itself — however aggressively it’s configured, your visitors stay protected. One visit, drawn:
Ask who they are after they’ve asked
A form in front of the chat is where visitors turn around. Nerv takes the question first, then asks for a name and email in a card under it, so the question is never lost
- Switch it on in the panel — Name and Email are there by default, both required
- Add your own: a label, a type (text, email or phone), required or not
- Nothing gets through half-filled: required fields have to be answered, and we check the email and phone are the right shape
- Asked once per session, not on every page
Before we start — who are we speaking with?
Enter a valid email address
Your customer can always tell it's a bot
The AI disclosure is built in, on by default and locked — not a setting your team has to remember or can switch off
Article 50(1) of the EU AI Act requires that people are told when they are interacting with an AI system. The notice does that, and the handoff card shows when a person takes over.
- The AI disclosure is on by default and locked on — white-label can restyle the copy, never remove the marker
- While the AI has the conversation: its name, an “AI-powered assistant” label, and no green online dot. A bot is never dressed up as an available human
- On handoff, an explicit card with the agent's real name — the responder is never silently switched
- Conversations encrypted in transit (TLS)
- Crash reports are scrubbed in the visitor's own browser before they reach us — passwords, tokens, cookies and anything that looks like an email address are stripped first
- Your team's accounts can export their data or delete the account themselves, confirmed by an emailed link
- Nerv doesn't take payments — it isn't a cardholder data environment
- Agent drafts are scanned for card numbers, IBANs and national IDs; a flagged draft is never saved in their browser. We log that it happened — never what it said
We describe what’s built, not what’s certified — the full security posture is on the security page →
Start free. Paid plans meter what the AI closes on its own
The conversations your team answers are free and unlimited, on every plan. The meter only moves when the AI resolves one end to end, with no human involved
Free is a sandbox, not a free tier: 50 AI resolves, one-time, no card. When they’re used up the AI stops auto-resolving — your widget and inbox keep working, and upgrading turns it back on.
The widget carries a “Powered by TruSend” footer on Free, Starter and Growth — white-label is a Pro feature.
Coming from Intercom, Crisp or Tidio? Why switch to TruSend →
The ones owners actually ask
The developer questions have their own section below — these are yours
What happens when the AI can’t answer?
When its confidence is below the threshold, the conversation goes to your team with an explicit handoff card and the agent’s real name — and the visitor can ask for a person at any time. A handoff is not billed as a resolve.
Do I need a help center before I start?
No — but the AI only answers from content you’ve approved. Write articles in the platform or import what you already have; until then Nerv still works as a live-chat widget with your team’s inbox behind it.
Can I run it without the AI?
Yes. The widget and your inbox work on every plan even with zero AI resolves — the meter only runs when the AI closes a conversation end to end. Each help article also carries its own switch for the customer-facing AI, so you decide what it’s allowed to use.
Can I try it next to Intercom or Crisp?
Yes. The install is one script tag, and you choose which pages it appears on from the panel — so Nerv can run on a few pages while your current tool keeps the rest. Nothing to migrate before you’ve decided.
Won’t a line in the corner get in my visitors’ way?
It’s smaller than most cookie banners, carries no logo and doesn’t flash. It steps aside while a visitor is typing in one of your own forms, and on a phone it stays a small capsule until it’s tapped. If you’d rather have the classic chat bubble, switch the launcher to Button in the panel.
Where do conversations land for my team?
In Portal — the team inbox that ships with TruSend: assignment, notes, macros and SLAs, in the browser. The widget and the inbox are one platform, so a handoff is instant.
You’d be among the first teams on TruSend — and the person on the other end of founders@trusend.ai is the one building it.
Founder · TruSend
No logo wall yet. Be the reason there is one
Apply
Two sentences about your support queue, then a short call. We pick 12 teams in two waves for fit — and say no to the rest.
Pilot for 6 weeks
Full Growth for your whole team, 5,000 resolve credits, €0 base. Before day one we agree what success means on your queue — say, the AI holding half of it with CSAT steady.
Your call
Criteria missed — you walk away free; the performance risk is ours. Criteria hit — Growth at €768 a year, billed annually, at that price for as long as your annual subscription renews without interruption (list €1,188/yr)
What we ask back, in writing: a feedback call every two weeks, a case study with real numbers by week 8, and your logo — only once it has earned its place
Everything your developer will ask
How it loads, what you can drive from code, who the visitor is, and the security answers — drawn where a diagram beats a paragraph. Forward it, or skim it yourself
Off your critical path
The tag is an ES module — deferred by spec, so your page paints first and never waits. Watch the boot happen
Drive it from your own code
Click a method — the widget shows you what it does
NervChat.open({
message: 'Where is my order?',
});NervChat.setBranding({
brandColors: { primary: '#0ea5a3' },
});NervChat.setTranslations({
'chat.input.placeholder': 'Ask us…',
});// your backend signs the token — see below
NervChat.identify({ userId, token });NervChat.getUnreadCount(); // → 2// call it from your sign-out
NervChat.logout();Anything you hard-code in init() wins over the panel — hard-code sparingly, or your support lead can’t change it without you. Pre-1.0: pin an exact version.
Who the visitor is
Anonymous out of the box; a signed token from one endpoint when your customers log in
- Script tag loadsnothing to build — this is the whole install
- Bot checkno token, no chat — junk can't reach your inbox
- Anonymous sessionthe widget starts it on its own
- Continuity cookieone cookie, in one browser — not a login
<!-- the whole install — anonymous needs nothing else -->
<script
type="module"
src="https://cdn.trusend.ai/widget.js"
data-app-id="YOUR_APP_ID">
</script>Continuity isn’t a security boundary — identify your signed-in customers if you need one.
- Customer signs inon your site, the way they already do
- Your backend signs a tokenwith your key — it never leaves your server
- Widget presents itthe signed token is the whole verification
- Refreshed before it expireswe re-call your endpoint rather than dropping the chat
// your backend signs it — we never see the key
NervChat.init({
appId: 'YOUR_APP_ID',
tokenProvider: async () => {
const r = await fetch('/api/nerv-token');
return (await r.json()).token; // re-called before it expires
},
});We don’t hold your signing key — and can’t: client-side signing was removed on purpose, and the build forces the secret to empty in every mode.
Send these to your developer
Every verdict reads without opening a row — the detail is inside
Is your signing key in my page?No
The bundle carries public identifiers only. Client-side token signing was removed deliberately, and the build forces the JWT secret to empty in every mode, so it can't be reintroduced by accident.
Can someone else embed my App ID on their site?Not with the allowlist on
The widget calls a verify endpoint with its own origin before it renders anything — an origin that isn't on the list fails with DOMAIN_NOT_ALLOWED, and the widget never fetches your config and never opens a socket. Wildcards and a separate test-mode list are supported.
How do I rotate a leaked key?Two live keys
Two live API keys per workspace. Create the second, migrate to it, revoke the first — no window where the widget is down.
Can a malicious message run script in my page?Sanitized, both paths
- Message markdown
- Rendered through react-markdown. Raw HTML is only ever enabled together with rehype-sanitize, applied after it — so inline handlers and dangerous tags are stripped rather than trusted. Link protocols are checked: javascript:, data:, vbscript: and file: are blocked.
- Help-center HTML
- DOMPurify against a strict allowlist that forbids script, style, iframe, object, embed and form outright.
Both paths have regression tests.
What's on the wire?TLS · no cookies sent
The conversation runs over RSocket on a secure WebSocket; the bootstrap calls — verify, config, triggers, anonymous token — go over HTTPS, each with credentials omitted, so your cookies are never attached to them.
What does it put in my visitor's browser?A session, the chat history, 2 cookies
- localStorage
- Session token, cached transcript, read state
- IndexedDB
- Media blobs
- Cookies
- Two, first-party
This data is stored on your visitors' devices. List it in your cookie and privacy notices and decide whether your consent banner must cover it.
Is it isolated from my page?Shadow root, no iframe
Nerv renders inside a shadow root on your page, not in an iframe, so your stylesheets don't reach the widget and its styles don't leak into your page. A shadow root isolates styling only; it is not a security boundary against scripts running on your page.
Tested on every commit
Not a one-off audit that goes stale the week it’s signed — the checks run in CI, against the widget itself
If your site sends a Content-Security-Policy headerthe directives
- script-src
- The CDN host serving widget.js
- connect-src
- Our API host and WebSocket gateway for config and the conversation, plus the two attachment buckets a file is uploaded to and read back from
- img-src
- The same two buckets and our API host, plus data: and blob: — logos, image attachments, and the preview of a file before it leaves the browser
- media-src
- The same two buckets, plus data: and blob: — voice and video attachments. Miss it and they fail silently
- style-src
- 'self' is enough — the widget's stylesheet is adopted, not injected, and style-src doesn't govern that
The install snippet and the panel settings live in the docs → The platform’s security posture is on the security page →
Ask the line in the corner — that’s the demo
No sandbox to request and no call to book. Ask it something, push on it — then talk to us
Curious where handoffs land for your team? See Portal →