sahlowle/larawatch

A Laravel application monitoring package β€” requests, exceptions, jobs, health checks, cache, mail, and scheduled tasks.

Maintainers

Package info

github.com/sahlowle/larawatch

Language:Blade

pkg:composer/sahlowle/larawatch

Statistics

Installs: 26

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

1.0.0 2026-03-02 23:10 UTC

This package is auto-updated.

Last update: 2026-03-03 19:55:53 UTC


README

Latest Version on Packagist PHP Laravel Livewire License

A beautiful, self-hosted Laravel application monitoring dashboard

Track HTTP requests, exceptions, queue jobs, health checks, cache stats, mail, and scheduled tasks β€” all without any external service.

✨ Features

Module What it tracks
🌐 Requests Every HTTP request β€” method, path, status, duration, IP
πŸ’₯ Exceptions PHP exceptions grouped by hash, with full stack traces
βš™οΈ Queue Jobs Job processing, completion, and failures
❀️ Health Checks Database, Redis, Queue, Storage, Mail, Scheduler
πŸ—„οΈ Cache Hit rate, memory usage, key count (Redis)
πŸ“§ Mail Sent and failed emails with recipients and size
πŸ• Scheduled Tasks Task start, finish, skip, and failure events

πŸ“‹ Requirements

  • PHP 8.2+
  • Laravel 11.x / 12.x
  • Livewire 4.x

πŸš€ Installation

1. Install via Composer

composer require sahlowle/larawatch

2. Publish the config file

php artisan vendor:publish --tag="larawatch-config"

3. Run the migrations

php artisan migrate

4. Record exceptions

Add the following to your bootstrap/app.php:

->withExceptions(function (Exceptions $exceptions): void {
    $exceptions->reportable(function (\Throwable $e) {
        if (config('larawatch.enabled') && config('larawatch.features.exceptions', true)) {
            try {
                app(\Sahlowle\Larawatch\Services\ExceptionMonitorService::class)->record($e);
            } catch (\Throwable $ignored) {
                // Never let monitoring break the app
            }
        }
    });
})

βœ… That's it! Visit /monitor to see your dashboard.

βš™οΈ Configuration

After publishing, edit config/larawatch.php:

return [
    // Enable/disable the entire monitor
    'enabled' => env('MONITOR_ENABLED', true),

    // Dashboard theme: "dark" or "light"
    'theme' => env('MONITOR_THEME', 'light'),

    // URL prefix for the dashboard (default: /monitor)
    'path' => env('MONITOR_PATH', 'monitor'),

    // Restrict access by email or role
    'allowed_emails' => ['admin@example.com'],
    'allowed_roles'  => ['admin'],

    // Toggle individual modules
    'features' => [
        'requests'        => true,
        'exceptions'      => true,
        'jobs'            => true,
        'health'          => true,
        'cache'           => true,
        'mail'            => true,
        'scheduled_tasks' => true,
    ],

    // How long to keep data
    'data_retention' => [
        'requests'        => ['keep_hours' => 1],
        'exceptions'      => ['keep_days'  => 30],
        'jobs'            => ['keep_days'  => 7],
        'health_checks'   => ['keep_days'  => 7],
        'cache_stats'     => ['keep_days'  => 7],
        'mails'           => ['keep_days'  => 30],
        'scheduled_tasks' => ['keep_days'  => 14],
    ],
];

Environment Variables

Variable Default Description
MONITOR_ENABLED true Enable or disable the entire package
MONITOR_THEME light Dashboard theme (dark / light)
MONITOR_PATH monitor URL prefix for the dashboard
MONITOR_DB_CONNECTION null Separate DB connection for monitor tables
MONITOR_TABLE_PREFIX monitor_ Prefix for all monitor database tables

πŸ” Authorization

In local environments, all authenticated users can access the dashboard.

In other environments, access is controlled by allowed_emails and allowed_roles in the config. You can also override the viewMonitor gate entirely in your AppServiceProvider:

Gate::define('viewMonitor', function ($user) {
    return $user->is_admin;
});

πŸ—‘οΈ Pruning Old Data

The package provides the larawatch:prune command to clean up old records. Add it to your routes/console.php scheduler:

// Prune all types according to their configured retention
Schedule::command('larawatch:prune --force')->daily();

// Or prune a specific type
Schedule::command('larawatch:prune --type=requests --force')->hourly();

Available types: requests, exceptions, jobs, health_checks, cache_stats, mails, scheduled_tasks

πŸ—ΊοΈ Dashboard Routes

URL Description
/monitor Main dashboard
/monitor/requests HTTP request log
/monitor/exceptions Exception tracker
/monitor/jobs Queue job history
/monitor/health Health checks
/monitor/cache Cache & memory stats
/monitor/mail Mail monitor
/monitor/scheduled-tasks Scheduled task history
/monitor/api/chart-data JSON chart data endpoint

πŸ“¦ Publishing Assets

# Config only
php artisan vendor:publish --tag="larawatch-config"

# Migrations only
php artisan vendor:publish --tag="larawatch-migrations"

# Views (to customize the dashboard UI)
php artisan vendor:publish --tag="larawatch-views"

πŸ› οΈ Local Development

If you are working on this package inside a host Laravel app using a path repository:

// root composer.json
"repositories": [
    { "type": "path", "url": "./packages/sahlowle/larawatch" }
],
"require": {
    "sahlowle/larawatch": "*"
},
"minimum-stability": "dev",
"prefer-stable": true

Then run:

composer update sahlowle/larawatch

Screenshot

Larawatch Dashboard

πŸ“„ License

The MIT License (MIT). See LICENSE for details.