Skip to content

php-periscopeSee into your Laravel request.

Xdebug-tier debugging plus Telescope-tier observability, in one live UI — with an AI co-pilot.

Quickstart

bash
# one-line install (macOS + Linux)
bash <(curl -fsSL https://raw.githubusercontent.com/thamibn/php-periscope/main/scripts/install.sh)

# add to any Laravel app
composer require periscopephp/laravel

# start the daemon, open the UI
periscope-daemon &
open http://127.0.0.1:9999

# wire AI agents
claude mcp add periscope -- php artisan mcp:start periscope

What you get on day one

The first request you trigger after install shows up in the timeline. Click any frame, see every variable bound at that line. Click any SQL row, see the call site. Drag the timeline scrubber backward, watch the queries / logs / cache hits disappear in reverse.

If something's wrong, the Insights panel tells you:

  • "This query ran 12 times with the same shape — looks like an N+1 in ListingController:show:43."
  • "SELECT * on agencies is over-fetching. Slowest column read at 87ms — try select(['id','name'])."
  • "Exception caught at Foo.php:128. AI advisor: try/catch around the empty-collection branch on line 124 silently swallows the cause. Re-throw or log."

How is it different?

XdebugTelescopeDebugBarperiscope
Breakpoints + variables
SQL / logs / cache / jobs observabilitypartial
Time-travel scrubbing
AI-native (MCP)
Engine-level via Observer API
Per-request UIpost-mortemlive footerlive, full-screen
Frame-level overhead15–40×< 5×

Telescope is read-only after the fact. Xdebug needs a re-run with breakpoints. DebugBar is a footer chip. periscope is the debugger you would have written if Xdebug, Telescope, and DebugBar were the same project.

Status

v0.1.0-alpha. Built for PHP 8.3 on macOS + Linux. Laravel-only on the framework side; the C extension is framework-agnostic and Symfony / WordPress adapters are post-v1.

See docs/ROADMAP.md for what's next.

Released under a proprietary license.