When You Need Request Inspection (And When Server Logs Are Enough)
The inspection question
Some tunnel tools ship a web UI that shows every HTTP request — headers, body, timing, replay buttons. That is genuinely useful for webhook debugging.
LocalToLink does not include a request inspector. That is intentional: we optimize for zero-friction anonymous tunnels, not visual traffic debugging.
This article helps you decide when you need inspection tooling vs when server logs and provider dashboards are enough.
When server logs are enough
For most webhook and OAuth work, your handler already logs what matters:
npx localtolink
# Watch your terminal where npm run dev runs
Plus provider-side tools:
- Stripe — Events tab shows delivery status and response codes
- GitHub — Recent Deliveries with request/response
- Shopify — Webhook delivery logs in admin
If you can answer "did the request arrive?" and "what status did I return?" from logs, you do not need an inspector.
When you want request inspection
Consider a dedicated inspection tool when you need to:
- See raw headers without adding logging code
- Replay the exact same POST body with one click
- Share a captured request with a teammate visually
- Debug opaque third-party payloads you did not expect
For that workflow, tools with built-in inspectors exist. Use them alongside or instead of a minimal tunnel for that specific debugging session.
LocalToLink workflow without inspector
- Add temporary logging in your handler:
app.post("/webhook", (req, res) => {
console.log("headers:", req.headers);
console.log("body:", req.body);
// ... verify signature, process event
res.sendStatus(200);
});
- Use provider "resend" to replay deliveries
- Use
curlagainst your tunnel URL for manual tests - Remove verbose logging before commit
Comparison at a glance
| Need | Minimal tunnel + logs | Inspection UI |
|---|---|---|
| Confirm webhook arrives | Yes | Yes |
| Debug signature failures | Yes (log headers) | Easier |
| One-click replay | Use provider resend | Built-in |
| Zero code changes | Partial | Yes |
| No account signup | LocalToLink yes | Varies |
Honest recommendation
- Quick webhook test →
npx localtolink+ provider dashboard - Deep payload debugging → add logging or use an inspection tool for that session
- Team sharing captures → inspection UI or export logs
You can use different tools for different tasks. Your app code does not change — only the public URL and your debugging workflow.
Framework-specific logging tips
Next.js App Router — log in route handlers:
export async function POST(request: Request) {
const raw = await request.text();
console.log("[webhook]", request.headers.get("stripe-signature"), raw.slice(0, 200));
// verify + parse
}
Express — mount raw parser only on webhook routes to avoid breaking JSON APIs elsewhere.
Fastify — use addContentTypeParser with parseAs: 'buffer' for webhook paths.
Remove verbose logging before opening a PR — or gate it behind process.env.DEBUG_WEBHOOKS.
When to add temporary middleware
For opaque third-party payloads, a catch-all logger helps for one session:
app.use("/webhook", (req, res, next) => {
console.log(`${req.method} ${req.url}`, req.headers);
next();
});
Delete after debugging. Permanent middleware in production should use structured logging (pino, winston) with redaction for secrets.
Team collaboration without an inspector
Share debugging context via:
- Provider "Recent Deliveries" screenshot (GitHub, Stripe)
- Exported
curlcommand reproducing the POST against your tunnel URL - Paste of sanitized headers in Slack — never live secrets
An inspection UI accelerates this; it is not the only path.
Provider replay features (often overlooked)
Before adding inspection tooling, check whether your provider already replays requests:
- Stripe — Dashboard → Events → select event → "Resend"
- GitHub — Webhook settings → Recent Deliveries → "Redeliver"
- Shopify — Partners → app → webhook delivery logs
Replay sends the same payload again to your current tunnel URL. Update the URL first if your subdomain changed since the original delivery.
Start with LocalToLink, add tools when stuck
Default workflow for webhook debugging:
npx localtolink+ provider dashboard delivery logs- Temporary
console.login handler if payloads are unclear - Provider replay if you need the same event again
- Inspection UI only if steps 1–3 are insufficient for a specific opaque integration
Most developers never need step 4 for routine Stripe, GitHub, or Shopify work.
Start with the simplest path; add tooling only when logs and provider dashboards leave questions unanswered.
FAQ
Will LocalToLink add an inspector?
Not in v1.0. We focus on fast anonymous tunnels. Use logs or specialized tools for inspection.
Can Stripe CLI replace both tunnel and inspector?
For Stripe-only work, stripe listen forwards and shows events in terminal — excellent for Stripe, not general-purpose.
Does logging slow webhook handlers?
Verbose logging adds negligible latency for dev traffic. Remove before production deploys or use structured logging with sampling.
Can I pipe tunnel traffic to a file?
Your app logs are the right capture point. Proxy-level capture requires inspection tooling LocalToLink does not provide in v1.0.
Next steps
Try it now
Start a tunnel from your project directory — no account required.
$ npx localtolink