Every request to your local sites, live
PortBay tails its Caddy edge and streams each request into a DevTools-style table: method, host, path, status, latency and size, mapped to the project it hit. No setup.
HTTP inspector
A DevTools-style live table of every request through the Caddy edge, with filters, header detail, opt-in body capture and a dump viewer.
How do I see every HTTP request to my local dev site?
Read the access log of a reverse proxy sitting in front of the dev server. That is the one vantage point that catches requests the framework never sees, unlike an application log, and that survives a page navigation, unlike the DevTools Network tab. Doing it yourself means adding a proxy layer (mitmproxy --mode reverse:http://localhost:5173) and re-teaching it your hostnames and certificates. In PortBay the traffic already flows through a bundled Caddy edge, so the inspector tails Caddy's structured access log in a background thread and streams each request into a table: method, host, path, status, latency, response size and the matched project. Filter by project, errors only (status 400 and up), or a case-insensitive path search; click a row for the timestamp and every header Caddy logged. Bodies need the opt-in recording mode, because the access log carries none. A dump viewer catches Laravel and Symfony dump() output too.
Verified against the product, 2026-07-10.Watch the traffic, keep the errors
Requests stream in as Caddy serves them; one click on Errors only strips the noise and leaves the 404 you were hunting.
From page load to answer
- Open the Inspector
- Hit your project
- Filter to what matters
- Expand the row
- Chase a dump
Open the Inspector
No configuration. The inspector is active whenever Caddy runs; on open, the last 200 log lines backfill the table so you have context immediately.
Hit your project
Load the site, click around, fire the webhook. Rows appear in real time with method, path, status, latency, size and the matched project.
GET /api/orders/7 → 404 · 9 msFilter to what matters
Pick a project, toggle Errors only (status 400 and up), or substring-search path and host. Filters apply locally, no round-trips.
Expand the row
One click shows the ISO timestamp, the response size, and every request header Caddy logged. Opt-in body recording captures payloads when headers are not enough.
Chase a dump
Enable the dump viewer in Integrations and dump() or dd() calls from Laravel and Symfony land in a live, time-ordered stream with file and line; any language can POST /dump.
dump($order) → dumps view · OrderController.php:42Inspection, tier by tier
The always-on table carries no bodies; recording captures them when enabled.
From the app; deliberately unavailable to CLI and MCP callers.
Opt-in from Integrations; off by default.
Reconstructing a request flow by hand
Without an inspector you stitch the story together from app logs, a DevTools tab that forgets on navigation, and logging middleware you have to remember to remove.
The traffic already flows through PortBay's edge; the inspector just shows it to you, and the dump viewer catches what the framework wants to say.
# App-side only — misses anything that never reached the framework$ tail -f storage/logs/laravel.log # Browser DevTools: gone the moment the tab navigates or closes # Or wire another proxy layer in front of your dev server$ mitmproxy --mode reverse:http://localhost:5173# now your HTTPS setup and hostnames need re-teaching # Or sprinkle var_dump() and hunt for it in the HTML
One app, not a stack of tools
HTTPS + .test domains
https://name.test per project: mkcert certificates, managed local DNS and a bundled Caddy edge, with expiry and reissue in view.
Explore →SSH workspace
Save a host once: real terminal, SFTP browser with inline ⌘S editing, click-to-start tunnels, and host panels, on system OpenSSH.
Explore →Local email testing
A bundled Mailpit inbox on 127.0.0.1: outgoing mail is caught, readable and local, with MAIL_* vars injected at launch.
Explore →Asked before downloading
Not in the always-on table: it reads Caddy's access log, which carries no body content, so live inspection stays cheap. When you need payloads, turn on the opt-in body recording and the captured exchanges include them; replay is available from the app on what was captured.
No. It tails the Caddy access log in a background thread and is active whenever Caddy is running. On first open the last 200 lines backfill the table, log rotation is detected, and Clear truncates the on-disk log when you want a clean slate.
A live, time-ordered stream for debug dumps. Laravel and Symfony dump() and dd() calls arrive over the VarDumper wire protocol through an injected VAR_DUMPER_SERVER, and any language can POST to /dump. Each entry shows a project badge, file and line, and an expandable value tree. Opt-in from Integrations.
Yes, and it pairs with tunnels: share the project on a public URL, point Stripe or GitHub at it, and watch each callback arrive with its method, status and headers. Errors-only filtering keeps the retries readable.
The in-memory buffer holds 1,000 entries (the table renders up to 500 at a time), and reopening the view backfills the most recent 200 log lines from disk. Clear empties both the buffer and the on-disk access log.

Give your projects and your agents a real local home.
Download for macOSFree & open source · macOS 11+ on Apple Silicon · Pro from $10/mo