BoopErrorTracker

Hex.pmHex DocsDownloadsLicense

Your Elixir app raised. Your phone knows.

Sends ErrorTracker errors to your iPhone through Boop, the tiny self-hosted push notification inbox.

ErrorTracker deliberately does not do notifications. This package attaches to the telemetry events it already emits, so you install it next to ErrorTracker and nothing about ErrorTracker changes.

Installation

def deps do
[
{:error_tracker, "~> 0.9"},
{:boop_ex, "~> 1.0"},
{:boop_error_tracker, "~> 1.0"}
]
end

Set up ErrorTracker as usual (repo, migration, router). Then configure the Boop client and this package:

# config/runtime.exs
config :boop_ex,
url: System.fetch_env!("BOOP_URL"),
api_key: System.fetch_env!("BOOP_API_KEY")
config :boop_error_tracker,
environment: config_env(), # tagged on every event
source: "my_app", # shown next to the error in Boop; default "error_tracker"
enabled: config_env() == :prod

That's it. The handler attaches when the application starts.

What you get

Each push opens a full error page in the Boop app: exception type and message, the stacktrace with your app's frames highlighted, ErrorTracker's context and breadcrumbs, and tags for environment, source function/line and the ErrorTracker ids so you can jump to the ErrorTracker UI.

EventDefaultMeaning
:newonAn error ErrorTracker has never seen before
:unresolvedonAn error you marked resolved in the ErrorTracker UI happened again
:occurrenceoffEvery occurrence of any error, throttled per error (throttle, default 10 minutes)

Errors muted in ErrorTracker are never sent.

Options

config :boop_error_tracker,
enabled: true,
environment: "prod",
source: "my_app",
level: :error, # :critical makes pushes prominent
notify_on: [:new, :unresolved], # add :occurrence for ongoing errors
throttle: :timer.minutes(10), # minimum gap between :occurrence pushes for the same error
in_app: [:my_app, :my_app_web], # which OTP apps count as "your code" in stacktraces
tags: %{team: "web"} # static tags on every event

Sending goes through Boop.send_async/2: it never blocks the process that raised, never raises, and logs failures at :warning.

Usage rules for AI agents

Ships a usage-rules.md for usage_rules: mix usage_rules.sync AGENTS.md --all --link-to-folder deps.

Licence

MIT.