PHPackages                             elvinaqalarov99/laravel-health-panel - 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. elvinaqalarov99/laravel-health-panel

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

elvinaqalarov99/laravel-health-panel
====================================

A config-driven status panel for Laravel apps built on top of spatie/laravel-health.

v1.2.0(1mo ago)1109↑116.5%MITBladePHP ^8.2

Since Apr 27Pushed 1mo agoCompare

[ Source](https://github.com/elvinaqalarov99/laravel-health-panel)[ Packagist](https://packagist.org/packages/elvinaqalarov99/laravel-health-panel)[ RSS](/packages/elvinaqalarov99-laravel-health-panel/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (4)Versions (6)Used By (0)

laravel-health-panel
====================

[](#laravel-health-panel)

[![Latest Version on Packagist](https://camo.githubusercontent.com/2fefcfcf5f8b2eedb39527f9f7f8e71c7030227c1c7344fc44e865014871d6b7/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f656c76696e6171616c61726f7639392f6c61726176656c2d6865616c74682d70616e656c2e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/elvinaqalarov99/laravel-health-panel)[![License](https://camo.githubusercontent.com/0c95fa40a9188dbc8047769df20e43064e35554efd8937c6669ce8b1413ba4b6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f656c76696e6171616c61726f7639392f2d6c61726176656c2d6865616c74682d70616e656c2e7376673f7374796c653d666c61742d737175617265)](LICENSE)

A beautiful, config-driven status panel for Laravel built on top of [spatie/laravel-health](https://spatie.be/docs/laravel-health/v1/introduction).

`spatie/laravel-health` does the heavy lifting — running checks, storing results, alerting. **laravel-health-panel** turns those results into a polished public status page with uptime history, incident timelines, and zero boilerplate.

---

What it gives you
-----------------

[](#what-it-gives-you)

**`/status`**Live status of every service group — Operational / Degraded / Down**`/status/history`**90-day uptime bars + incident timeline with noise reduction**Config-driven**Define services, checks, labels and feature flags in one file — no PHP class changes**Swappable**Bind your own service or repository via contracts**Publishable views**Override the default dark-mode Tailwind UI with your own Blade templates---

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

[](#requirements)

- PHP 8.2+
- Laravel 11 or 12
- [spatie/laravel-health](https://spatie.be/docs/laravel-health/v1/introduction) — health checks must already be set up

---

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

[](#installation)

```
composer require elvinaqalarov99/laravel-health-panel
```

Publish the config and migration:

```
php artisan vendor:publish --tag=status-page:config
php artisan vendor:publish --tag=status-page:migrations
php artisan migrate
```

Visit `/status` — you're live.

---

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

[](#configuration)

All behaviour is controlled from `config/status-page.php`.

### Defining services

[](#defining-services)

Map your Spatie health check names into logical service groups:

```
'services' => [

    'api' => [
        'label'         => 'API',
        'checks'        => ['Cache', 'Database', 'Redis', 'Queue'],
        'degraded_only' => false,   // failures here → system DOWN
        'enabled'       => true,
    ],

    'payment' => [
        'label'         => 'Payment Processing',
        'checks'        => ['stripe', 'spreedly'],
        'degraded_only' => true,    // failures here → system DEGRADED, not down
        'enabled'       => env('STATUS_PAGE_PAYMENT_ENABLED', true),
    ],

    'email' => [
        'label'         => 'Email Delivery',
        'checks'        => ['mailgun'],
        'degraded_only' => true,
        'enabled'       => env('STATUS_PAGE_EMAIL_ENABLED', true),
    ],

],
```

Set `enabled` to `false` (or wire it to an env var) to hide a service entirely — it disappears from the status page, uptime bars, and all history queries.

### Check labels

[](#check-labels)

Give individual check names a human-readable label shown on the panel:

```
'check_labels' => [
    'Cache'    => 'Redis Cache',
    'Database' => 'MySQL Database',
    'stripe'   => 'Stripe',
],
```

Any check not listed here falls back to a title-cased version of the name.

### Routes

[](#routes)

```
'routes' => [
    'enabled'    => true,
    'prefix'     => '',              // mount under /admin by setting 'admin'
    'middleware' => ['web'],
    'status'     => 'status',        // → /status
    'history'    => 'status/history', // → /status/history
],
```

Disable auto-registration entirely and define your own routes:

```
// config/status-page.php
'routes' => ['enabled' => false],
```

```
// routes/web.php
use Elvinaqalarov99\StatusPage\Http\Controllers\StatusPageController;

Route::middleware(['web', 'auth'])->group(function () {
    Route::get('/admin/status',         [StatusPageController::class, 'index'])->name('status-page.index');
    Route::get('/admin/status/history', [StatusPageController::class, 'history'])->name('status-page.history');
});
```

### History settings

[](#history-settings)

```
'incidents_per_page'         => 7,   // date-groups shown per history page
'incident_stability_minutes' => 15,  // gaps shorter than this merge into one incident
'history_retention_days'     => 90,  // days shown in the uptime bar
```

### Swapping the model

[](#swapping-the-model)

By default the panel reads from Spatie's `HealthCheckResultHistoryItem`. Swap it with any model that has the same columns:

```
'model' => \App\Models\MyHealthResult::class,
```

---

Customising the UI
------------------

[](#customising-the-ui)

Publish the default views:

```
php artisan vendor:publish --tag=status-page:views
```

Views land in `resources/views/vendor/status-page/`. Edit freely — the panel respects Laravel's standard view cascade so your versions always take precedence.

The default views use Tailwind CSS via CDN and require no build step.

---

Extending the service layer
---------------------------

[](#extending-the-service-layer)

Every component is bound through a contract, so you can swap any layer from your `AppServiceProvider`:

```
use Elvinaqalarov99\StatusPage\Contracts\StatusPageServiceContract;
use Elvinaqalarov99\StatusPage\Contracts\StatusPageRepositoryContract;

// Add a caching layer on top of the default service
$this->app->bind(StatusPageServiceContract::class, CachedStatusPageService::class);

// Use a different data source entirely
$this->app->bind(StatusPageRepositoryContract::class, MyStatusPageRepository::class);
```

---

How it works
------------

[](#how-it-works)

```
spatie/laravel-health
  └── runs checks every minute (via scheduler)
  └── stores results in health_check_result_history_items

laravel-health-panel
  └── StatusPageRepository   reads history with bounded queries (no OOM)
  └── StatusPageService      groups checks → services, detects incidents,
  │                          reduces noise, calculates uptime %
  └── StatusPageController   thin — calls service, returns view
  └── Views                  dark-mode Tailwind UI, fully publishable

```

Key performance decisions:

- **Latest status** uses `MAX(id) GROUP BY check_name` — two small queries instead of unbounded full-table scans
- **Uptime bars** are aggregated entirely in MySQL (`GROUP BY day, check_name`) — never loaded as Eloquent models
- **Incident history** selects only needed columns and caps rows at 100k
- A `(check_name, created_at)` composite index is included in the published migration

---

Changelog
---------

[](#changelog)

See [CHANGELOG.md](CHANGELOG.md).

License
-------

[](#license)

MIT — see [LICENSE](LICENSE).

###  Health Score

44

—

FairBetter than 90% of packages

Maintenance92

Actively maintained with recent releases

Popularity16

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

Every ~1 days

Total

5

Last Release

39d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/6c179413866673cc414bdbdb937a45296b291c74ec9e4be9969979fa0b53b4f0?d=identicon)[elvinaqalarov99](/maintainers/elvinaqalarov99)

---

Top Contributors

[![elvinaqalarov99](https://avatars.githubusercontent.com/u/64695589?v=4)](https://github.com/elvinaqalarov99 "elvinaqalarov99 (11 commits)")

---

Tags

spatielaravelmonitoringhealthpanelstatus page

###  Code Quality

TestsPest

### Embed Badge

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

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

###  Alternatives

[spatie/laravel-health

Monitor the health of a Laravel application

88011.3M149](/packages/spatie-laravel-health)[inspector-apm/inspector-laravel

Code Execution Monitoring, built for developers.

2362.1M4](/packages/inspector-apm-inspector-laravel)[encodia/laravel-health-env-vars

Custom check for Spatie's Laravel Health - Ensure every .env variable you need has been set

20160.2k](/packages/encodia-laravel-health-env-vars)

PHPackages © 2026

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