One script tag adds the chat widget to any web page. No build step. No npm install.
<script src="https://fielded.net/widget/loader.js?key=FIELDED_API_KEY" defer></script>
Replace FIELDED_API_KEY
with your app's key — sign up free to get one.
If you're using Replit Agent, Cursor, Claude, Copilot, or similar — copy the prompt below and paste it into the chat. Your agent will fetch the install instructions from /install.md and apply them to your codebase.
Find index.html (or your theme's footer template) and locate the closing </body> tag.
</body>.That's it — no build step, no dependencies.
app/views/layouts/application.html.erbThis layout wraps every page, so the widget loads everywhere. Use a more specific layout if you only want it on certain sections.
</body><script src="https://fielded.net/widget/loader.js?key=FIELDED_API_KEY" defer></script> </body>
index.html (simplest)For Vite, edit index.html at the project root. For Create React App, edit public/index.html. Paste the snippet before </body>.
Use a useEffect in your root component to inject the script at runtime.
import { useEffect } from "react"; useEffect(() => { const s = document.createElement("script"); s.src = "https://fielded.net/widget/loader.js?key=FIELDED_API_KEY"; s.defer = true; document.body.appendChild(s); }, []);
<Script> componentIn app/layout.tsx (App Router) or pages/_app.tsx (Pages Router):
import Script from "next/script"; <Script src="https://fielded.net/widget/loader.js?key=FIELDED_API_KEY" strategy="afterInteractive" />
Install a plugin like Insert Headers and Footers, paste the snippet from the top of this page into the "Scripts in Footer" box, and save. Or, in your theme editor, open footer.php and paste it before the closing </body>.
Yes — it's designed to. The key in the loader URL is a publishable identifier, the same kind of token Intercom calls an app_id, Stripe calls a pk_live_… key, or Segment calls a "write key." It tells Fielded which app is loading the widget, nothing more.
It does not grant access to read conversations, list customers, impersonate agents, or change settings. Anyone who visits your site can already see it in their browser devtools the moment the widget loads.
Two things, both server-side only:
/agents/installation page after signing in.They'd mostly be starting anonymous conversations against your inbox — annoying, not catastrophic. The right defense is the domain allowlist on your app's settings page (which restricts which origins the widget will boot on), not key secrecy.
Pure ergonomics, not secrecy. Putting it in an env var lets you point staging at one app and production at another without touching your layout file.
A small JavaScript file (under 30 KB) that injects the chat bubble and connects to Fielded over WebSockets when opened. It does not load third-party trackers, doesn't read other cookies on your site, and only sends data the visitor types into the chat.
If your app already knows who the visitor is (signed-in users), you can pass their identity to Fielded so they aren't asked again — they'll see a "Chatting as: …" badge instead of a name/email form, and conversations land in your inbox already tagged with the right user.
This requires computing an HMAC signature server-side. After signing up,
visit /agents/installation for your HMAC secret. Full
framework recipes (including a complete Node/Express + React SPA pattern
for Replit-style apps) are in the
raw markdown install doc
— the same doc your AI coding agent fetches when you use the prompt above.