PHPackages                             link000/finder - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. link000/finder

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

link000/finder
==============

Simple file content search tool

04PHP

Since Feb 2Pushed 2y ago1 watchersCompare

[ Source](https://github.com/4713n/finder)[ Packagist](https://packagist.org/packages/link000/finder)[ RSS](/packages/link000-finder/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

Finder - Simple file content search tool
========================================

[](#finder---simple-file-content-search-tool)

By default, it uses the ripgrep () to search for files matching your criteria.

You are free to [create your own search driver](#adding-custom-search-driver)

TODO:
=====

[](#todo)

To get the result on the frontend as quickly as possible, I recommend using **websockets**

You can use for example **soketi** (), or third-party services like pusher on the server side, and **Laravel echo** () on the frontend

When the match is found, it triggers `Link000\Finder\Events\SearchResultFoundEvent` event

You can implement your own listener and handle the event by yourself

In that case, I recommend turning off the broadcasting functionality provided by the package, by setting the `broadcasting.method` config to empty value

TODO: Dependencies
------------------

[](#todo-dependencies)

- find
- ripgrep

Configuration
-------------

[](#configuration)

### 1. using configuration file

[](#1-using-configuration-file)

#### publish the finder configuration by running

[](#publish-the-finder-configuration-by-running)

```
php artisan vendor:publish --provider="Link000\Finder\FinderServiceProvider" --tag="config"
```

and adjust settings in the `config/finder.php` file

### 2. runtime configuration

[](#2-runtime-configuration)

#### get config value

[](#get-config-value)

`config('finder.search_base_path')`

#### set config value

[](#set-config-value)

`config('finder.search_base_path', '/my/custom/path')`

---

### Configs

[](#configs)

#### Options applied only on routes published in default `routes/finder.php` file

[](#options-applied-only-on-routes-published-in-default-routesfinderphp-file)

Config nameDefault valueDescriptionroute\_prefix`finder`Prefix for default routes provided by package (located in **routes/finder.php**)route\_middlewares`['web']`Middlewares for default routes provided by package (located in **routes/finder.php**)#### Broadcasting options

[](#broadcasting-options)

Config nameDefault valueDescriptionbroadcasting.broadcast\_name`Link000\Finder\Events\SearchResultFoundBroadcastEvent`Event name you will listen to on the frontendbroadcasting.channel\_name`finder.results`If you use private channel, user id will be automatically appended, so the final channel will be in the format `finder.results.{user_id}`broadcasting.channel\_type`private``[public/private]` User must be authenticated, otherwise `public` will be usedbroadcasting.method`websockets`Broadcast every search result using websockets. If you change or leave it blank, you will disable the broadcasting provided by the package#### Other options

[](#other-options)

Config nameDefault valueDescriptionsearch\_base\_path`base_path()`Where to searchdriver`env('FINDER_DRIVER', 'rg')`Active search driverdrivers`['rg' => Link000\Finder\Drivers\RipGrepSearchDriver::class]`Registered search drivers (you can change during runtime)TODO:
=====

[](#todo-1)

broadcast\_method broadcasting.broadcast\_name broadcasting.channel\_type (public/private, if user is not authenticated, it will fallback to the public channel) broadcasting.channel\_name

Adding custom search driver
---------------------------

[](#adding-custom-search-driver)

You can add custom search driver by implementing the `Link000\Finder\Interfaces\FinderInterface`

- Create your custom driver and implement `Link000\Finder\Interfaces\FinderInterface`
- Add your driver including the full namespace into the finder.drivers config

```
// ... other configs
'drivers' => [
	'my_custom_driver' => App\Drivers\MyCustomSearchDriver::class,
],
```

- activate your driver
    - by changing `ENV` variable

    ```
     FINDER_DRIVER='my_custom_driver'
    ```

    - by changing `finder.driver` config

    ```
     // ... other configs
     'driver' => 'my_custom_driver',
    ```

    - or setting the driver at the runtime

    ```
     use Link000\Finder\Interfaces\FinderInterface

     class YourController {
     	protected FinderInterface $finderService;

     	public function __construct(FinderInterface $finderService) {
     		$this->finderService = $finderService;
     	}

     	public function search() {
     		// use your driver dynamically
     		$this->finderService->setDriver(app(MyCustomSearchDriver::class));
     	}
     }
    ```

Installing pre-defined stacks
-----------------------------

[](#installing-pre-defined-stacks)

This installs pre-defined stack with routes, controllers, services, styles etc.

I **recommend** to have a **clean git working tree**, so you can see newly created files

You should customize or remove unnecessary to fit your current application

#### Available stacks

[](#available-stacks)

- `vue` (vue + inertia, tailwind)
- `blade` (blade, tailwind)
- `api` (routes only)

```
php artisan finder:install
```

Notes for package development
-----------------------------

[](#notes-for-package-development)

#### Adding package to the project during package development

[](#adding-package-to-the-project-during-package-development)

add to your application composer.json:

```
"repositories": [
	{
		"type": "path",
		"url": "/packages/*",
		"options": {
			"symlink": true
		}
	}
]
```

This instructs composer to look for packages in the /packages and creates a symlink to the installed package

`symlink:false` will copy the package into the vendor directory, instead of creating a symlink (default behavior)

#### update composer:

[](#update-composer)

```
composer update
```

###  Health Score

13

—

LowBetter than 1% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity3

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity19

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/d0ffb97abc34c929a28c2af771c1e0bb5fc4e8ee5d927d08033175a9df0e0124?d=identicon)[link000](/maintainers/link000)

---

Top Contributors

[![4713n](https://avatars.githubusercontent.com/u/2928603?v=4)](https://github.com/4713n "4713n (7 commits)")

### Embed Badge

![Health badge](/badges/link000-finder/health.svg)

```
[![Health](https://phpackages.com/badges/link000-finder/health.svg)](https://phpackages.com/packages/link000-finder)
```

###  Alternatives

[webchemistry/forms-wizard

Wizard component for nette/forms

159.2k](/packages/webchemistry-forms-wizard)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
