PHPackages                             z00f/filament-tools - 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. [Admin Panels](/categories/admin)
4. /
5. z00f/filament-tools

ActiveLibrary[Admin Panels](/categories/admin)

z00f/filament-tools
===================

Add a general-purpose tools page to your Filament project.

07PHP

Since Jun 26Pushed 3y agoCompare

[ Source](https://github.com/z00f/filament-tools)[ Packagist](https://packagist.org/packages/z00f/filament-tools)[ RSS](/packages/z00f-filament-tools/feed)WikiDiscussions main Synced today

READMEChangelogDependenciesVersions (1)Used By (0)

Installation
------------

[](#installation)

You can install the package via Composer:

```
composer require z00f/filament-tools
```

Optionally, you can publish the views using

```
php artisan vendor:publish --tag="filament-tools-views"
```

Usage
-----

[](#usage)

This package will automatically register a new `z00f\FilamentTools\Tools` page in your Filament panel.

### Registering a new tool

[](#registering-a-new-tool)

You can register a new tool by calling the `Tools::register()` function, providing a `Closure` as the only argument.

```
use z00f\FilamentTools\Tools;
use z00f\FilamentTools\Tool;

public function boot()
{
    Tools::register(function (Tool $tool): Tool {
        return $tool->label('Clear Cache');
    });
}
```

All tools **require** a label. If a label isn't provided, an instance of `z00f\FilamentTools\Exception\ToolsException` will be thrown.

> The provided `Closure` will be executed via the container so you can type-hint any dependencies you need.

### Tool forms

[](#tool-forms)

Each tool can contain it's own unique form. This form makes is simple to ask for input from the user and execute logic based on that input. You can provide your form's schema to the `Tool::schema()` method.

```
Tools::register(function (Tool $tool): Tool {
    return $tool
        ->label('Clear Cache')
        ->schema([
            TextInput::make('tag')
                ->nullable(),
        ]);
});
```

To run some logic when the form is submitted you can use the `Tool::onSubmit()` method, providing a `Closure` as the only argument. This `Closure` will receive an instance of `z00f\FilamentTools\ToolInput`. This class extends `Illuminate\Support\Collection` so you are free to call any existing Collection methods.

```
Tools::register(function (Tool $tool): Tool {
    return $tool
        ->label('Clear Cache')
        ->schema([
            TextInput::make('tag')
                ->nullable(),
        ])
        ->onSubmit(function (ToolInput $input) {
            $tag = $input->get('tag');

            // Do something cool here...
        });
});
```

#### Clearing form data on submit

[](#clearing-form-data-on-submit)

By default, the state for your tool's form will be preserved between submissions.

If you would like to clear the data, you can call the `ToolInput::clear()` method from inside of your submit callback.

```
$tool->onSubmit(function (ToolInput $input) {
    // Do something with input here...

    $input->clear();
    $input->notify('Success!');
});
```

### Rendering a custom view

[](#rendering-a-custom-view)

You can provide a custom view to render inside of the tool by calling the `Tool::view()` method.

```
Tools::register(function (Tool $tool): Tool {
    return $tool
        ->label('Clear Cache')
        ->view('tools.clear-cache');
});
```

### Customising the column span

[](#customising-the-column-span)

Each row on the tools page operates on a 12-column grid. The default width for a tool is **3 columns**.

If you would like to customise the width of your tool, you can use the `Tool::columnSpan()` method.

```
Tools::register(function (Tool $tool): Tool {
    return $tool
        ->label('Clear Cache')
        ->columnSpan(6);
});
```

### Authorization

[](#authorization)

By default, all users will be able to access the Tools page. If you would like to customise this behaviour and restrict access to certain users, you can use the `Tools::can()` method.

```
public function boot()
{
    Tools::can(function (User $user): bool {
        return $user->role === Role::Admin;
    });
}
```

If this callback returns `false`, the navigation items **will not** be registered and anybody trying to access the route directly will receive a `403` response.

Testing
-------

[](#testing)

```
composer test
```

Changelog
---------

[](#changelog)

Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.

Contributing
------------

[](#contributing)

Please see [CONTRIBUTING](.github/CONTRIBUTING.md) for details.

Security Vulnerabilities
------------------------

[](#security-vulnerabilities)

Please review [our security policy](../../security/policy) on how to report security vulnerabilities.

Credits
-------

[](#credits)

- [Ryan Chandler](https://github.com/ryangjchandler)
- [All Contributors](../../contributors)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

###  Health Score

14

—

LowBetter than 1% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity4

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity22

Early-stage or recently created project

 Bus Factor2

2 contributors hold 50%+ of commits

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/f4cedab0a91a0a7aa38aa191c0201340a2213de960ec4c251deeaa3f1cc3459a?d=identicon)[objasen](/maintainers/objasen)

---

Top Contributors

[![ryangjchandler](https://avatars.githubusercontent.com/u/41837763?v=4)](https://github.com/ryangjchandler "ryangjchandler (29 commits)")[![z00f](https://avatars.githubusercontent.com/u/34635749?v=4)](https://github.com/z00f "z00f (13 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (10 commits)")[![github-actions[bot]](https://avatars.githubusercontent.com/in/15368?v=4)](https://github.com/github-actions[bot] "github-actions[bot] (10 commits)")[![inerba](https://avatars.githubusercontent.com/u/5882517?v=4)](https://github.com/inerba "inerba (1 commits)")

### Embed Badge

![Health badge](/badges/z00f-filament-tools/health.svg)

```
[![Health](https://phpackages.com/badges/z00f-filament-tools/health.svg)](https://phpackages.com/packages/z00f-filament-tools)
```

PHPackages © 2026

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