The widget in the corner of this page is Nerv
The messenger your customers talk to. It answers from your help center, hands the conversation to your team the moment it’s unsure, and you restyle it from a settings screen — not from your code
Watch it answer one
A customer asks. It reads your help center, shows the article it used, and only answers when it's sure. Click any step
Card numbers, emails and order data are stripped before anything reaches a model — grounding and policy are verified before it can send.
Below its confidence threshold it doesn’t guess — 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.
When it isn’t sure, it doesn’t guess. 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
Hi! How can we help?
Ask us anything, or browse the topics below
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.
How did that go?
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.
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
Colour, wording, where the button sits, which pages it shows on — 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
Hi! How can we help?
Ask us anything or browse topics below
The preview covers the look; the same panel screen also holds your logo, conversation starters, page targeting, 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.chatly.tech/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.
- 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 opens with the right message at exactly that moment. 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 them who they are, before the first message
A gate screen is where a visitor turns around. This one arrives as an incoming message instead, with the composer already sitting under it
- 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 before the chat starts
- 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
Disclosure and data care are built in and on by default — not a setting your team has to remember, or one they can quietly switch off
That is the whole difference the law is about — your customer can always tell which one they’re talking to.
- 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, end to end
- 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. You pay when the AI closes one 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 teams switch →
The ones owners actually ask
The developer questions have their own section below — these are yours
What happens when the AI can’t answer?
It doesn’t guess. 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. Handoffs are free on every plan.
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.
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, locked for as long as you stay (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.chatly.tech/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 itno Intercom-style user_hash — the 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
Session data lives in the visitor's browser — note it in your privacy records.
Is it isolated from my page?Light DOM, no iframe
Nerv renders in the light DOM and injects its stylesheet into your head — that's what makes it restylable from the panel. Budget a CSS check on first install.
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, and challenges.cloudflare.com for the bot check
- 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
- frame-src
- challenges.cloudflare.com, for the bot check
- 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 →
Open the widget in the corner — that’s the demo
No sandbox to request and no call to book. Open it, push on it, ask it something — then talk to us
Curious where handoffs land for your team? See Portal →