All articles
December 15, 20256 min read

Filament Plugins at Scale: 400+ Stars, 5 Lessons

What I learned building Filament Advanced Filter, Copy Actions, and Maps, from first commit to thousands of users.

PHPFilamentOpen SourceLaravel

A user asked for a way to copy a record's ID to the clipboard with one click. I added it to a table, shipped it as a package, and forgot about it. A few months later, Filament Copy Actions had 200 stars and people were asking for bulk copy, custom formats, and copy-as-JSON. I had not planned for that. I had to learn fast.

Plugins like Filament Advanced Filter, Filament Copy Actions, and Filament Maps have collectively earned over 400 GitHub stars and are used by thousands of developers. Here is what actually mattered.

1. Design for the Ecosystem, Not for Yourself

The most important lesson: a plugin is not a standalone product. It lives inside Filament. Every API decision, every config option, every default must feel native to someone who already knows Filament.

When I built Filament Advanced Filter, I first modeled it after a generic query builder. It worked, but it felt alien. Filament developers expect filters to chain like Filter::make('name')->label('...'). So I rewrote the API to match. The result was a filter that drops into any Filament resource with minimal code.

Another example: Filament Copy Actions. Filament has table actions. I did not create a new action type. I extended the existing one. The copy button sits next to edit and delete. Same styling, same behavior. Users do not need to learn a new paradigm.

php
1use Webbingbrasil\FilamentAdvancedFilter\Filters\TextFilter;
2
3TextFilter::make('name')
4 ->label('Customer Name')
5 ->default('contains');
6

Anyone who has used Filament filters can read this. No extra mental load. That is the bar.

A mistake I made early on: designing APIs that felt clever to me but unfamiliar to Filament users. I had to undo that. The ecosystem has conventions: table actions, filter classes, widget registration. Plug into them. Do not reinvent.

2. Convention Over Configuration

The best plugins need almost no setup. Install, add to your resource, done. Sensible defaults cover most cases.

Filament Maps, for example, defaults to OpenStreetMap. You can swap to Mapbox or Google if you want, but the default works out of the box. Same for Filament Copy Actions: one line in your table, and users get a copy button. No config file, no environment variables for the happy path.

When you add options, ask: does 80% of the audience need this, or is it a niche request? If it is niche, hide it behind a method or a config key. Keep the first-time experience simple.

I once added a config file for Filament Maps with ten options. Most users needed two. I refactored: the two common cases work with zero config, the rest are opt-in. Install time dropped. Support questions dropped. Fewer options often means fewer bugs.

3. Backwards Compatibility Is Non-Negotiable

Breaking changes hurt everyone. Users delay upgrades, you maintain multiple branches, and trust erodes.

I use semantic versioning strictly. Major bumps only when the API actually breaks. For every major release, I write a migration guide. When Filament v3 hit, I did not rush. I waited for the API to stabilize, then updated each plugin with clear upgrade notes. Users who could not upgrade yet stayed on v2; those who could moved when ready.

One trick: deprecate first, remove later. Mark a method as deprecated in version X, remove it in X+1. Gives people time to adapt.

Changelog entries matter. When you release a new version, list what changed. Users who hit a bug can check if it is fixed. Users who fear breaking changes can see exactly what changed. It builds trust.

4. Documentation Takes as Much Time as Code

Good docs are not optional. I spend roughly the same time writing docs as writing code. Every filter type, every config option, every edge case gets documented.

A concrete example: Filament Advanced Filter has filter types for text, select, date range, and more. Each has its own options. I documented each one with examples. A user once opened an issue asking how to filter by a date range. I pointed them to the docs. They had missed it. I rewrote that section to be more visible and added a "common use cases" subsection. The number of similar questions dropped.

README badges, quick start, and API reference are the minimum. Add a "Troubleshooting" or "FAQ" section when the same questions repeat. It saves you time and helps users help themselves.

Code examples beat prose. A user skimming the docs will try the example first. If it works, they are hooked. If it does not, they leave. I add runnable snippets for every major feature. For Filament Advanced Filter, that means examples for each filter type plus a real-world scenario: filtering orders by date range, customer name, and status. Copy-paste, tweak, done.

5. Listen to the Community, But Keep the API Clean

GitHub Issues are a gold mine. Some of the best features in my plugins came from community requests. Bulk copy in Copy Actions, GeoJSON support in Maps, custom operators in Advanced Filter, all from user feedback.

When someone opens an issue, read it twice. Sometimes the requested feature is a symptom. They want X because they are trying to solve Y. Maybe Y has a simpler solution. I have closed feature requests by suggesting an existing option or a small workaround. The user got what they needed; the API stayed clean.

The catch: not every request should become a feature. Some would complicate the API for a handful of users. Some overlap with what Filament already does. The key is balancing what users want with what keeps the API coherent.

When I say no, I explain why. When I say yes, I often ask for a use case. Real examples help me design something that fits.

Pull requests are even better than issues. A user who sends a PR has already thought through the problem. Review it carefully. If the approach fits, merge and credit them. If not, explain what would work better. Some of my best contributors started with a small PR that we refined together.

What Happens Next

I am working on Filament v5 compatibility for all plugins, exploring new integration points, and planning a testing toolkit for plugin developers. The ecosystem is growing fast. I want to keep contributing.

If you are building Filament plugins and hit a wall, check the existing packages first. And if you ship something useful, share it. The community rewards good work. A single plugin that solves a real problem can open doors you did not expect.