alexpgates/horizon-link
A lightweight Laravel package that provides convenient links to your Laravel Horizon queue dashboard, making it quick to jump from your application to Horizon to monitor queues, jobs, and workers. Simple to install and configure.
/horizon). That's essentially the whole feature surface — treat it as a shortcut, not a framework.auth.json).composer require alexpgates/horizon-link
app/Providers/NovaServiceProvider.php inside tools():
use Alexpgates\HorizonLink\HorizonLink;
public function tools()
{
return [
new HorizonLink(),
];
}
composer.json — confirm the autoload namespace (it may differ from the package name) and the laravel/nova version constraint, which tells you what Nova era it targets.src/ — the Tool class; this is where the label, icon, and target URL live.resources/js/tool.js + dist/ — whether it ships a Vue component or just a menu entry.NovaServiceProvider::tools(). If it extends Laravel\Nova\Tool, it will render via Nova's tool/menu system; if it's a card, it belongs in cards() instead — check the class before registering.public function tools()
{
return array_filter([
app()->environment('production') ? new HorizonLink() : null,
]);
}
Or, if the tool supports canSee, gate it on the same policy you use for Horizon:
(new HorizonLink())->canSee(fn ($request) => $request->user()->isAdmin())
Horizon::auth(): the link is cosmetic; the destination should still be protected by Horizon's gate in HorizonServiceProvider. Keep the two in sync so users don't see a link to a 403.horizon.example.com), confirm whether the tool hardcodes /horizon or reads a config/URL helper. Hardcoded paths are the usual failure mode; fork or wrap if you need a configurable base.// NovaServiceProvider::boot() or mainMenu()
MenuItem::link('Horizon', '/horizon')->icon('lightning-bolt');
Use the package only if you prefer the one-line tool registration.renderNavigation) versus the newer MenuItem API. You may need to fork the single class and port it./horizon. If you set a custom HORIZON_PATH, run Horizon behind a subdomain, or use path prefixes, the link will 404. Inspect src/ and override the target if needed.dist/js/tool.js. If Nova's asset pipeline changed, the component can render blank — open the browser console and look for missing chunks before blaming config.composer require fails, it's usually the laravel/nova constraint or missing Nova credentials, not this package. Check composer why-not laravel/nova and your auth.json.composer dump-autoload
php artisan nova:publish
php artisan optimize clears # or config:clear / view:clear
Then confirm NovaServiceProvider::tools() returns the instance and check nova-components asset publishing in config/nova.php.MenuItem/Link yourself — a few lines you fully control, with no abandoned dependency to carry.How can I help you explore Laravel packages today?