PHPackages                             petersowah/heimdall - 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. [Utility &amp; Helpers](/categories/utility)
4. /
5. petersowah/heimdall

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

petersowah/heimdall
===================

Domain monitoring dashboard for Laravel — SSL, uptime, DNS, and WHOIS checks with multi-channel alerts.

027[2 PRs](https://github.com/petersowah/heimdall/pulls)PHPCI passing

Since May 26Pushed 1mo agoCompare

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

READMEChangelogDependenciesVersions (3)Used By (0)

Heimdall
========

[](#heimdall)

[![Latest Version on Packagist](https://camo.githubusercontent.com/28829d92ee1c23ee02da5cf80549e2c692ed8f26fc500ccc217e3165604fbf0c/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f7065746572736f7761682f6865696d64616c6c2e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/petersowah/heimdall)[![Tests](https://camo.githubusercontent.com/9b76153898a6f76419c0581bef8cf70b222c6f29ce69d6bc98f688450c25a33c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f7065746572736f7761682f6865696d64616c6c2f72756e2d74657374732e796d6c3f6272616e63683d6d61696e266c6162656c3d7465737473267374796c653d666c61742d737175617265)](https://github.com/petersowah/heimdall/actions/workflows/run-tests.yml)[![Total Downloads](https://camo.githubusercontent.com/55ef051ef2e9cafa0666df79190037f348d9a844e283eda0542b36d0c17daa47/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f7065746572736f7761682f6865696d64616c6c2e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/petersowah/heimdall)

Domain monitoring dashboard for Laravel. Tracks SSL expiry, uptime, DNS changes, and WHOIS data — with alerts via email, Slack, and Telegram.

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

[](#requirements)

- PHP ^8.3
- Laravel 11, 12, or 13

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

[](#installation)

```
composer require petersowah/heimdall
```

Publish the config:

```
php artisan vendor:publish --tag=heimdall-config
```

Run the migrations:

```
php artisan migrate
```

Optionally publish frontend assets:

```
php artisan vendor:publish --tag=heimdall-assets
```

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

[](#configuration)

`config/heimdall.php`:

```
return [
    'path' => env('HEIMDALL_PATH', 'heimdall'),   // Dashboard URL path
    'middleware' => ['web', 'auth'],               // Applied to all routes
    'domain' => null,                             // Subdomain, if any
    'alert_emails' => env('HEIMDALL_ALERT_EMAILS', ''), // Comma-separated emails
];
```

Add to `.env`:

```
HEIMDALL_PATH=heimdall
HEIMDALL_ALERT_EMAILS=you@example.com,ops@example.com
```

Authorization
-------------

[](#authorization)

By default, Heimdall is only accessible in the `local` environment. To control access in production, define an authorization callback — typically in `AppServiceProvider::boot()`:

```
use PeterSowah\Heimdall\Heimdall;

Heimdall::auth(function ($user) {
    return in_array($user->email, [
        'admin@example.com',
        'ops@example.com',
    ]);
});
```

The callback receives the authenticated user and should return `true` or `false`. The underlying gate is `viewHeimdall`, so you can also define it directly:

```
Gate::define('viewHeimdall', function ($user) {
    return $user->hasRole('admin');
});
```

Dashboard
---------

[](#dashboard)

Visit `/heimdall` (or your configured path) after installation. The dashboard is protected by the middleware stack defined in config — `auth` by default — plus the `viewHeimdall` gate.

What gets monitored
-------------------

[](#what-gets-monitored)

CheckWhat it does**SSL**Checks certificate validity and days until expiry. Status: `ok` &gt; 30 days, `warning` ≤ 30 days, `critical` ≤ 7 days**Uptime**HTTP reachability check**DNS**Detects changes in DNS records**WHOIS**Tracks domain registration and expiryNotifications
-------------

[](#notifications)

Supports three alert channels. Configure via the dashboard's notification settings UI or directly via the `heimdall_notification_settings` table.

- **Email** — set `HEIMDALL_ALERT_EMAILS` in `.env`
- **Slack** — provide an incoming webhook URL
- **Telegram** — provide a bot token and chat ID

Per-domain notification toggles: `notify_ssl`, `notify_domain_expiry`, `notify_uptime`, `notify_dns`.

API Routes
----------

[](#api-routes)

All routes are prefixed with `/{path}/api` and named under `heimdall.api.*`.

```
GET    /heimdall/api/dashboard
GET    /heimdall/api/domains
POST   /heimdall/api/domains
GET    /heimdall/api/domains/{domain}
PUT    /heimdall/api/domains/{domain}
DELETE /heimdall/api/domains/{domain}
POST   /heimdall/api/domains/{domain}/check          # trigger manual check
GET    /heimdall/api/domains/{domain}/checks
GET    /heimdall/api/domains/{domain}/incidents
GET    /heimdall/api/notification-settings
PUT    /heimdall/api/notification-settings
POST   /heimdall/api/notification-settings/test/slack
POST   /heimdall/api/notification-settings/test/telegram

```

Database Tables
---------------

[](#database-tables)

TablePurpose`heimdall_domains`Tracked domains`heimdall_checks`Check results per domain per type`heimdall_incidents`Incidents opened/closed per domain`heimdall_notification_settings`Per-user notification config`heimdall_alert_logs`History of sent alertsTesting
-------

[](#testing)

```
composer test
```

Changelog
---------

[](#changelog)

See [CHANGELOG](CHANGELOG.md) for recent changes.

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

[](#contributing)

PRs welcome. Open an issue first for large changes.

Security
--------

[](#security)

Report vulnerabilities via [GitHub Security Advisories](../../security/advisories/new).

License
-------

[](#license)

MIT — see [LICENSE](LICENSE.md).

###  Health Score

23

—

LowBetter than 25% of packages

Maintenance61

Regular maintenance activity

Popularity9

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity15

Early-stage or recently created project

 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.

### Community

Maintainers

![](https://www.gravatar.com/avatar/33dae31a3741ab0144f7e5a537334beea594b6b1989e26124446b47b6d43397a?d=identicon)[petersowah](/maintainers/petersowah)

---

Top Contributors

[![petersowah](https://avatars.githubusercontent.com/u/6297425?v=4)](https://github.com/petersowah "petersowah (10 commits)")

### Embed Badge

![Health badge](/badges/petersowah-heimdall/health.svg)

```
[![Health](https://phpackages.com/badges/petersowah-heimdall/health.svg)](https://phpackages.com/packages/petersowah-heimdall)
```

###  Alternatives

[php-telegram-bot/inline-keyboard-pagination

PHP Telegram Bot InlineKeyboard Pagination

299.8k1](/packages/php-telegram-bot-inline-keyboard-pagination)

PHPackages © 2026

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