Signals: from nothing to an error
Errors, traces, logs and metrics from your own product come into Rezee through a source. Make one, put its DSN in your app, and the next error your app throws is in Signals.
1. Make a source
In Settings → Signals, add a source for each app or service, and say where it runs: a browser, a server, or something else. A source has keys, and each key has a DSN:
https://rzi_…@ingest.rezee.app/1042A key can only send, never read, so it is safe in a page. Browsers say which page a request came from, so a browser key is held to the origins you list for it. Every key has a rate per minute, and what it refused is counted on its source.
2. Send from a browser
Add Rezee's browser SDK with one tag. It reports uncaught errors and rejected promises, with the clicks, navigations, fetch requests and console warnings that came before them. With data-traces set to a rate between 0 and 1, that share of page loads is traced, with their requests and web vitals.
<script async src="https://work.rezee.app/sdk/v1.js"
data-dsn="https://rzi_…@ingest.rezee.app/1042"
data-release="web@1.4.2"
data-environment="production"
data-traces="0.1"></script>Or install it, for an app with a build step:
npm install @rezee/browser
import * as Rezee from "@rezee/browser";
Rezee.init({
dsn: "https://rzi_…@ingest.rezee.app/1042",
release: "web@1.4.2",
tracesSampleRate: 0.1,
});Already using a Sentry SDK? Keep it and change its DSN - see Switching from Sentry.
Session replays
With data-replays set to a rate between 0 and 1, that share of sessions is recorded from the start, and every other session keeps the minute before an error. Set data-replays-on-error to keep that minute for only a share of errors. A session that sends a report through the feedback widget keeps its replay too, linked from the report. The recorder loads from the same place as the SDK, and only when replays are on.
<script async src="https://work.rezee.app/sdk/v1.js"
data-dsn="https://rzi_…@ingest.rezee.app/1042"
data-replays="0.1"></script>From npm, the recorder is its own import, so a page without replays never loads it:
import { startReplay } from "@rezee/browser/replay";
Rezee.init({
dsn: "https://rzi_…@ingest.rezee.app/1042",
replaysSessionSampleRate: 0.1,
replaysOnErrorSampleRate: 1,
replayRecorder: startReplay,
});Every piece of text and every input is masked in the browser, before anything is sent, along with words in attributes such as titles and placeholders; addresses lose their query and fragment. Mark an element data-rezee-unmask to show its text and inputs. Password fields, one-time codes and fields named or autofilled as a card's are never shown, whatever is marked. Mark one data-rezee-block to leave it out, drawn as an empty box. Images still load from their own address as the player draws them.
Replays are under Signals → Replays, and an error lists the replays of the sessions it happened in. Rage clicks (three in a second), dead clicks (on something that then changes nothing) and, in a single-page app, going straight back are counted per page, each with a replay to watch.
3. Send from a server
On Node or Bun, install Rezee's server SDK. It reports uncaught exceptions and unhandled rejections with the lines of your code around each frame:
npm install @rezee/node
import * as Rezee from "@rezee/node";
Rezee.init({ dsn: process.env.REZEE_DSN, release: process.env.GIT_SHA });In any other language, use a Sentry SDK with the source's DSN, or send OpenTelemetry traces, logs and metrics - see OTLP. Use a server source's key there: OTLP refuses a browser key.
4. See it
Errors are grouped by their stack, so a thousand of the same crash are one row with a count. Open one for its stack, its events and the releases it was seen in. With source maps and a repository set on the source, its stack reads as your code, with the commit most likely to have brought it.
Before anything is stored, credentials, tokens, email addresses and card numbers are filtered out of it, apart from the id and email of the user your app names on an event. Add your own rules, and choose how long each kind is kept, in quotas, retention and scrubbing.
Where it goes
A new error, or one that comes back after it was fixed, is on the engineering track. It is filed in the Intake of the team you choose for that track in Settings → Signals, or the team set on its source. With no team chosen, nothing is filed.
Feature requests and friction in customer feedback are on the product track: Rezee writes up the problem with options for solving it, and an option you accept becomes a spec draft in the product team's Intake. Anyone who can see an item can move it to the other track.
