Your Laravel logs, triaged.Your errors, fixed by AI.

A Laravel-first log viewer built for solo developers. Log Lens catches, groups, and triages every error across your Laravel, Horizon, nginx, and console logs — then hands them to Claude Code or Codex over its REST API to get fixed. All on infrastructure you already run.

Connect with tools you already know

storage/logs/laravel.log
09:14:02ERRORSQLSTATE[HY000] [2002] Connection refused
09:14:07ERRORSQLSTATE[HY000] [2002] Connection refused
09:14:11INFOHorizon: SyncOrders queued
09:14:19ERRORSQLSTATE[HY000] [2002] Connection refused
09:14:26ERRORSQLSTATE[HY000] [2002] Connection refused
09:14:31WARNRetrying connection (attempt 3)

1,284 lines. One real problem.

issue #418open

SQLSTATE[HY000] [2002] Connection refused

app/Services/OrderSync.php:64

×1,284 occurrences
first seen in v2.4.1
databasehorizon
GET /?api=issuesfixed

Your agent reads the issue, the stack, and the surrounding log lines over the REST API, then patches the code and closes it out.

patched OrderSync.php
status → fixed
Claude Code & Codex skills

BUILT FOR YOUR OWN INFRASTRUCTURE

SQLite by defaultPostgres & MySQL supportedStandalone or Laravel-embeddedIsolated storage per applicationMIT licensed

The engine

From raw log lines to issues you can actually work

Log Lens streams the file, fingerprints recurring errors into one stable issue, and gives each issue a status, tags, and a REST endpoint. Every application gets its own isolated database — there's no cross-application view for one project's errors to leak into.

Fingerprinted issues

Normalized titles, stacks, and source frames group thousands of recurring occurrences into one stable issue — not one row per event.

Byte-range storage

Raw evidence stays in your archived log files. The database only stores byte ranges, so huge logs stream without bloating it.

Connectors

Pull logs from a local directory or a remote SSH host, with incremental byte-offset checkpoints and rotation-aware dedup.

Workflow & tags

open → in_progress → fixed, with an immutable history, colored tags, and auto-assign rules — reoccurrence is detected automatically.

Plugins, opt-in

Alerting, release tracking, Linear sync, HTTP ingest, and access-log analytics — each switched on per application, never globally.

JSON API + capture SDKs

A full REST API behind an optional token, plus first-hand error capture from Laravel, plain PHP, or the browser.

127.0.0.1:8787
The Log Lens dashboard: the selected application, indexed-event and triage stats, level and status distribution, and fingerprinted issues with status, tags, and occurrence counts

Catch it the moment it happens — not whenever the log gets parsed.

Log files are after-the-fact and best-effort. First-hand capture reports the error instantly, with request, user, and breadcrumb context no log line format naturally carries — and it's the only way to see frontend errors at all.

  • The Laravel reporter needs zero code changes — it hooks the exception handler.
  • LogLensClient is one dependency-free PHP file for anything else.
  • The browser SDK's key is write-only, by design — anyone with it can push events, never read them.
// .env — zero code changes, unhandled exceptions report themselves
LOG_LENS_REPORTER=true
LOG_LENS_RELEASE=v2.4.0

// Manual reporting, anywhere in the app:
use LogLens\Laravel\LogLens;

LogLens::capture($exception);
LogLens::message('Nightly reconciliation drifted', 'WARNING');

Screens

The whole app, not a landing page

Four screens from a running install. Light theme here — the dashboard also follows a dark or system theme, at any font scale.

127.0.0.1:8787
An issue open in the Log Lens inspector, its history reading fixed, in progress, open, each entry with a note

Every status change is an immutable history entry — who moved it, when, and the note they left. Reoccurrence after a fix is detected on ingest.

Your production errors never leave your servers

Hosted error trackers are great products built around a tradeoff: your production data has to go somewhere you don't run. Log Lens makes the other choice — everything stays where your logs already live.

No data leaves your infrastructure

Every application gets its own database, incoming directory, and archive on disk you already control — not a row in someone else's multi-tenant cluster.

No cloud vendor to depend on

Run it under PHP's built-in server, behind nginx, inside a Laravel app, or air-gapped. There's no hosted control plane that can rate-limit, deprecate, or go down on you.

No per-seat, per-event pricing

It's MIT-licensed and free. Ingest as many events as your disk and PHP process can handle — there's no usage meter to watch.

Clone the repo, point PHP at it

No build step and no Composer install at runtime. You need PHP 8.2+ with the pdo_sqlite extension — everything else is already in the repo.

$git clone https://github.com/cliqthemes/log-lens-core.git log-lens
$php -S 127.0.0.1:8787 -t log-lens/public

Open http://127.0.0.1:8787 — that's it, you're looking at your first application.