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

2.0.0 2026-02-06 07:19 UTC

This package is auto-updated.

Last update: 2026-02-06 07:19:54 UTC


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.

Latest Version on Packagist Total Downloads License

OmniSearch Screenshot

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.