Boogle.

Catch every exception before your users do.

Self-hosted exception tracker and uptime monitor for Laravel apps. Real-time ingestion, issue codes, digests, and outage alerts — on your own infrastructure.

Features

Everything you need to monitor exceptions and uptime — without SaaS billing or vendor lock-in.

Exception ingestion
POST /api/log accepts the full client exception payload — HTTP context, user, stack — persisted as raw_exception with mapped columns.
Issue codes
Auto-assigned codes like #BUG42 or #OUT3 from group prefixes, with outages always mapped to OUT.
Panel & workflow
Projects, groups, users, 2FA, API tokens, status transitions, bulk actions, and optional public shares at /e/{hash}.
Uptime monitoring
Per-project pings, ProjectOfflineException on failure, auto-recovery to DONE, and email alerts for outage and restore.
Digests & pruning
Scheduled exception digests every minute; exceptions pruned after 24 months; uptime history kept for 30 days.
Admin REST API
Sanctum-protected CRUD for projects, groups, and exceptions. OpenAPI UI at /api/docs.
Privacy toggles
Hide HTTP headers or session data in the panel via config/boogle.php / .env.
Client package
andreapollastri/boogle-client wires Laravel 9–13 apps to your Boogle instance in a few lines.

Install

PHP 8.3+, Composer, and Node. Any SQL database Laravel supports.

git clone https://github.com/andreapollastri/boogle.git
cd boogle
composer run setup

The setup script installs Composer deps, creates .env, generates the app key, migrates, installs npm packages, and builds assets.

Manual install

composer install
cp .env.example .env
php artisan key:generate
php artisan migrate --force
npm install --ignore-scripts
npm run build

Quick start

From zero to a running panel in three steps.

01

Install & run

Clone the repo, run composer run setup, then start the stack with composer run dev.

02

Sign in

Default seeder admin: admin@users.test / password. The app root redirects to login.

03

Create a project

Add a project, open Installation for key + token, then wire a client app (next section).

Local stack

composer run dev

Starts the web server, queue listener, log tail, and Vite. For scheduler locally, also run php artisan schedule:work.

Client apps

Send exceptions from another Laravel application into this Boogle instance.

composer require andreapollastri/boogle-client
php artisan boogle:install

Set env vars from the project Installation page:

BOOGLE_KEY=<project_api_token>
BOOGLE_PROJECT_KEY=<project_key>
BOOGLE_SERVER=https://your-boogle-host.example/api/log

Laravel 11+

In bootstrap/app.php:

->withExceptions(function (Exceptions $exceptions) {
    Boogle::registerExceptionHandler($exceptions);
})

Laravel 9 / 10

In app/Exceptions/Handler.php register():

$this->reportable(function (Throwable $e) {
    Boogle::handle($e);
});
Laravel Where
11+ bootstrap/app.phpwithExceptions
9 / 10 Handler::register()reportable

Verify with:

php artisan boogle:test
Payload: the client posts key + token + full exception object. Boogle stores it in raw_exception and maps http / user for the panel.

Uptime

Each project can ping a URL and open an outage issue when it fails.

  • uptime_enabled — turn monitoring on or off
  • uptime_url — optional; falls back to the project url

On failure Boogle records a ProjectOfflineException and emails. When the service returns, the issue moves to DONE and a recovery mail is sent. The project chart shows the last 30 days.

php artisan projects:check-uptime

Admin API

Base path /api/admin. Auth: Bearer <sanctum-token> from an admin user.

  • Projects — list / create / show / update / delete
  • Groups — list / create / show / update / delete
  • Exceptions — global list, by project, show, update status
  • IngestionPOST /api/log (project key + token, no admin bearer)

Interactive docs: /api/docs. Spec file: public/openapi.json (API v1.3.0).

Create tokens from the panel profile page.

Scheduler

One cron entry drives digests, uptime checks, and pruning.

* * * * * cd /path-to-boogle && php artisan schedule:run >> /dev/null 2>&1
Command Schedule Purpose
exceptions:send-digests Every minute Email digests for open issues
projects:check-uptime Every minute Ping project URLs / outage issues
exceptions:prune-old Daily 02:30 Delete exceptions older than 24 months

Production

Deploy without surprises. Cache config, keep the queue and scheduler running.

php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan queue:work --sleep=3 --tries=3 --timeout=120
Variable Notes
APP_URL Public HTTPS URL of this Boogle instance
APP_ENV / APP_DEBUG production / false
MAIL_* Required for digests and uptime alerts
QUEUE_CONNECTION Use database, Redis, or similar — keep a worker online
BOOGLE_UI_SHOW_HTTP_HEADERS Optional panel privacy (default true)
BOOGLE_UI_SHOW_HTTP_SESSION Optional panel privacy (default true)
Queue: notifications and digests go through the queue. Use Supervisor or systemd so queue:work restarts automatically. See the GitHub README for sample unit files.

Deploy with Cipi

Run Boogle on any Ubuntu VPS with cipi.sh — PHP-FPM, MariaDB, Nginx, Let's Encrypt, zero-downtime releases, and queue workers.

Explore cipi.sh →