Self-hosted · Laravel · Open source

Your own Nightwatch cloud.

Nightkeeper is a self-hosted implementation of Laravel Nightwatch's cloud dashboard. Keep the official nightwatch:agent exactly as it ships — just point it at a server you control instead of a hosted one.

Nightkeeper overview dashboard showing total activity, latency, job attempts, exceptions, and query charts for one environment

The overview dashboard for one environment — live request, query, job, and exception telemetry.

What is this?

Nightwatch's local agent streams request, query, exception, job, and command telemetry from your app to a hosted dashboard over a small HTTP contract — nothing about that contract is tied to Laravel's own servers. Nightkeeper re-implements just that half: it authenticates the agent, accepts its ingest batches, and renders the same categories of data your monitored app already produces. No telemetry leaves infrastructure you control, and there's no recurring bill for the privilege of seeing your own exceptions.

Features

Multi-tenant by design

Organizations → Applications → Environments. Each environment gets its own rotatable ingest token.

Full event coverage

Requests, queries, exceptions, commands, scheduled tasks, jobs, outgoing requests, cache, mail, and notifications — grouped and aggregated.

Request waterfalls

Every trace reconstructed span-by-span, from bootstrap through termination, for a single request or job.

Sentry-style issue tracking

Unhandled exceptions grouped by class, file, and line — occurrence counts, affected users, real stack traces with source context, open/close workflow.

Signed ingest auth

Short-lived HMAC-signed JWTs issued per environment. Rotate a token without touching any other environment.

Nothing exotic

Laravel, Inertia, React, Tailwind. Self-host it with a stack you're probably already running.

How it works

  1. 1

    The agent authenticates

    POST /api/agent-auth with the environment's ingest token returns a short-lived signed JWT.

  2. 2

    It streams telemetry

    Gzip'd JSON batches of request, query, exception, and job records are POSTed to /api/ingest.

  3. 3

    Nightkeeper indexes and shows it

    Events are grouped, aggregated, and rendered across the same dashboards a hosted product would give you.

Quick start

Run Nightkeeper itself:

composer install
cp .env.example .env
php artisan key:generate
php artisan migrate
php artisan serve

Dashboard is now at http://127.0.0.1:8000. Point a Nightwatch agent at it:

NIGHTWATCH_BASE_URL=http://127.0.0.1:8000
NIGHTWATCH_TOKEN=<your environment's ingest token>

Full setup, including production notes, lives in the README.