import dev.everframe.Everframe
import dev.everframe.config.EverframeConfig
import dev.everframe.config.CaptureConfig
Everframe.start(
context,
EverframeConfig(
appId = "<App ID>",
sdkKey = "evf_live_…",
release = "2.4.0",
capture = CaptureConfig(network = true),
),
)
Note the import: the config lives in dev.everframe.config, not alongside
the Everframe object.
EverframeConfig
| Field | Type | Default | What it does |
|---|---|---|---|
appId | String | — | Required. The App ID, a UUID, from the app’s Setup tab in the dashboard: the same value symbol uploads take. The SDK only checks it; blank throws EverframeConfigError from start(). |
sdkKey | String | — | Required. Your SDK key, evf_live_…, from the same tab. It identifies your app when reports are sent. Android takes both, unlike iOS. |
environment | Environment | production | development, staging or production. |
release | String? | null | Release identifier recorded on the report. |
capture | CaptureConfig | defaults | What is captured — see below. |
bubble | Boolean | true | A hint your own code can read, nothing more. The SDK does not install a bubble — trigger UI is yours. |
useDynamicColor | Boolean | false | Not read. The reporter never applies Material You colours; theme it with theme instead. |
companionDeviceId | String? | null | Deprecated, ignored. Companion was removed; the parameter stays so existing code compiles. |
companionBadgeEnabled | Boolean | true | Deprecated, ignored. Companion was removed; the parameter stays so existing code compiles. |
companionBadgePosition | String? | null | Deprecated, ignored. Companion was removed; the parameter stays so existing code compiles. |
theme | ReporterThemeOptions? | null | Reporter colours. See Branding. |
installIdentifierEnabled | Boolean | true | Send a per-install identifier so distinct installs count toward your plan. Nothing about the person is derived from it. false turns it off locally; it can never force it on. |
reporterEnabled | Boolean | true | false makes every session crash-only: no on-device reporter. See Crash-only sessions. |
vitals | VitalsConfig | VitalsConfig() | Session Vitals opt-out / sample rate / source-query capture. See Session vitals. |
r8MappingId | String? | null | Exact mapping identity embedded before compiling an optimized build. Invalid values are omitted from crash metadata. See Source maps. |
bubble is easy to misread: it does not make the SDK draw anything. It is a
flag your own code can inspect to decide whether to render a floating trigger,
kept so a host can carry that preference in config rather than beside it.
CaptureConfig
| Field | Default | What it does |
|---|---|---|
screenshot | true | Not read. The reporter always takes a screenshot. |
focus | true | Not read. Focused-component capture is not implemented on Android. |
logs | true | Capture Timber output and anything written to System.out / System.err. Plain android.util.Log calls are not captured. |
network | false | Gates body capture only. Request metadata is recorded whenever the OkHttp interceptor is attached — see Console & network. |
crash | true | Gates unattended crash reports — JVM exceptions, native crashes, ANRs and low-memory kills — and explicit captureException. See Crash reporting. |
ringBufferCapacity | 250 | Not read — the log and network buffers are each fixed at 100 entries. Setting it has no effect. |
networkBodies | true | Client veto for body capture. false always wins; true does not force capture on — the server gate still decides. |
Body capture is effective only when network is true, networkBodies is not
false, and the server has it on: a client can turn it off and can never
turn it on. See Network bodies and
Server config.
Crash-only sessions
Everframe.start(
context,
EverframeConfig(
appId = "<App ID>",
sdkKey = "evf_live_…",
reporterEnabled = false,
),
)
reporterEnabled = false turns the on-device reporter off for the whole
session: report.open() throws. Crash and error capture, breadcrumbs, console
and vitals keep working.
Use it in production builds that should report crashes without recording every session. Replay in a crash-only session follows the dashboard’s crash-only coverage, 0% by default, instead of the report coverage, and network bodies are not captured. See Session replay.
Runtime methods
| Method | What it does |
|---|---|
report.open() | suspend. Opens the reporter, returns on submit or cancel. openAsync(callback) for a callback form. Throws in a crash-only session. |
report.isPresenting | StateFlow<Boolean> — true while the reporter is up. Use it to disable your trigger. |
setUser(user) | Attach or clear the end user. null clears. No-op before start(). See Identity. |
setIdentityToken(source) | Supply a verified identity instead of a self-asserted one. null signs out. |
addBreadcrumb(message, kind, level, data) | Add a custom entry to the trail. |
recordScreen(name, data) | Mark a screen transition. See Screen tracking. |
captureException(throwable, options?) | Report a caught error with optional severity, context, and metadata. See Crash reporting. |
setExtra(value) / clearExtra() | Free-form string attached to the next report, then cleared. Each call replaces the last. Truncated at EXTRA_MAX_CHARS (16 384 chars / 16 KiB). |
markSensitive(view) | Mask a view. See Sensitive content. |
kill() | Stop the SDK and drop buffered evidence for this session. |
requestOutboxDrain() | Flush the outbox now rather than on its own schedule. |
kill() is the switch for a user withdrawing consent mid-session: it stops
capture and discards what is already buffered, which is the distinction that
matters if the reason for calling it is that something sensitive just appeared.
Reading current state
Everframe.captureGate // Boolean — is capture actually allowed?
Everframe.currentConfig // EverframeConfig?
Everframe.currentUser // TXUser?
Everframe.captureUserSnapshot() // TXCapturedUser
Everframe.captureSessionSnapshot()
captureGate reports whether capture is armed — start() opens it and kill()
closes it. It is not a summary of the server feature gates: replay and body
capture have their own, so captureGate can be true while neither is
running.
Quick capture
Quick capture files a draft report from a debug emulator with one gesture: a screenshot, logs, breadcrumbs and network, as for a manual report. It is armed only in debug builds on the Android and Android TV emulator. For real phones and Android TVs, see Quick capture on real devices. Screens drawn with Compose are not recorded in the replay, as everywhere else.
Real phones and Android TVs can quick capture too, once linked to you or your team under Project settings → Devices: shake the phone, or hold Play/Pause on the TV remote. See Quick capture on real devices.
Click the emulator screen and press Shift+B to capture. It is ignored while a text field has focus, so typing a capital B still types. A live capture card then appears in the dashboard, where you can title the capture and file it as a ticket. You can turn quick capture or its replay off in the dashboard under the app’s “Quick capture” card.
The emulator strips ⌘, ⌃ and ⌥ and never passes Shift on its own to the app, so
only a letter or digit, alone or with Shift, can be a shortcut here. If the
app’s shortcut in the dashboard is anything else (double-tap Shift or a ⌘
chord, which work on iOS), Android uses Shift+B. While a dialog or a React
Native Modal is in front, Shift+B is not seen. The CLI below still triggers a
capture there, but its screenshot shows the screen under the dialog, not the
dialog itself.
You can also trigger a capture from your computer, for example from a script:
npx @everframe/cli capture
With more than one booted simulator or running emulator, pass --device <id>
(for example --device emulator-5554); the command lists them and exits when
you do not. It runs adb shell am broadcast -a com.everframe.CAPTURE for you,
which is also what to run if you have no CLI.
To have captures private to you rather than in the shared inbox, log in once:
npx @everframe/cli login
It opens the dashboard, where you allow the login, saves a personal capture
token to ~/.everframe/credentials, and stores it on every running emulator,
where the SDK reads it. Pass --no-browser to print the URL instead of opening
it, or --url <api-url> for a self-hosted dashboard. The CLI also records which
server issued the token, and the SDK sends it only to that server.
Emulators started (or wiped) after you log in need npx @everframe/cli link to
store the token again.
npx @everframe/cli logout revokes the token and clears it from running
emulators. Real devices never get a token. You can also create a token in the
dashboard (Settings → Agents → Capture tokens) and store it yourself:
adb shell settings put global everframe_token <token>
A missing or invalid token never blocks a capture; it just lands in the shared inbox. Drafts expire from the inbox after 7 days unless filed.
What Android does not have
No debug, disabled or onError field. No setMetadata — use setExtra.
No client-side redaction config: redaction is not configurable from
EverframeConfig on this SDK. No sessionReplay block — replay is enabled
entirely from the server.
Two-way replies are not implemented in the Android SDK. The server block is decoded for compatibility, but there is no reply UI and no polling; the feature is web-only today.
To keep Everframe out of a build, do not call start.