What each check measures, when it trips, and how to add your own.
Every poll runs each enabled check and reports the worst result as the app's status: Healthy, Degraded or Unhealthy. Each check includes the thresholds it used. If a check fails to run, it reports Unhealthy with "Check threw an exception".
Use the check name to turn a check off.
Name: queue
database or database-uuids), which is Laravel's default.retry_after. Stale jobs are only measured on the database queue driver. On Redis, use the Horizon check.One failed job makes the app Unhealthy by default. If your app expects the odd failure, set LEDGE_QUEUE_FAILED_UNHEALTHY_AT higher, or use LEDGE_QUEUE_FAILED_DEGRADED_AT for an earlier, softer warning.
Name: scheduler
Degraded when no schedule:run has finished in the last 10 minutes. The package records each run itself, so there's no ping URL to set up. It reports Healthy until the first run is recorded.
Name: horizon
Only runs when Horizon is installed. Unhealthy when Horizon isn't running, Degraded when it's paused. It also reports supervisors, processes, wait times and recent failures for information.
Name: storage
Unhealthy when storage/logs, storage/framework/cache, storage/framework/views or bootstrap/cache is missing or not writable. storage/framework/sessions and storage/app are checked if they exist.
Name: disk
Percentage used on the volume that holds storage/. Degraded at 80%, Unhealthy at 90%. Set LEDGE_DISK_MIN_FREE_BYTES to also go Unhealthy below a fixed amount of free space.
Name: memory
How much of PHP's memory_limit the health request uses. Degraded at 75%, Unhealthy at 90%. Always Healthy when memory_limit is -1.
Names: database, cache, redis
Name: optimized
Degraded when config or routes aren't cached and APP_ENV is production. Run php artisan optimize as part of your deploy.
Name: debugMode
Degraded when APP_DEBUG is on, in any environment.
Name: environment
Compares your environment with .env.example. A key with a value in .env.example is treated as required, and Degraded is reported when it's missing. A key left blank in .env.example is optional. LEDGE_* keys are never reported.
This check also reports the PHP version, operating system and database server version you see in Ledge.
Name: phpVersion
| Phase | Default status |
|---|---|
| Active support | Healthy |
| Security fixes only | Degraded |
| End of life | Unhealthy |
PHP 8.3 moved to security fixes only at the end of 2025, so apps on 8.3 report Degraded.
Name: packages
Your installed packages compared with Packagist, refreshed daily by the scheduler. It lists outdated packages and the installed and latest Laravel version. Outdated packages are Healthy by default, so this check informs rather than alerts. Set LEDGE_UPDATE_AVAILABLE_STATUS to change that.
Name: failedLogins
Failed login attempts in the last 24 hours, from Laravel's Failed auth event. Degraded at 10, Unhealthy at 50. Counts are kept in the cache, so clearing the cache resets them.
Register a closure or a class in a service provider:
use LedgeHQ\Ledge\Checks\CheckResult;
use LedgeHQ\Ledge\Facades\Ledge;
public function boot(): void
{
Ledge::check('search', function (string $name) {
$lag = app(SearchIndex::class)->secondsBehind();
return $lag > 300
? CheckResult::degraded($name, ['lagSeconds' => $lag], 'Search index is behind')
: CheckResult::healthy($name, ['lagSeconds' => $lag]);
});
}CheckResult has healthy(), degraded() and unhealthy(). Each takes the check name, an array of data to show in Ledge, and an optional message.null to leave the check out of that poll.LedgeHQ\Ledge\Checks\CheckInterface and either call Ledge::register(new MyCheck()) or list the class under checks in config/ledge.php.Ledge::forget('failedLogins') removes a built-in check. Registering a check with an existing name replaces it.If you already use spatie/laravel-health, wrap its checks:
use LedgeHQ\Ledge\Checks\SpatieHealthCheck;
use Spatie\Health\Checks\Checks\UsedDiskSpaceCheck;
Ledge::register(SpatieHealthCheck::wrap(UsedDiskSpaceCheck::new()));Spatie's ok reports Healthy, warning Degraded, and failed or crashed Unhealthy. Skipped checks are left out. Ledge runs the check on every poll and ignores Spatie's own schedule.