dvictor357 / laravel-omnisearch
A global command palette (Cmd+K) for Laravel applications. Search models, navigate routes, and execute commands from anywhere.
Installs: 1
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/dvictor357/laravel-omnisearch
Requires
- php: ^8.2
- illuminate/support: ^11.0|^12.0
- livewire/livewire: ^3.0
Requires (Dev)
- mockery/mockery: ^1.6
- orchestra/testbench: ^9.0
- phpunit/phpunit: ^10.0|^11.0
README
A global command palette (Cmd+K / Ctrl+K) for Laravel 11/12 applications. Search models, navigate routes, execute commands, and more from anywhere in your app.
Features
Core Features
- ๐ Global Search โ Search across models, routes, and custom sources
- โจ๏ธ Keyboard-First โ Full keyboard navigation (
โ,โ,Enter,Esc,Tab) - ๐จ Premium UI โ Glassmorphism design with smooth animations
- ๐ Extensible โ Easy to add custom search sources
- โก Livewire 3 โ Real-time search powered by Livewire
- ๐ Relevance Scoring โ Results ranked by relevance, not just source order
UX Enhancements
- ๐ Recent Searches โ Stores and displays your search history
- ๐ Copy to Clipboard โ Dedicated copy action type with toast notifications
- ๐ฏ Multiple Action Types โ Navigate, copy, or open modals
- ๐ผ๏ธ Dynamic Icons โ Built-in icon system with 15+ icons
- ๐ญ Theming โ CSS variables for easy customization
- โฟ Accessible โ Full ARIA support and screen reader compatible
Developer Experience
- ๐ง Artisan Commands โ
omnisearch:install,omnisearch:make-source - ๐ก Events โ Hook into search lifecycle with events
- ๐ i18n Ready โ Translations support out of the box
- ๐งช Well Tested โ Comprehensive test coverage
Requirements
- PHP 8.2+
- Laravel 11.x or 12.x
- Livewire 3.x
Installation
composer require dvictor357/laravel-omnisearch
Quick Setup
Run the installer command:
php artisan omnisearch:install
Or publish assets manually:
php artisan vendor:publish --tag=omnisearch-config php artisan vendor:publish --tag=omnisearch-views
Add the component to your main layout (before </body>):
<livewire:omnisearch />
Configuration
Keyboard Shortcuts
'shortcuts' => ['k', '/'], // Multiple shortcuts supported 'modifier' => 'cmd', // 'cmd', 'ctrl', or 'alt'
Searchable Models
Configure which models should be searchable in config/omnisearch.php:
'models' => [ App\Models\User::class => [ 'columns' => ['name', 'email'], // Columns to search 'title' => 'name', // Display title 'description' => 'email', // Display subtitle 'route' => 'users.show', // Named route (receives model ID) 'icon' => 'user', // Icon identifier 'limit' => 5, // Max results for this model 'group' => 'Users', // Custom group label (optional) ], ],
Route Filtering
Control which routes appear in search:
'routes' => [ 'include' => ['*'], 'exclude' => ['api.*', 'sanctum.*', 'livewire.*'], ],
UI Customization
'ui' => [ 'placeholder' => 'Search anything...', 'debounce' => 300, 'max_results' => 10, 'show_keyboard_hints' => true, 'max_recent_searches' => 10, 'enable_history' => true, 'theme' => [ 'primary' => '#8b5cf6', 'bg' => 'rgba(30, 30, 46, 0.85)', 'radius' => '16px', 'accent' => 'rgba(139, 92, 246, 0.3)', ], ],
Search Settings
'search' => [ 'use_scoring' => true, // Enable relevance scoring 'min_score' => 0, 'highlight_matches' => true, ],
Creating Custom Sources
Basic Source
Implement the SearchSource interface:
use OmniSearch\Contracts\SearchSource; use OmniSearch\Data\Result; use Illuminate\Support\Collection; class MyCustomSource implements SearchSource { public function getKey(): string { return 'custom'; } public function getLabel(): string { return 'My Results'; } public function getIcon(): string { return 'star'; } public function authorize(): bool { return auth()->check(); } public function getSynonyms(): array { return ['my-result', 'custom-result']; } public function getDependencies(): array { return []; } public function search(string $query): Collection { return collect([ Result::navigate( id: 'custom:1', title: 'Custom Item', description: 'A custom search result', url: '/custom/1', icon: 'star', group: $this->getLabel(), ), ]); } }
Command Source with Dependencies
Use the CommandSource base class for commands with dependencies:
use OmniSearch\Sources\CommandSource; use OmniSearch\Data\Result; use Illuminate\Support\Collection; class CreateUserCommand extends CommandSource { public function getKey(): string { return 'create-user'; } public function getLabel(): string { return 'Create User'; } public function getIcon(): string { return 'user-plus'; } public function getDependencies(): array { return [ 'team' => App\Search\TeamSearchDependency::class, ]; } public function search(string $query): Collection { return collect([ Result::modal( id: 'command:create-user', title: 'Create New User', description: 'Open user creation form', modalName: 'create-user-modal', icon: 'user-plus', group: 'Commands', ), ]); } public function execute(...$args): mixed { // Command execution logic } }
Copy Action Result
Create results that copy text to clipboard:
Result::copy( id: 'copy:email', title: 'Copy Email', description: 'Click to copy user email', textToCopy: $user->email, icon: 'copy', group: 'Actions', );
Register in config/omnisearch.php:
'sources' => [ OmniSearch\Sources\ModelSource::class, OmniSearch\Sources\RouteSource::class, App\Search\MyCustomSource::class, // Add your source ],
Events
OmniSearch fires events you can listen to:
use OmniSearch\Events\SearchPerformed; use OmniSearch\Events\ResultSelected; use OmniSearch\Events\ModalOpened; // Listen for search events Event::listen(SearchPerformed::class, function ($event) { // $event->query, $event->resultsCount, $event->duration }); // Listen for result selection Event::listen(ResultSelected::class, function ($event) { // $event->id, $event->title, $event->actionType, $event->url }); // Listen for modal open Event::listen(ModalOpened::class, function ($event) { // $event->trigger });
Artisan Commands
# Install OmniSearch assets php artisan omnisearch:install # Create a new search source php artisan omnisearch:make-source MyCustom # Clear search cache php artisan omnisearch:clear-cache
Available Icons
| Icon | Name | Description |
|---|---|---|
| ๐ | search |
Search icon |
| ๐ค | user |
User/profile |
| ๐ | link |
Links/routes |
| ๐ | copy |
Copy action |
| โ | check |
Success/check |
| ๐ | file |
File/document |
| ๐๏ธ | database |
Database/models |
| โ๏ธ | settings |
Settings |
| โจ | sparkles |
AI/featured |
| ๐ | expand |
Modal/action |
| ๐ | clock |
History/time |
Contributing
Contributions are welcome! Please see CONTRIBUTING.md for details.
Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
License
Laravel OmniSearch is open-sourced software licensed under the MIT license.
