PHPackages                             script-development/kendo-error-tracker - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Logging &amp; Monitoring](/categories/logging)
4. /
5. script-development/kendo-error-tracker

ActiveLibrary[Logging &amp; Monitoring](/categories/logging)

script-development/kendo-error-tracker
======================================

Laravel client library that reports scrubbed exceptions into kendo's error-tracking endpoint.

v0.1.0(yesterday)049↑2716.3%[1 PRs](https://github.com/script-development/kendo-error-tracker/pulls)MITPHPPHP ^8.4CI passing

Since Jun 8Pushed yesterdayCompare

[ Source](https://github.com/script-development/kendo-error-tracker)[ Packagist](https://packagist.org/packages/script-development/kendo-error-tracker)[ RSS](/packages/script-development-kendo-error-tracker/feed)WikiDiscussions main Synced yesterday

READMEChangelog (1)Dependencies (9)Versions (3)Used By (0)

kendo-error-tracker
===================

[](#kendo-error-tracker)

[![Packagist Version](https://camo.githubusercontent.com/5be0d5ddaacc8d0f9a681358997affd57bf6fc60806b1008b7f7876395d1914a/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f7363726970742d646576656c6f706d656e742f6b656e646f2d6572726f722d747261636b65722e737667)](https://packagist.org/packages/script-development/kendo-error-tracker)[![PHP Version](https://camo.githubusercontent.com/dfd1a8f62ae92b5932faba30bfa5ceaf2d590b0f177a1dffa0e644d1ba9f9157/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f646570656e64656e63792d762f7363726970742d646576656c6f706d656e742f6b656e646f2d6572726f722d747261636b65722f7068702e737667)](https://packagist.org/packages/script-development/kendo-error-tracker)[![CI](https://github.com/script-development/kendo-error-tracker/actions/workflows/ci.yml/badge.svg)](https://github.com/script-development/kendo-error-tracker/actions/workflows/ci.yml)[![License](https://camo.githubusercontent.com/d1bc9aae92c609fa8f63541360c21393041693a0e5034c2a059dedac347ed3ff/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f7363726970742d646576656c6f706d656e742f6b656e646f2d6572726f722d747261636b65722e737667)](LICENSE)

Canonical Laravel client library for reporting errors into kendo's error-tracking endpoint — scrubbing + auth + swallow-on-failure, installable via Composer across Script Development Laravel territories.

Why
---

[](#why)

kendo ships the server endpoint, but allied projects must not POST raw HTTP: PII scrubbing has to happen source-side and consistently. This library is the gate — install it, call `ErrorTracker::report($exception)` from your exception handler, and inherit scrubbing, Bearer auth, path normalization, and swallow-on-failure for free. Without it, every consuming project reinvents the wheel and the scrubbing contract drifts.

Installation
------------

[](#installation)

```
composer require script-development/kendo-error-tracker
```

The `ErrorTrackerServiceProvider` is auto-discovered via Laravel package discovery — no manual registration. Publish the config if you want to tune it:

```
php artisan vendor:publish --tag=error-tracker-config
```

Configuration
-------------

[](#configuration)

Set the environment variables (the config reads `ERROR_TRACKER_*`). Only the first **three are required** — without them a report is silently dropped. Everything below them is **optional** and has a sane default.

Env varConfig keyRequired?Description`ERROR_TRACKER_KENDO_URL``kendo_url`**Required**Base URL of your kendo tenant — always `https://{tenant}.kendo.dev` (e.g. `https://script.kendo.dev`).`ERROR_TRACKER_PROJECT``project`**Required**The kendo **project id** that owns the errors (the `{project}` route-key; kendo binds it by id).`ERROR_TRACKER_TOKEN``token`**Required**A kendo project token carrying the `error-events:write` ability (Bearer).`ERROR_TRACKER_ENVIRONMENT``environment`OptionalDeploy environment label. May be omitted — falls back to `APP_ENV`, then `production`. Only set it to override that derived default.`ERROR_TRACKER_RELEASE``release`OptionalRelease identifier (git sha / version tag). May be omitted — when unset it is dropped from the payload entirely.`ERROR_TRACKER_SYNC``sync`Optional`false` (default) queues the report; `true` POSTs inline.`ERROR_TRACKER_CONNECT_TIMEOUT``connect_timeout`OptionalSeconds to wait while connecting to the kendo host (default `2`).`ERROR_TRACKER_TIMEOUT``timeout`OptionalTotal seconds to wait for the POST (default `5`); bounds the call so a hung host never blocks the caller.Minimal working config — just the three required vars:

```
ERROR_TRACKER_KENDO_URL=https://script.kendo.dev
ERROR_TRACKER_PROJECT=7
ERROR_TRACKER_TOKEN=your-project-token
```

The optional knobs below are shown with their defaults; leave them commented out unless you need to override:

```
# ERROR_TRACKER_ENVIRONMENT=          # defaults to APP_ENV, then "production"
# ERROR_TRACKER_RELEASE=              # omitted from the payload when unset (e.g. v1.2.3)
# ERROR_TRACKER_SYNC=false           # true POSTs inline instead of queueing
# ERROR_TRACKER_CONNECT_TIMEOUT=2    # seconds to wait while connecting
# ERROR_TRACKER_TIMEOUT=5            # total seconds to wait for the POST
```

Minting a project token
-----------------------

[](#minting-a-project-token)

The token is a kendo **project token** carrying the `error-events:write` ability:

1. Open the kendo project's **API token** settings.
2. Create a token scoped to the project and grant it the `error-events:write` ability.
3. Copy the token into `ERROR_TRACKER_TOKEN`.

The token is bound to the project it was minted under. A token used against a different project's route is rejected by the server (`422`) — and like every failure, the client swallows it.

Integration
-----------

[](#integration)

Report exceptions from your application's exception handler. In Laravel 11+ (`bootstrap/app.php`):

```
use ScriptDevelopment\KendoErrorTracker\ErrorTracker;
use Throwable;

->withExceptions(function (Exceptions $exceptions): void {
    $exceptions->report(function (Throwable $e): void {
        app(ErrorTracker::class)->report($e);
    });
})
```

Or from a classic `App\Exceptions\Handler::report()`:

```
public function report(Throwable $e): void
{
    app(\ScriptDevelopment\KendoErrorTracker\ErrorTracker::class)->report($e);

    parent::report($e);
}
```

That single call is the whole integration. `report()` is **swallow-on-failure**: it never throws and never blocks the request, so it is safe to call from inside your own exception handler.

What gets sent
--------------

[](#what-gets-sent)

`report()` builds and POSTs this body to `{kendo_url}/api/projects/{project}/error-events`:

```
{
    "environment": "production",
    "release": "v1.2.3",
    "exception_class": "RuntimeException",
    "message": "",
    "stack_trace": ""
}
```

`environment` reflects the resolved value (your `ERROR_TRACKER_ENVIRONMENT`, else `APP_ENV`, else `production`); `release` is omitted from the body entirely when unset. No request, user, or context fields are sent — the server schema bans them.

Scrubbing
---------

[](#scrubbing)

Before send, the message and stack trace are scrubbed of the following patterns (each replaced with a `[REDACTED:]` marker):

PatternExampleJWT`eyJhbGc...` (three base64url segments)Bearer token`Bearer `BSN (Dutch citizen service number)a 9-digit runEmail address`user@example.com`Path normalization
------------------

[](#path-normalization)

Each stack frame's absolute path has the app's own `base_path()` stripped (an **exact** prefix removal, mirroring `laravel/nightwatch`'s `Location::normalizeFile()`). The same exception thrown from `/var/www/html/app/Foo.php` and `/home/forge/app/Foo.php` normalizes to the identical `app/Foo.php`, so kendo fingerprints it once regardless of deploy root.

Dispatch modes
--------------

[](#dispatch-modes)

- **Async (default):** `report()` dispatches `ReportErrorJob` to the queue. The job has **0 retries** — a failed POST logs to the local PHP `error_log` and is never requeued, so error tracking never amplifies load during an outage.
- **Sync:** set `error-tracker.sync` (`ERROR_TRACKER_SYNC=true`) to POST inline.

Both modes swallow every failure.

Failure handling
----------------

[](#failure-handling)

A `202` response is success. Every failure — HTTP timeout, `401` (no/invalid token), `403` (token lacks `error-events:write`), `422` (token not linked to the project, or revoked), `5xx`, or an unreachable host — is written to the local `error_log` and never thrown.

Development
-----------

[](#development)

```
composer test          # Pest
composer phpstan       # PHPStan (level max, self-analysis)
composer format:check  # Pint --test
composer format        # Pint write
```

###  Health Score

43

—

FairBetter than 89% of packages

Maintenance100

Actively maintained with recent releases

Popularity12

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity42

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 72.2% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

1d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/24678549?v=4)[Gerard Oosterhof](/maintainers/Goosterhof)[@Goosterhof](https://github.com/Goosterhof)

![](https://avatars.githubusercontent.com/u/68101885?v=4)[Jasper Boerhof](/maintainers/jasperboerhof)[@jasperboerhof](https://github.com/jasperboerhof)

---

Top Contributors

[![jasperboerhof](https://avatars.githubusercontent.com/u/68101885?v=4)](https://github.com/jasperboerhof "jasperboerhof (13 commits)")[![Goosterhof](https://avatars.githubusercontent.com/u/24678549?v=4)](https://github.com/Goosterhof "Goosterhof (5 commits)")

---

Tags

laravelerror-trackingException Reportingkendo

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StyleLaravel Pint

Type Coverage Yes

### Embed Badge

![Health badge](/badges/script-development-kendo-error-tracker/health.svg)

```
[![Health](https://phpackages.com/badges/script-development-kendo-error-tracker/health.svg)](https://phpackages.com/packages/script-development-kendo-error-tracker)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3325.1M337](/packages/psalm-plugin-laravel)[laravel/scout

Laravel Scout provides a driver based solution to searching your Eloquent models.

1.7k53.0M578](/packages/laravel-scout)[laravel/horizon

Dashboard and code-driven configuration for Laravel queues.

4.1k91.3M277](/packages/laravel-horizon)[illuminate/auth

The Illuminate Auth package.

9327.9M1.2k](/packages/illuminate-auth)[illuminate/broadcasting

The Illuminate Broadcasting package.

7126.9M199](/packages/illuminate-broadcasting)[illuminate/notifications

The Illuminate Notifications package.

513.0M1.1k](/packages/illuminate-notifications)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
