<EverframeProvider
config={{
apiKey: 'evf_live_…',
appVersion: '2.4.0',
console: { maxEntries: 100, levels: ['warn', 'error'] },
}}
>
<App />
</EverframeProvider>
Core
| Option | Type | Default | What it does |
|---|---|---|---|
apiKey | string | — | Required. Your app’s SDK key. Publishable — it only grants report submission, so shipping it in a web bundle is the intended use. |
appName | string | see below | Name recorded in context.app. Nothing is detected for you — set it. |
appVersion | string | '0.0.0' | Version recorded in context.app. Nothing is detected for you — wire it to your build. |
appBuild | string | — | Exact deployed build ID or commit SHA, recorded in context.app.build on errors and user-filed reports. |
disabled | boolean | false | Stops capture, patching, the outbox, config fetching and crash handling. The provider still installs its styles and hotkey and can still open the reporter — it is not a full uninstall. |
debug | boolean | false | Installs the replay diagnostic seam. It does not turn on verbose console logging. |
onError | (err) => void | — | Called when a safe-wrapped public client call fails. Not every internal async failure routes here. |
Reporter trigger
The SDK installs the app’s dashboard-configured report hotkey. It defaults to
Mod+Shift+B (Cmd+Shift+B on macOS and Ctrl+Shift+B elsewhere). The
dashboard value is authoritative and cannot be replaced through SDK config.
Capture
| Option | Type | Default | What it does |
|---|---|---|---|
console.maxEntries | number | 100 | Console ring-buffer capacity. |
console.levels | string[] | all five | log, info, warn, error, debug. Narrowing to ['warn','error'] is the cheapest way to shrink reports on a chatty app. |
network.maxEntries | number | 100 | Network ring-buffer capacity. |
sessionReplay.disabled | boolean | false | Never start the replay buffer. |
networkBodies.disabled | boolean | false | Never capture request/response bodies. |
crashReporting.disabled | boolean | false | Suppresses automatic error reports and captureException(). |
installIdentifier.disabled | boolean | false | Stops this app sending its daily install identifier, which counts distinct installs toward your plan. Not retroactive, and other apps in the org still count. |
redaction | object | default-deny | See Redaction. |
Unset, appName falls back to 'unknown-app' on a submitted report and
'unknown' on an unattended crash report — two placeholders on two code paths,
which is its own reason to set it.
sessionReplay.disabled and networkBodies.disabled are client vetoes over
a server gate: the effective state is serverEnabled && !disabled, so a client
can turn those off and can never turn them on. See
Server config.
crashReporting.disabled, installIdentifier.disabled and redaction have no
server gate — they are plain local settings.
Replies
| Option | Type | Default | What it does |
|---|---|---|---|
replies.disabled | boolean | false | No polling, no UI, no reply token on submit. |
replies.ui | 'default' | 'headless' | 'default' | headless renders no reply UI — you consume threads and unreadCount from useEverframe() and build your own. |
replies.pollIntervalMs | number | 60 000 | Poll cadence. Floored to 60 s regardless of what you pass. |
Browser specifics
| Option | Type | Default | What it does |
|---|---|---|---|
cspNonce | string | — | Threaded into the screenshot library and injected styles. Required under a strict CSP, or the reporter renders unstyled. |
theme | ReporterTheme | — | Reporter colours, paid plans only. See Branding. |
__everframeShadowDom is on the shared WebEverframeConfig type but is read only
by the Web SDK’s init(). The React provider always renders the reporter into
document.body, so setting it here has no effect.
Provider props
config is frozen at mount — to change it, remount the provider. The one other
prop, identity, is live: it points the SDK at your identity endpoint and
re-mints when your user changes. See Identity.
Runtime methods
Config is set once; these are called whenever.
const {
open,
captureException,
setUser,
setIdentityToken,
setExtra,
addBreadcrumb,
threads,
unreadCount,
kill,
} = useEverframe();
| Method | What it does |
|---|---|
open() | Opens the reporter. Resolves with { status } — submitted, queued or cancelled. |
setUser(user) | Attach or clear the end user on future reports. See Identity. |
setIdentityToken(source) | Supply a verified identity by hand. The identity prop does this for you. |
setExtra(value) | Free-form metadata on the next report — a string, an object, or a resolver function (see below). Each call replaces the last. Capped at 16 KiB — see Errors & limits. |
addBreadcrumb(input) | Add a custom entry to the trail. See Breadcrumbs. |
captureException(error, options?) | Report a caught error with optional severity, context, and metadata. See Crash reporting. |
markSensitive() | On the hook for cross-SDK parity, but a no-op on the web. Use <Sensitive> or data-everframe-sensitive. |
threads | The two-way replies API, for headless UIs. See Two-way replies. |
unreadCount | Live unread reply count across threads. |
kill() | Tear capture down early. The provider calls it on unmount. |
open, addBreadcrumb, captureException, recordScreen, setUser and
setExtra are also exported at module level for code outside the tree. open
rejects with EverframeNotMountedError when no provider is mounted; the rest are
silent no-ops.
import { setUser, setExtra, recordScreen } from '@everframe/react';
setUser({ id: 'u_1042' });
setUser(); // no argument clears, same as setUser(null)
The three forms of setExtra
setExtra('checkout, card declined'); // string
setExtra({ cartId, step, flags }); // object — serialised for you
setExtra(() => ({ cartId, step: currentStep })); // resolver — preferred
Prefer the resolver. It runs once per report, at assembly time, so what it
returns reflects your state when the bug happened rather than whenever you last
called setExtra. The other two forms freeze a snapshot at call time, which
goes stale the moment anything changes.
Each call replaces the last, whichever form you use. The payload is capped at
EXTRA_MAX_CHARS (16 KiB, exported from @everframe/react); an over-budget
payload is dropped, not trimmed — see Errors & limits.
Precedence
Three things can set the same value. Highest wins:
- Server config — plan entitlements and per-app settings from
GET /api/config - This config object
- SDK defaults
With one asymmetry: for the gated features above, local config can only ever subtract. That is deliberate — a customer can disable capture for privacy reasons without being able to enable something their plan does not include.