laraowl/laraowl
Open on GitHub →
Why LaraOwl?
LaraOwl is a open-source, self-hosted monitoring platform built specifically for Laravel applications. Unlike SaaS alternatives, you deploy it on your own infrastructure — your data never leaves your servers.
Drop in a single Composer package on any Laravel app, point it at your LaraOwl server, and instantly get real-time dashboards for requests, exceptions, queries, jobs, and more.
Screenshots
Features
Full-Stack Observability
| Category | What's Tracked |
|---|---|
| Requests | Every HTTP request — method, path, status code, duration, middleware timing, response size |
| Exceptions | Automatic grouping, stack traces, occurrence count, first/last seen, resolution status |
| Database Queries | Slow query detection, N+1 identification, execution time, connection info |
| Jobs & Queues | Job processing status, duration, failures, retry tracking |
| Commands | Artisan command execution, exit codes, runtime duration |
| Scheduled Tasks | Cron health, execution history, failure alerts |
| Cache Events | Hit/miss ratios, key-level analytics |
| Mail & Notifications | Outbound mail tracking, notification channel analytics |
| Outgoing Requests | HTTP client calls to external APIs — host, status, latency |
| Logs | Centralized application log aggregation with search |
Real-Time Dashboard
- Live updates via WebSockets (Laravel Reverb) — no page refresh needed
- Interactive charts with time-series breakdowns (Recharts)
- Flexible time filters — 1h, 24h, 7d, 14d, 30d, or custom date ranges
- Per-page pagination that preserves active filters
User Tracking
- Authenticated vs. guest request breakdown
- Per-user request volume, error rates, and last-seen timestamps
- User activity drill-down with full request history
Uptime Monitoring
- Automatic health checks every 30 seconds
- Status code tracking with response time history
- Instant alerts when your site goes down
Heartbeat Monitoring
- Cron job and scheduled task health verification
- Configurable check-in intervals
- Alerts when a heartbeat stops reporting
Security & Threat Detection
- Built-in WAF analysis — detects SQL injection, XSS, path traversal, command injection, LFI/RFI
- Risk scoring engine with configurable thresholds (Medium / High / Critical)
- IP-based threat tracking with automatic pattern recognition
- Security audit dashboard with threat timeline
Cloudflare Integration
- Direct Cloudflare API connection for WAF management
- Firewall rule CRUD from the dashboard
- Traffic analytics and audit log visualization
- One-click IP blocking
Alerting & Integrations
Send alerts to the channels your team already uses:
| Channel | Supported |
|---|---|
| Slack | ✅ Rich block messages with action buttons |
| Discord | ✅ Embedded messages with fields |
| Telegram | ✅ Markdown-formatted bot messages |
| ✅ Plain-text notifications | |
| Webhooks | ✅ JSON payload to any endpoint |
Alert triggers:
- New exception detected
- High latency / slow performance
- Uptime down
- Heartbeat failure
- Error spike (configurable window & threshold)
- Throttle control to prevent alert fatigue
Performance Thresholds
Set custom performance budgets per project:
- Route response time limits
- Job execution time limits
- Query execution time limits
- Command runtime limits
- Automatic issue creation when thresholds are exceeded
Data Retention
- Per-project retention policies — 1, 3, 7, 14, 30, 60, 90 days, or never delete
- Automatic daily pruning
Multi-Tenant Architecture
- Teams with role-based access
- Multiple projects per team
- Per-project settings, API tokens, and integrations
- Team invitations via email
Asynchronous Ingestion
- All incoming data is processed via Laravel Queues
- Zero-latency API responses — data is queued immediately
- Broadcasting happens in the background worker
AI Agent Access (MCP)
- Model Context Protocol server so AI coding agents can work with your data
- Read projects, list and inspect issues, and query telemetry
- Update issue status and comment on issues from the agent
- Scoped to the user's teams with Sanctum tokens; record output is sanitized
Quick Start
For the full guide — installation, configuration, and troubleshooting — see the LaraOwl Documentation.
Server Installation
Choose one of the following methods to install the LaraOwl server:
Docker
This project comes with a custom Dockerfile and docker-compose.yml for easy deployment. To get started:
Changes in .env for docker configuration:
First copy the production environment file:
cp .env.prod .env
Then update the following variables in .env:
APP_URL=https://your-production-domain.com
APP_HOSTNAME=your-production-domain.com
REVERB_APP_ID=000000
REVERB_APP_KEY=xxxxxxxxxxxxxxxxxxxxx
REVERB_APP_SECRET=xxxxxxxxxxxxxxxxxxxxx
The docker-compose.yaml file already has the correct service names for db, redis, and reverb. You only need to change the hostname and database credentials if you want to customize them.
Starting Production server
Use the following command to start the server in production mode:
docker compose up -d --build
The server will be available at https://your-production-domain.com. Make sure your DNS resolves for ws.your-production-domain.com and your-production-domain.com. Caddy will automatically fetch and renew SSL certificates for your domain.
You can add a simple user through a tinker sessions with the following command:
docker compose exec -ti app /bin/bash
Then run the following commands to start a tinker session:
php artisan tinker
And then create a admin user.
App\Models\User::updateOrCreate(
['email' => 'admin@laraowl.com'],
['name' => 'Admin', 'password' => bcrypt('changeme')]
);
Using Composer
Requirements:
- PHP 8.3+
- Node.js 18+
- Composer
- MySQL 8.0+ or PostgreSQL
- A queue worker
composer create-project laraowl/laraowl laraowl
cd laraowl
Once the files are ready, complete the setup:
# Install frontend dependencies
npm install
# Environment setup
cp .env.example .env
php artisan key:generate
# Configure your database in .env, then:
php artisan migrate
# Build frontend assets
npm run build
# Start the server
php artisan serve
Required Background Processes
LaraOwl needs these processes running alongside the web server:
# Process queued records (required)
php artisan queue:work
# WebSocket server for real-time updates (required)
php artisan reverb:start
# Scheduler for uptime checks & data pruning (required)
php artisan schedule:work
Client Integration
1. Install the Client Package
In the Laravel application you want to monitor:
composer require laraowl/client
2. Configure
Run the interactive setup command:
php artisan laraowl:install
Or manually add to your .env:
LARAOWL_SERVER_URL=https://your-laraowl-server.com
LARAOWL_TOKEN=your_project_api_token
You can find the API token in Project Settings → API Keys within the LaraOwl dashboard.
3. Optional: Send Logs
To forward application logs to LaraOwl:
LOG_STACK=stack,laraowl
That's it. Your application will immediately begin sending telemetry data to the LaraOwl server.
Connect an AI Agent (MCP)
LaraOwl exposes a Model Context Protocol server so AI coding agents can read projects, triage issues and query telemetry on your behalf. Every tool is scoped to your teams.
Generate a token from Settings → MCP Tokens, or via Artisan:
php artisan laraowl:mcp-token user@example.com --name=mcp
Then point your agent at the server. For Claude Code:
claude mcp add --transport http laraowl https://your-laraowl-server.com/mcp \
--header "Authorization: Bearer <token>"
Available tools: list-projects, list-issues, get-issue, query-telemetry, update-issue-status, comment-on-issue.
Architecture
┌──────────────────┐ HTTPS POST ┌──────────────────────┐
│ Your Laravel │ ──────────────────────────▶ │ LaraOwl Server │
│ Application │ /api/ingest │ │
│ │ (API Token Auth) │ ┌────────────────┐ │
│ laraowl/client │ │ │ IngestController│ │
│ package │ │ └───────┬────────┘ │
└──────────────────┘ │ │ │
│ Queue Dispatch │
│ │ │
│ ┌───────▼────────┐ │
│ │ ProcessIngested │ │
│ │ Records (Job) │ │
│ └───────┬────────┘ │
│ │ │
│ ┌───────▼────────┐ │
│ │ IngestService │ │
│ │ • Store records │ │
│ │ • Group issues │ │
│ │ • Check threats │ │
│ │ • Fire alerts │ │
│ └───────┬────────┘ │
│ │ │
│ WebSocket Push │
│ (Reverb) │
│ │ │
│ ┌───────▼────────┐ │
│ │ React Dashboard │ │
│ │ (Inertia + SSR) │ │
│ └────────────────┘ │
└──────────────────────┘
Data flow:
- The client package hooks into Laravel's service container and captures requests, exceptions, queries, jobs, etc.
- Captured data is sent via authenticated HTTP POST to the server's
/api/ingestendpoint. - The server immediately queues the payload and responds with
200 OK(zero processing delay). - A queue worker processes the records: stores them, calculates fingerprints for grouping, runs security analysis, and checks alert thresholds.
- A WebSocket event (
ProjectDataIngested) is broadcast so the dashboard updates in real-time.
Production Deployment
Environment Variables
Key variables to configure for production:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://your-domain.com
# Database
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=laraowl
DB_USERNAME=laraowl
DB_PASSWORD=your-secure-password
# Queue (use Redis for best performance)
QUEUE_CONNECTION=redis
# Broadcasting
BROADCAST_CONNECTION=reverb
# Reverb WebSocket
REVERB_HOST="your-domain.com"
REVERB_PORT=8080
REVERB_SCHEME=https
Process Management (Supervisor)
Example Supervisor configuration for the queue worker:
[program:laraowl-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/laraowl/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
numprocs=2
redirect_stderr=true
stdout_logfile=/var/log/laraowl/queue.log
[program:laraowl-reverb]
command=php /path/to/laraowl/artisan reverb:start
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/laraowl/reverb.log
Scheduler (Cron)
Add to your server's crontab:
* * * * * cd /path/to/laraowl && php artisan schedule:run >> /dev/null 2>&1
This handles:
- Uptime checks — every 30 seconds
- Data pruning — daily cleanup based on retention settings
Dashboard Sections
| Section | Description |
|---|---|
| Overview | High-level project health — requests, errors, performance at a glance |
| Requests | HTTP traffic analysis with route-level breakdown |
| Exceptions | Grouped errors with stack traces and occurrence tracking |
| Jobs | Queue job monitoring — processed, failed, duration |
| Commands | Artisan command execution history |
| Scheduled Tasks | Cron job health and execution log |
| Queries | Database query analytics — slow queries, N+1 detection |
| Notifications | Outbound notification tracking by channel |
| Email delivery monitoring | |
| Cache | Cache hit/miss analytics by key |
| Outgoing Requests | External HTTP call monitoring |
| Users | Authenticated user activity tracking |
| Uptime | Site availability monitoring |
| Logs | Centralized log viewer with search |
| Security | Threat detection dashboard |
| Firewall | Cloudflare WAF management (traffic, rules, audit) |
| Settings | General, Integrations, Alert Rules, Thresholds, API Keys, Cloudflare |
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
LaraOwl is open-source software licensed under the Apache License 2.0.