boop_error_tracker pushes ErrorTracker errors to the developer's phone through Boop. It attaches to ErrorTracker's telemetry events; it does not replace, wrap, or configure ErrorTracker, and it has no database.
Requires
error_trackerinstalled and configured by the host app, andboop_exconfigured withurlandapi_key(see boop_ex's usage rules). Add both deps; this package only listens.Configure in
config/runtime.exs:config :boop_error_tracker, environment: config_env(), source: "my_app", notify_on: [:new, :unresolved], throttle: :timer.minutes(10), error_tracker_url: "https://my-app.com/dev/errors", enabled: config_env() == :prodNothing else is needed: the telemetry handler attaches when the
:boop_error_trackerapplication starts. Do not callBoopErrorTracker.attach/0from the host app's supervision tree orApplication.start/2; use it only in tests or afterdetach/0.notify_onvalues::new(first time an error is seen),:unresolved(an error marked resolved in the ErrorTracker UI happens again),:occurrence(every occurrence, throttled per error bythrottlemilliseconds). Default[:new, :unresolved]; add:occurrenceonly when the user wants ongoing noise.Muted errors (muted in the ErrorTracker UI) are never sent. Do not add your own filtering for that.
Every event is level
:error; setlevel: :criticalfor prominent pushes.sourcedefaults to"error_tracker"; set it to the app name.in_app: [:my_app, :my_app_web]pins which OTP applications count as in-app frames in the stacktrace. Without it, common framework apps are treated as not in-app.tags: %{team: "web"}adds static tags to every event. Occurrence context is sent ascontext; boop_ex redacts sensitive keys inside it.Always set
error_tracker_urlwhen the host app mounts the ErrorTracker dashboard: it is the public URL of the dashboard route plus/errors(e.g. routererror_tracker_dashboard "/dev/errors"→"https://my-app.com/dev/errors"). Each push then has an "Open in ErrorTracker" button.actionsadds more buttons: a list of%{label, url}orfn error, occurrence -> [...] end. Boop shows at most three in total; keep labels short (≤40 chars) and URLs absolute. A raising function is swallowed (the event is still sent).Events carry ErrorTracker's fingerprint, so Boop groups occurrences of one error into a single inbox row; do not override
fingerprint.Sends use
Boop.send_async/2: nothing blocks the process that raised, and failures are logged, never raised. Do not wrap intry/rescue.Set
enabled: falseinconfig/test.exs.