jackcruden/telescope-link
Adds a handy link from your Laravel app straight to Laravel Telescope, so you can jump into the debug assistant without hunting for the URL. Simple to install and configure.
This is a ~1-file Nova tool, not a framework extension. Read src/ top to bottom before installing — there will be a single class (something like TelescopeLink) extending Laravel\Nova\Tool, whose render()/menu() returns a menu entry pointing at /telescope. That is the whole package.
Minimum steps:
laravel/nova installed and working, laravel/telescope installed, migrated, and reachable at /telescope in the browser while logged into Nova.composer require jackcruden/telescope-link (expect to need a path/vcs repository entry or a fork — see Gotchas).app/Providers/NovaServiceProvider.php:public function tools()
{
return [
new \Jackcruden\TelescopeLink\TelescopeLink(),
];
}
php artisan nova:asset / hard-refresh the Nova UI; the entry should appear in the sidebar.php artisan config:clear && php artisan route:clear if nothing shows.First use case: you're debugging a queued job or a slow request, you're already in Nova looking at a resource, and you want one click into the Telescope "Requests" or "Jobs" tab instead of editing the URL bar. That's the entire value proposition — a convenience shortcut for local/staging work.
If you only need that, stop here. If you need any other external link in the sidebar (Horizon, Mailhog, Pulse, a status page, phpMyAdmin), skip installation and use this package as a 40-line template instead — see below.
Environment-gated registration. The link is only meaningful where Telescope is enabled. Register conditionally rather than toggling visibility in the UI:
public function tools()
{
return array_filter([
app()->environment(['local', 'staging'])
? new \Jackcruden\TelescopeLink\TelescopeLink()
: null,
]);
}
Mirror Telescope's own gate. Telescope ships a viewTelescope gate that by default only passes in local. A link that 403s is worse than no link. Wrap the tool in the same authorization Nova gives you (canSee() / authorize() on the Tool class, or check Gate::allows('viewTelescope') in your NovaServiceProvider) so the sidebar entry and the destination agree.
Custom Telescope path. If you changed the path in config/telescope.php ('path' => 'admin/telescope') or via Telescope::path(), the hardcoded /telescope in the package will be wrong. Fork the class and read the path from config:
->path(config('telescope.path', 'telescope'))
Use it as a multi-link template. Copy the class once per destination and parameterize name/icon/path. This is the highest-leverage pattern in the package, because it generalizes to every "jump out of Nova" need:
class ExternalLink extends Tool
{
public function __construct(
public string $label,
public string $url,
public string $icon = 'link'
) {}
public function menu(Request $request)
{
return MenuItem::link($this->label, $this->url)
->icon($this->icon)
->target('_blank');
}
}
Register a handful of these in tools() and you have a "dev services" section without pulling in four abandoned packages. On Nova 4+, do this with Nova::mainMenu() / MenuSection in NovaServiceProvider::boot() instead of a Tool — the Tool-as-menu-item model is a Nova 1.x concept this package is pinned to.
Ordering and grouping. Nova orders sidebar entries by registration order and (in later versions) a priority number. Put the Telescope link near the bottom, after resources, so it doesn't compete with day-to-day navigation. If you're on Nova 4+, group it under a "Dev" MenuSection — the package predates menu sections entirely, so that part is yours to write.
Integration with your debugging loop. The practical workflow: reproduce the issue in the Nova UI → click through to Telescope → filter by the request/tag → jump back via browser back. It composes well with Telescope::tag() calls in your app code; tag the flows you debug most and the link becomes a two-click path to the exact entries.
menu()-returning-Tool contract and the MenuItem API have moved; expect either a hard failure or a menu entry that renders without an icon/target. Treat it as a code sample, not a dependency.laravel/nova frequently have unresolvable constraints in a fresh composer require; you may need --with-dependencies, a repositories entry pointing at your own fork, or a manual composer.json edit. If the install errors out on a Nova version constraint mismatch, don't debug it — copy the class into app/Nova/./telescope. Custom paths, subdomain routing, a Telescope::path() override, or an app served under a subdirectory all break the link silently (it 404s). Read the path from config('telescope.path').TelescopeServiceProvider's default gate is $this->app->environment('local'), and Telescope's service provider is typically not registered in production. A visible-but-403 link in staging is a common, confusing result — gate the menu entry on the same condition.canSee() vs. the destination's authorization. Nova hides tools via canSee()/authorize(); Telescope authorizes via its own gate. Two independent checks means you can easily show a link to a user who can't use it. Make canSee() delegate to Gate::allows('viewTelescope').php artisan route:clear and php artisan config:clear. A stale routes-v7.php is the usual reason the link 404s while the route "obviously" exists.php artisan route:list | grep telescope first; if the route exists but the sidebar entry doesn't, the problem is Nova's tool registration or canSee(), not Telescope. Log into Nova as the exact user/role you're testing — an admin-only Nova::tools() override somewhere in NovaServiceProvider is a frequent culprit.app/Nova/ is strictly better than depending on it: you get the Nova-version compatibility, the configurable path, and the authorization check for free.How can I help you explore Laravel packages today?