PHPackages                             kalimulhaq/pulse-cronwatch - 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. kalimulhaq/pulse-cronwatch

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

kalimulhaq/pulse-cronwatch
==========================

A Laravel Pulse card and recorder for monitoring scheduled commands (cron jobs): success/failure rate, last run, and duration trend over time.

v0.3.0(3w ago)085↑41.2%MITPHPPHP ^8.2|^8.3CI passing

Since May 18Pushed 2w agoCompare

[ Source](https://github.com/kalimulhaq/pulse-cronwatch)[ Packagist](https://packagist.org/packages/kalimulhaq/pulse-cronwatch)[ Docs](https://github.com/kalimulhaq/pulse-cronwatch)[ RSS](/packages/kalimulhaq-pulse-cronwatch/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (3)Dependencies (6)Versions (4)Used By (0)

Laravel Pulse Cronwatch
=======================

[](#laravel-pulse-cronwatch)

[![Latest Version on Packagist](https://camo.githubusercontent.com/eb9aab8d52d1726c76c0246c15541a49a250d23bd874efcd2f0de9dd4375501c/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6b616c696d756c6861712f70756c73652d63726f6e77617463682e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/kalimulhaq/pulse-cronwatch)[![Total Downloads](https://camo.githubusercontent.com/bc4415751f6e6de070ebfe732a8f87d5915073e15539ba4e5df9cbf186442c2f/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6b616c696d756c6861712f70756c73652d63726f6e77617463682e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/kalimulhaq/pulse-cronwatch)[![GitHub Stars](https://camo.githubusercontent.com/6fe01807631214347c9c789b7ac598279a16d81af9de3984077fae55efeed960/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6b616c696d756c6861712f70756c73652d63726f6e77617463683f7374796c653d666c61742d737175617265)](https://github.com/kalimulhaq/pulse-cronwatch/stargazers)[![CI](https://github.com/kalimulhaq/pulse-cronwatch/actions/workflows/main.yml/badge.svg?branch=main)](https://github.com/kalimulhaq/pulse-cronwatch/actions/workflows/main.yml)[![PHP](https://camo.githubusercontent.com/7ac3e91573de80ea0179a77a79fea4a293a4a496b6cc3fcd7088facb54411103/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f6b616c696d756c6861712f70756c73652d63726f6e77617463682e7376673f7374796c653d666c61742d737175617265266c6f676f3d706870266c6f676f436f6c6f723d7768697465)](https://packagist.org/packages/kalimulhaq/pulse-cronwatch)[![Laravel](https://camo.githubusercontent.com/3fdb19b1865a346e4840d08846d80e1669181e4c0706d3e9edea0ae2733d4dec/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d31312532422d4646324432303f7374796c653d666c61742d737175617265266c6f676f3d6c61726176656c266c6f676f436f6c6f723d7768697465)](https://laravel.com)[![License](https://camo.githubusercontent.com/b1a7796250d1c406bca5f47197d91f07bb2b33c19938383cd7cb6dd1a983aa87/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6b616c696d756c6861712f70756c73652d63726f6e77617463683f7374796c653d666c61742d737175617265)](LICENSE.md)

**Laravel Pulse Cronwatch** is a [Laravel Pulse](https://pulse.laravel.com) card that monitors your scheduled commands (cron jobs) — every command from your scheduler, when it last ran, how often it succeeds vs fails, and when it's next due.

The card lists every task your scheduler knows about — even ones that have never fired yet — and joins them with a live record of every run captured from Laravel's scheduler events.

**Capabilities at a glance:**

ColumnWhat it shows`Command`The scheduler's display signature, normalised to the clean artisan name (closures and `->name(…)` labels are preserved as-is); hover shows the full shell-wrapped form`Cron`The cron expression from the live schedule, e.g. `0 1 * * *``Next due`Human-readable countdown to the next run, hover for absolute timestamp`Last run`Time-ago of the most recent terminal event, or `Never``Avg`Average successful run duration with adaptive unit (`ms` / `s` / `m` / `h`); raw `ms` in the cell tooltip`Success`Count of successful runs in the period`Failed`Count of failed runs in the period (highlighted red when &gt; 0)`Skipped`Count of runs the scheduler skipped (overlap protection, `when()` callbacks, etc.)**Requires:** PHP 8.2+ · Laravel 11+ · Laravel Pulse 1.4+ · Livewire 3+

---

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

[](#installation)

```
composer require kalimulhaq/pulse-cronwatch
```

The service provider is auto-discovered by Laravel.

### Register the recorder

[](#register-the-recorder)

Add the recorder class to your `config/pulse.php` under `recorders`:

```
'recorders' => [
    \Kalimulhaq\PulseCronwatch\Recorders\Schedule::class => [],

    // …your existing Pulse recorders…
],
```

There are no per-recorder options at this time — the empty `[]` is intentional.

### Add the card to your Pulse dashboard

[](#add-the-card-to-your-pulse-dashboard)

If you haven't already, publish Pulse's dashboard view:

```
php artisan vendor:publish --tag=pulse-dashboard
```

Then add the card to `resources/views/vendor/pulse/dashboard.blade.php` wherever it fits in your grid:

```

```

The `cols` attribute accepts any Pulse column value (`1`–`12` or `full`). `rows` is supported the same way other Pulse cards expose it. Pulse's period selector (1h / 6h / 24h / 7d) applies to the card automatically.

---

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

[](#configuration)

There is no published config file for v0.x — the package uses defaults from Pulse and Laravel directly. The card's only stateful option is the active sort, which is stored in the URL via Livewire:

URL parameterValuesDefault`cronwatch-order-by``next_due`, `failed`, `success`, `avg_duration`, `last_run``next_due`---

Quick start
-----------

[](#quick-start)

Once installed and registered, the card needs no further setup. To see it populate quickly:

```
# List what Laravel knows about (sanity check)
php artisan schedule:list

# Run the scheduler in the foreground for a minute or two
php artisan schedule:work
```

After at least one task fires, refresh `/pulse` — that task's row updates with its success/failed/skipped counts, last-run timestamp, and duration. All other scheduled tasks already appear in the table with cron + next due even if they haven't run yet.

---

Pulse Card Display
------------------

[](#pulse-card-display)

```
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│  ⏱  Scheduled Commands                                              Sort by: next due  ▼  past hour │
├──────────────────────────────────────┬───────────┬───────────┬───────────┬───────┬─────┬──────┬──────┤
│ Command                              │ Cron      │ Next due  │ Last run  │ Avg   │ ✓   │  ✗   │  ⊘   │
├──────────────────────────────────────┼───────────┼───────────┼───────────┼───────┼─────┼──────┼──────┤
│ app:hourly-sync                      │ 0 * * * * │ in 23 min │ 37 min ago│ 412ms │ 124 │  0   │  2   │
│ app:sync-properties                  │ 0 2 * * * │ in 14 hr  │ 14h ago   │ 1.4s  │  7  │  1   │  0   │
│ app:migrate-developers               │ 30 1 * * *│ in 13 hr  │ Never     │  —    │  0  │  0   │  0   │
│ app:weekly-report                    │ 0 0 * * 1 │ in 6 days │ 2 wks ago │ 5.1s  │  4  │  0   │  0   │
└──────────────────────────────────────┴───────────┴───────────┴───────────┴───────┴─────┴──────┴──────┘

```

Sorting is configurable via the dropdown — defaults to **next due** (soonest first). Each row's hover state reveals the absolute timestamp behind the relative time strings.

---

Data Collection
---------------

[](#data-collection)

```
┌──────────────────────────────────────────────────────────────────────────────┐
│  System cron fires every minute:                                             │
│  * * * * * cd /your/app && php artisan schedule:run >> /dev/null 2>&1        │
└──────────────────────────────────────────────────────────────────────────────┘
                                  │
                                  ▼
┌──────────────────────────────────────────────────────────────────────────────┐
│  Laravel's scheduler inspects routes/console.php (or Kernel.php),            │
│  runs the due tasks, and dispatches three lifecycle events per task:         │
│   - Illuminate\Console\Events\ScheduledTaskFinished  (success + runtime)     │
│   - Illuminate\Console\Events\ScheduledTaskFailed                            │
│   - Illuminate\Console\Events\ScheduledTaskSkipped                           │
└──────────────────────────────────────────────────────────────────────────────┘
                                  │
                                  ▼
┌──────────────────────────────────────────────────────────────────────────────┐
│  This package's recorder catches each event and writes to Pulse storage:     │
│   - pulse_entries    ← one row per terminal event (count + duration)         │
│   - pulse_aggregates ← bucketed per-period counts/max/avg                    │
│   - pulse_values     ← latest `schedule_last_run` per command                │
└──────────────────────────────────────────────────────────────────────────────┘
                                  │
                                  ▼
┌──────────────────────────────────────────────────────────────────────────────┐
│  When the dashboard loads, the Livewire card OUTER-JOINS:                    │
│    • Laravel's live Schedule registry  → cron + next due + full task list   │
│    • Pulse storage rows                → counts + last run + duration        │
│  Tasks scheduled but not yet fired show with `Never` + 0 counts.             │
│  Tasks no longer scheduled (removed from console.php) still appear with      │
│  their historical run data; cron + next due render as `—`.                   │
└──────────────────────────────────────────────────────────────────────────────┘

```

**Important:** the recorder only records what actually runs. If your system cron isn't firing `php artisan schedule:run` every minute (or `php artisan schedule:work` in dev), the card will show "Never" for everything except commands you trigger manually. Verify with `php artisan schedule:list` to confirm Laravel sees your scheduled tasks.

---

Caveats
-------

[](#caveats)

- **Closure-scheduled tasks without `->name('…')` collide.** Two closures both default to the same `"Closure"` display signature, so they merge into one row in the card. Use `->name('stable-name')` on each scheduled closure to keep them separate.
- **Command rename = new row.** The card's join key is the scheduler's display signature. If you rename an artisan command or change its arguments, the new signature is treated as a different row; the old signature keeps its history.
- **Pulse storage trimming applies.** Pulse auto-trims old entries per `pulse.storage.trim.keep` (default 7 days). Cronwatch rows follow the same retention; historical data older than the trim window won't appear.
- **Cron / Next due require live schedule access.** The card reads `app(Illuminate\Console\Scheduling\Schedule::class)->events()` at render time. Web requests don't auto-bootstrap that registry, so the card resolves the Console Kernel for you — if you've heavily customised kernel bootstrapping, ensure `App\Console\Kernel::schedule()` (or `routes/console.php`) remains discoverable.

---

Changelog
---------

[](#changelog)

Please see [CHANGELOG](CHANGELOG.md) for recent changes.

Contributing
------------

[](#contributing)

Please see [CONTRIBUTING](CONTRIBUTING.md) for details.

Security
--------

[](#security)

If you discover a security issue please email  rather than using the public issue tracker.

Credits
-------

[](#credits)

- [Kalim ul Haq](https://github.com/kalimulhaq)
- [All Contributors](../../contributors)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

Support
-------

[](#support)

If you find this package useful, consider supporting me on Ko-fi!

[![Support me on Ko-fi](https://camo.githubusercontent.com/201ef269611db7eb6b5d08e9f756ab8980df3014b64492770bdf13a6ed924641/68747470733a2f2f6b6f2d66692e636f6d2f696d672f676974687562627574746f6e5f736d2e737667)](https://ko-fi.com/kalimulhaq)

###  Health Score

41

—

FairBetter than 87% of packages

Maintenance96

Actively maintained with recent releases

Popularity13

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity40

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 ~0 days

Total

3

Last Release

21d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/6983682?v=4)[Kalim ul Haq](/maintainers/kalimulhaq)[@kalimulhaq](https://github.com/kalimulhaq)

---

Top Contributors

[![kalimulhaq](https://avatars.githubusercontent.com/u/6983682?v=4)](https://github.com/kalimulhaq "kalimulhaq (7 commits)")

---

Tags

schedulerlaravelmonitoringcronpulselaravel-pulsescheduled-taskskalimulhaq

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/kalimulhaq-pulse-cronwatch/health.svg)

```
[![Health](https://phpackages.com/badges/kalimulhaq-pulse-cronwatch/health.svg)](https://phpackages.com/packages/kalimulhaq-pulse-cronwatch)
```

###  Alternatives

[spatie/laravel-health

Monitor the health of a Laravel application

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

TallStackUI is a powerful suite of Blade components that elevate your workflow of Livewire applications.

719160.4k12](/packages/tallstackui-tallstackui)[laravel/ai

The official AI SDK for Laravel.

9782.1M153](/packages/laravel-ai)[inspector-apm/inspector-laravel

Code Execution Monitoring, built for developers.

2362.1M4](/packages/inspector-apm-inspector-laravel)[tomshaw/electricgrid

A feature-rich Livewire package designed for projects that require dynamic, interactive data tables.

119.2k](/packages/tomshaw-electricgrid)

PHPackages © 2026

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