sahlowle / larawatch
A Laravel application monitoring package β requests, exceptions, jobs, health checks, cache, mail, and scheduled tasks.
Requires
- php: ^8.2
- dragonmantank/cron-expression: ^3.0
- illuminate/support: ^11.0|^12.0
- livewire/livewire: ^3.0
- spatie/laravel-package-tools: ^1.16
Requires (Dev)
- orchestra/testbench: ^9.0
- pestphp/pest: ^3.0
- pestphp/pest-plugin-laravel: ^3.0
README
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
/monitorto 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
π License
The MIT License (MIT). See LICENSE for details.
