Dan Harrin

Dan Harrin

@danharrin.com

Co-creator of @filamentphp.com, software architect at Canyon GBS

897 followers92 following86 posts

Dan Harrin reposted

Ready to give your Filament panel a new look? Come take a look at our brand new, first-party Filament Themes: Soft, Sharp, and Noir! In addition, we’ve also dropped a new modifier theme that works with the default and new themes: Compact. More info in the replies!

Dan Harrin reposted

🔎 New in Filament Blueprint: the "Filament Security Audit" skill Ask an agent to check your Filament app against common security mistakes, then write a report and remediation plan. It will check access control, uploads, XSS, query scoping, and more. Blog post in the replies 👇

Dan Harrin reposted

Ever wanted to know more about how Filament came to be what it is today? Take a trip down memory lane and learn a bit about Filament’s origins in today’s post (or just sit back and enjoy the nostalgia)! filamentphp.com/insights/ale...

filamentphp.comFilament through the years - Filament# Filament through the years It’s hard to believe that we’re already celebrating Filament’s fifth birthday in 2026! In some ways, it feels like just yesterday...

Really appreciate all the kind comments about the new @filamentphp.com brand! Shout out to Emily @ Studio Hicks for designing our new identity and producing gorgeous custom art for it, and @zahirnia.com for that, iterating on the ideas, and building an incredible site!

When completely rebuilding a brand with a community so familiar with the old design, I think it's really difficult to keep your existing audience happy and to not alienate them. Emily & Hassan managed to retain so much personality in the brand! 😍 filamentphp.com/insights/ale...

filamentphp.comTwo exciting announcements for Filament's fifth birthday! - Filament## Happy birthday, Filament! We've come a long way since Filament's official v1 release, and it's been an incredible journey. We've launched an unbelievable am...

Dan Harrin reposted

And now, the moment we’ve all been waiting for: two new releases for Filament’s fifth birthday! We excited to introduce both the new Filament rebrand & mascots AND a new premium plugin: Filament Custom Dashboards

The amount of OpenClaw worship on the other site is driving me crazy. I think many have lost their minds, or maybe it's just the agents posting. Why are people building apps for agents to interact with each other again? Do you really have nothing more valuable to spend tokens on? 😳

Dan Harrin reposted

We’ve launched Filament v5 and Filament Blueprint today! 🤖 Filament v5 adds support for the newly-released Livewire v4! Blueprint is a premium Laravel Boost extension that gives AI agents deep, structured knowledge of Filament, so they can write detailed implementation plans.

Dan Harrin reposted

✨ Filament v4.1 is here! This release marks two months of great progress since v4 was marked as stable, including many bug fixes, new features, and community plugin support for v4. Here are 4 of the new features 👇

Super excited for the first ever wire:live conference in Buffalo on Oct 28-29! Going to talk all about how Filament uses Livewire and Alpine internally to allow users to build interactive UIs using just PHP configuration objects. Tickets: wire-live.com

Dan Harrin reposted

Excited about the @filamentphp.com v4 launch? You're not going to want to miss tonight's livestream (8pm EDT) on my Twitch channel We'll have the one and only @danharrin.com on to answer questions about v4 and help us build a project built entirely on Filament! twitch.tv/alexandersix_

twitch.tvalexandersix_ - TwitchSenior Engineer @ Zillow | Mentorship Advocate | Vim | Has a cute corgi | Laravel, Filament, JavaScript, Linux, and pretty much anything else that seems fun and interesting. Music heard on stream is b...

Dan Harrin reposted

It’s official, v4 is stable and ready for use right now! Big thanks to the community for all the help and contribution to make this our best Filament release ever! We couldn’t have done it without you! Thanks to @laravelnews.com for being our release announcement partner!

Dan Harrin reposted

Replying to @filamentphp.com

Join us for a special community event on Discord to: ✨ Walk through what's new in v4 🛠️ Hear from the core team ❓ Ask your questions live during our open Q&A session 🤝 Hang out with fellow devs and celebrate together! filamentphp.com/discord

filamentphp.comJoin the Filament Discord Server!Filament is a collection of beautiful full-stack components for Laravel.You can get help using it on our Discord. | 19829 members

Dan Harrin reposted

📣 After months of development, testing, and feedback from our amazing community, we’re thrilled to officially launch Filament v4 (stable) on Tuesday 12th August at 1pm UTC! This is a major milestone packed with powerful features and performance improvements. 💛

Dan Harrin reposted

breaking php news: Dan Harrin (creator of filament) is coming on my channel live next friday to talk about filament 4. schedule: - june 13: Dan Harrin (friday) - june 16: Jeffrey Way (monday) subscribe so you don’t miss it: youtube.com/@nunomaduro 🔥

In Filament v3, the rich editor field had limited file upload capabilities, only fully supporting public image uploads. Private images would require us to generate temporary URLs when the editor is loaded and when content is rendered. This is tricky when you use an editor as simple as Trix. 👇

View full thread

You can also "register" rich content fields in an Eloquent model, to configure the file attachment behaviour centrally for any rich editor instances for that attribute and any times you render HTML that attribute. It's a similar mechanism to registering Spatie Media Library collections on a model.

Finally, I have built a way to build "plugins" for the rich editor and rendering system, to register any TipTap JS / PHP extensions and custom toolbar items. If you register a TipTap JS extension, it only gets loaded onto the page when you are using a rich editor, not on every request.

In Filament v3, the rich editor field had limited file upload capabilities, only fully supporting public image uploads. Private images would require us to generate temporary URLs when the editor is loaded and when content is rendered. This is tricky when you use an editor as simple as Trix. 👇

View full thread

The `data-id` attribute is then used when the editor is loaded and when content is rendered to generate temporary URLs into the `src` attributes of the images. This has also allowed me to build an integration in the Spatie Media Library plugin for rich editor images.

When using the Spatie Media Library plugin, all images in that editor are stored in their own collection on the model that is using media library. If an image is removed from the content, it also gets removed from the media library collection. The `data-id` attribute stores media UUIDs.

In Filament v3, the rich editor field had limited file upload capabilities, only fully supporting public image uploads. Private images would require us to generate temporary URLs when the editor is loaded and when content is rendered. This is tricky when you use an editor as simple as Trix. 👇

In Filament v4, we switched to TipTap, which is a much more hackable editor. The file upload system is completely redesigned, which now only saves uploads permanently when the form is submitted instead of immediately. If the image is private, its path on the disk is stored in a `data-id` attribute.

Over the years, I have worked on quite a few improvements to the performance of Filament's bulk actions. Initially, this involved moving our bulk selection tracking from Livewire to Alpine.js, so the selected record IDs were not sent to Livewire each time a request was made to the backend.

View full thread

Now, if you use a built-in bulk action (like `DeleteBulkAction`) with the `fetchSelectedRecords(false)` method, Filament will perform mass-deletion queries automatically. This isn't default behaviour as it doesn't allow individual record authorization and model events (like observers) to run.

I have also introduced a new method for bulk actions: `chunkSelectedRecords()`, which uses Laravel's `lazyById()` method on the query to construct a `LazyCollection` of records for the bulk action instead of a standard collection. This improves memory consumption in multi-chunk datasets.

Over the years, I have worked on quite a few improvements to the performance of Filament's bulk actions. Initially, this involved moving our bulk selection tracking from Livewire to Alpine.js, so the selected record IDs were not sent to Livewire each time a request was made to the backend.

For v4, I have just worked on a new performance improvement: inverse selection. Instead of only tracking the selected record IDs, we can now track the *deselected* record IDs when the "select all" button is used. It results in many fewer record IDs being sent to the backend and in queries.

Additionally, I have improved the capability of the `fetchSelectedRecords(false)` method on bulk actions, which (in v3) prevents Eloquent models from being loaded into memory when using a bulk action.

Here's a feature in @filamentphp.com v4 I haven't spoken much about before: improved bulk processing In a bulk action, you can authorize individual records easily, and also report issues that occur during the process. These authorization responses and issues get collected and nicely printed! ✨

When writing documentation, it's difficult to let go of structural perfection: documentation that 1:1 reflects the codebase and its internal relationships Even after so many years I am really still learning how to write good documentation for humans, and letting go of purity and fear of duplication

I've been following Martin since the days he was critiquing various musical notation software. Following him taking lead on the Musescore team and transforming the user experience of FOSS has been incredible. Obviously I'm very interested in FOSS, and there's lots of great takeaways in this talk 👏

Tantacrul@tantacrul.bsky.social

Last week, I gave a talk about how we can improve the design of open source software at FOSS Backstage Design in Berlin. Here's the video. www.youtube.com/watch?v=12TJ...

In @filamentphp.com v4, there are 4 categories of "schema" components, which can all be used together: - Form fields - Infolist entries - Layout components - Prime components - new in v4 As the name suggests, Primes are indivisible. Text, Image, Icon, Action (button). Nothing can be simpler.

View full thread

In v3, you were limited to one icon, one button and one piece of text in a "hint". There was a set order for rendering these too. In v4, you can add any number of these components (primes), in any order, and in many more places (below the label, aside the main input, around the validation message).

In @filamentphp.com v4, there are 4 categories of "schema" components, which can all be used together: - Form fields - Infolist entries - Layout components - Prime components - new in v4 As the name suggests, Primes are indivisible. Text, Image, Icon, Action (button). Nothing can be simpler.

As such, you can use prime components to add arbitrary content anywhere in your schema. Need some text to instruct the user about something? Or need to insert a QR code? Infolist entries are there to map data into label-value "description list" format, not for this.

In v3, form fields and infolist entires could have "hint"s and "helper text". These are two "slots" for inserting text around the content, usually for instructions. In v4, we have added many more slots, and all slots can render any combination of other schema components - usually primes!

Here's a little Alpine.js tip: the `x-cloak` attribute gets removed from the DOM when Alpine is initialised, regardless of its value. As such, you can use the value of the attribute to customize its behaviour. Want it to hide the element after init (instead of show)? Or only cloak on large screens?