PHPackages                             pagerlite/laravel - 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. pagerlite/laravel

ActiveLibrary

pagerlite/laravel
=================

A dead-simple, self-hosted on-call and paging system for Laravel.

v1.0.0(today)30MITPHPPHP ^8.4.0CI passing

Since Jul 23Pushed todayCompare

[ Source](https://github.com/Pagerlite/laravel)[ Packagist](https://packagist.org/packages/pagerlite/laravel)[ Docs](https://github.com/Pagerlite/laravel)[ RSS](/packages/pagerlite-laravel/feed)WikiDiscussions main Synced today

READMEChangelog (1)Dependencies (10)Versions (2)Used By (0)

PagerLite
=========

[](#pagerlite)

[![Latest Version on Packagist](https://camo.githubusercontent.com/195f45d50bd09eb343415c200189e430613713e6126cbefe1ac2a317a632ecdb/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f70616765726c6974652f6c61726176656c2e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/pagerlite/laravel)[![Tests](https://camo.githubusercontent.com/f7efe513d15363a11b15faf736fdceb9e750afc93ccfefd0d1e8f06e4991a88a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f50616765726c6974652f6c61726176656c2f74657374732e796d6c3f6272616e63683d6d61696e266c6162656c3d7465737473267374796c653d666c61742d737175617265)](https://github.com/Pagerlite/laravel/actions/workflows/tests.yml)[![Code Style](https://camo.githubusercontent.com/0b6f438b6f9c31e6d6e02a14c3cea35bb8bd6192aa3ed120cc9ac653d7102408/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f50616765726c6974652f6c61726176656c2f666f726d6174732e796d6c3f6272616e63683d6d61696e266c6162656c3d636f64652532307374796c65267374796c653d666c61742d737175617265)](https://github.com/Pagerlite/laravel/actions/workflows/formats.yml)[![Total Downloads](https://camo.githubusercontent.com/b13381cac548e078b18e70467fd4d07596559e0ff0e06a86020a9cffa06f61b3/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f70616765726c6974652f6c61726176656c2e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/pagerlite/laravel)[![PHP Version](https://camo.githubusercontent.com/60029e7e03ef224c68c2920e158a1e4c383149055484ed9770540d3c8b280309/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f646570656e64656e63792d762f70616765726c6974652f6c61726176656c2f7068702e7376673f7374796c653d666c61742d737175617265)](composer.json)[![License](https://camo.githubusercontent.com/b28b4ebd62d9415a18c7c3e176bd32a6563c8b38cbc28cf7012ef1ccbce34f8c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f50616765726c6974652f6c61726176656c2e7376673f7374796c653d666c61742d737175617265)](LICENSE.md)

A dead-simple, self-hosted on-call and paging system for Laravel — in the spirit of Horizon and Telescope. Install the package, visit `/pagerlite`, add your team, and drag someone onto the calendar: when an incident comes in, PagerLite notifies whoever is on call and escalates until somebody acknowledges. Everything lives in your own database; no data ever leaves your app.

[![The PagerLite dashboard](docs/screenshot.png)](docs/screenshot.png)

Features
--------

[](#features)

- **Incident ingestion** — a single `POST` endpoint any monitoring tool can hit, plus a `PagerLite::notify()` facade for reporting incidents from your own code.
- **On-call schedule** — a drag-and-drop, day-based calendar. Drag a member onto a day, stretch the shift across as many days as you like. One person on call at a time.
- **Team management** — add and remove members without losing history: removing someone frees up their shifts from today onward, and restoring them brings back only their past shifts, outside the escalation chain until you place them again.
- **Escalation chain** — if the on-call member doesn't acknowledge within the timeout, the next member in the chain is paged, and so on until someone responds. Reorder the chain from the dashboard.
- **Acknowledge &amp; resolve** — straight from the dashboard (with a confirmation step), plus a full per-incident timeline: who was paged, when it escalated, who acknowledged and resolved it.
- **Member insights** — every member has a page with their on-call history, days on call per month, and the incidents they were paged for.
- **Embeddable calendar** — share a read-only view of the schedule via a secret link, ready to iframe into a wiki or status page.
- **Live updates** — the dashboard, incident list, incident detail, and embedded calendar all poll in the background, so status changes and new incidents show up without a manual refresh.
- **Email notifications** — sent through your app's existing mail configuration. No third-party services.

Requirements
------------

[](#requirements)

- PHP 8.4+
- Laravel 12
- A real queue driver (`database`, `redis`, etc.) — escalation relies on delayed jobs firing on schedule, which the `sync` driver does not honor.

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

[](#installation)

Require the package with Composer:

```
composer require pagerlite/laravel
```

Then run the install command:

```
php artisan pagerlite:install
```

It publishes the configuration and the pre-built dashboard assets, and offers to run the migrations (four `pagerlite_`-prefixed tables). Then:

1. Set a token in `.env` so external tools can report incidents:

    ```
    PAGERLITE_TOKEN=your-long-random-secret
    ```
2. Run a queue worker — escalation is driven by delayed queue jobs:

    ```
    php artisan queue:work
    ```
3. Visit `/pagerlite`, add members, order the escalation chain, and put someone on call.

Dashboard authorization
-----------------------

[](#dashboard-authorization)

Out of the box the dashboard is only accessible in the `local` environment. To open it up in other environments, register an authorization callback — typically in a service provider's `boot` method:

```
use Pagerlite\Laravel\PagerLite;

PagerLite::auth(function ($request) {
    return $request->user()?->isAdmin() ?? false;
});
```

Acknowledge and resolve actions are attributed to your app's authenticated user.

Reporting incidents
-------------------

[](#reporting-incidents)

### From anywhere, over HTTP

[](#from-anywhere-over-http)

```
curl -X POST https://your-app.test/pagerlite/api/events \
  -H "Authorization: Bearer $PAGERLITE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title": "Server down", "message": "CPU at 100%", "service": "api"}'
```

`title` is required; `message` and `service` are optional. The endpoint responds `201` with the incident's `id` and `status`. For tools that can't set headers, the token may be passed in the URL instead: `POST /pagerlite/api/events/{token}`.

Every request creates a new incident — PagerLite does not deduplicate, so point your monitoring's *state change* hook at it, not its every-minute check.

### From your own code

[](#from-your-own-code)

```
use Pagerlite\Laravel\PagerLite;

PagerLite::notify('Nightly backup failed', 'Disk full on backup volume', 'backups');
```

How paging works
----------------

[](#how-paging-works)

1. An incident is recorded, and the current on-call member (from the schedule) is notified.
2. If nobody is on call, the escalation chain is paged from the top instead.
3. If the incident isn't acknowledged within the escalation timeout (5 minutes by default), the next member of the escalation chain is notified — skipping whoever is already on call — until the chain is exhausted.
4. Acknowledging the incident from the dashboard stops the escalation.

The schedule operates on UTC days: shifts hand over at midnight UTC, and every member sees the same calendar regardless of their timezone.

Embedding the calendar
----------------------

[](#embedding-the-calendar)

Set a secret in `.env`:

```
PAGERLITE_EMBED_TOKEN=another-long-random-secret
```

The read-only calendar is then available — without logging in — at:

```
https://your-app.test/pagerlite/embed/calendar/{token}

```

Drop it into an iframe on a wiki or status page:

```

```

Anyone with the link can see who is on call (names and schedule only — no incidents, no editing). Leave `PAGERLITE_EMBED_TOKEN` unset and the embed URL does not exist.

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

[](#configuration)

The published `config/pagerlite.php` covers everything; each option also has an environment variable:

VariableDefaultPurpose`PAGERLITE_PATH``pagerlite`URI path where the dashboard is served.`PAGERLITE_TOKEN`—Bearer token required by the events endpoint.`PAGERLITE_EMBED_TOKEN`—Secret enabling the public read-only calendar. Unset = disabled.`PAGERLITE_ESCALATION_TIMEOUT``300`Seconds to wait for an acknowledgement before escalating.`PAGERLITE_USER_MODEL``App\Models\User`Host-app user model that acknowledge/resolve actions are attributed to.Upgrading
---------

[](#upgrading)

After updating the package, re-publish the dashboard assets:

```
php artisan vendor:publish --tag=pagerlite-assets --force
```

(or simply re-run `php artisan pagerlite:install`).

TODO
----

[](#todo)

- Add more notification channels
    - SMS
    - Discord
    - Slack
    - Telegram
    - Webhook
- Mobile app
- Unified phone number that routes to whoever is on call

License
-------

[](#license)

PagerLite is open-source software licensed under the [MIT license](LICENSE.md).

###  Health Score

42

—

FairBetter than 88% of packages

Maintenance100

Actively maintained with recent releases

Popularity4

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity50

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% 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

0d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/36804104?v=4)[Rachid Laasri](/maintainers/rashidlaasri)[@rashidlaasri](https://github.com/rashidlaasri)

---

Top Contributors

[![rashidlaasri](https://avatars.githubusercontent.com/u/36804104?v=4)](https://github.com/rashidlaasri "rashidlaasri (18 commits)")

---

Tags

incident-managementlaravelon-callpagerlitephplaravelpagerpagerlite

###  Code Quality

TestsPest

Static AnalysisPHPStan, Rector

Code StyleLaravel Pint

Type Coverage Yes

### Embed Badge

![Health badge](/badges/pagerlite-laravel/health.svg)

```
[![Health](https://phpackages.com/badges/pagerlite-laravel/health.svg)](https://phpackages.com/packages/pagerlite-laravel)
```

###  Alternatives

[statamic/cms

The Statamic CMS Core Package

4.8k3.6M1.0k](/packages/statamic-cms)[code16/sharp

Laravel Content Management Framework

79164.7k9](/packages/code16-sharp)[nunomaduro/laravel-starter-kit-inertia-react

The skeleton application for the Laravel framework.

2071.1k](/packages/nunomaduro-laravel-starter-kit-inertia-react)[api-platform/laravel

API Platform support for Laravel

58174.6k17](/packages/api-platform-laravel)

PHPackages © 2026

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