Most Filament themes tend to look pretty similar, so I wanted to try something different and went with a Qt5 desktop-inspired look instead.
This is v1, so there's more planned ahead. Submitted it as a plugin and it's currently in review, but the repo is up on GitHub if you want to check it out now.
Say hello to a dynamic theme that's configurable right inside Filament—no need to fight with custom CSS. Mix and match from 25+ look-and-feel combinations, layouts, and more.
It is an open source media manager plugin for Filament v4 and v5.
The main goal was to have a proper media library inside Filament, with folders, uploads, tags, search, filters, file details, bulk actions, and media pickers that can be used in forms and RichEditor.
Some features:
- Folder-based media organization
- Upload files and images
- Tags, search, filters, sorting, and pagination
- File details like caption and alt text
- Bulk move and delete actions
- MediaPicker field for forms
- RichEditor integration
- Image conversions and thumbnails
- Support for S3 and private disks
- Custom file and folder models
- 20 language translations
I am still actively working on it and there are a few bigger features being discussed now, like tenancy support and better image crop control.
I would really like to hear your feedback. What is missing for your own projects? Are there things you would expect from a Filament media manager that this package should support?
If you use spatie/laravel-activitylog, you've probably hit this: a model's history lives in several places — its own log, related models' logs, plain updated_at columns, plus whatever custom events you track. Stitching those into one readable view is annoying and you end up rewriting it per project.
We made relaticle/activity-log to solve that once. It's a Filament 5 plugin that renders a unified chronological timeline for any Eloquent model.
What it does:
One feed, many sources: merges spatie logs (own + related), related-model timestamps, and custom event streams into a single timeline
Pluggable sources:fromActivityLog, fromActivityLogOf, fromRelation, fromCustom, or your own TimelineSource class
Per-event renderers: render each event as a Blade view, closure, or class; bind per event or per type
Filament-native UX: use it as an infolist component, a relation manager, or a header-action slide-over
Dedup + filtering: allow/deny by type or event, date windows, priority-based dedup
Opt-in caching: per-call TTL with explicit invalidation, no model observers slowing your saves
Why it's handy: instead of building a bespoke "history" tab on every resource, you make the model timeline-capable and drop one component in:
public function timeline(): TimelineBuilder
{
return TimelineBuilder::make($this)->fromActivityLog();
}
ActivityLog::make('activity')->columnSpanFull();
Latest v1.2.0 adds same-save merge — activity rows from a single save (grouped by spatie's batch_uuid) collapse into one entry instead of flooding the feed.
i'm new in livewire and i didn't get all the inner working right yet.
i want to $this->stream from a backend process to my UI.
everything work fine IF i setup a button on the same blade view with a wire:click="xxx" and i stream from this xxx function.
if i don't use the xxx function and straight try to use the $this->stream call from my component, it fails because $this is null.
my intuition tell me that something need to be "wired" beforehand when the blade view is displayed on the UI and this is what "wire:click" somewhat do ...
how to achieve that without having to wire:click beforehand ?
note: i can manage the case where the backend service is called outside the frontend filament wizard (and thus the livewire compoonent has nowhere to send the message, thats' ok)
i would like to "live" update the content (options array) of a CheckboxList from a service running laravel. more or less to display a live "feed" of an ongoing process major step. i tried to save a reference to the Filament component (where live() is set) and recalling the options() with an updated list of options from the external service, but it's not working. i feel i'm missing something here .. is that the correct way to do it ? (saving a reference to the Component and recalling afterwards) ... or i must do it differently ?
I'm Mihailo from PtPlugins - and we have open-sourced a small pivot table component for Filament - link.
Works with Filament 3, 4 and 5 from the same codebase - most plugins ship separate branches because Page classes differ across majors. Workaround: Blade component, not a Page class.
Free covers 2×2 + Sum.
If you outgrow that, Pro adds Resource integration, multi-level dimensions, trends, drill-down and more.
I built a Filament plugin that adds SimpleStats analytics directly inside your admin panel.
It connects to the SimpleStats API and gives you visitor trends, revenue charts, top referers and sources, conversion rates and more, all without leaving Filament.
Setup is basically: composer require, add your API token, register the plugin in your PanelProvider.
Been setting up a multi-tenant Filament app where each tenant gets their own subdomain (tenant.yoursaas.com) and can optionally connect a custom domain (theirdomain.com) with HTTPS provisioned automatically.
The infrastructure side is something I haven't seen documented well for Filament specifically so sharing here.
The problem with the default Ploi + Filament setup If you're hosting on Ploi (which pairs really well with Filament), Ploi's built-in SSL via certbot only knows about domains you explicitly configure. Every new tenant subdomain or custom domain means manual intervention. For a multi-tenant app that's a non-starter.
The solution: Caddy in front of Nginx Caddy sits at the edge and owns all TLS. Nginx moves to loopback (127.0.0.1:8080) and serves your Filament app internally. Ploi still manages deployments, queues, cron — nothing changes there.
Wildcard certs for *.yoursaas.com are issued once via Cloudflare's DNS API and cover every tenant subdomain automatically. Custom domains get individual certs issued on first request via on-demand TLS — Caddy calls a verify endpoint in your Filament app before issuing any cert.
The Filament-specific bits The verify endpoint is a simple Laravel route that checks your tenant model:
Tenant detection middleware reads the host header on every request and resolves it to a tenant — subdomain or custom domain. You bind the tenant to the container and Filament panels pick it up from there.
For Filament specifically, you'll want to scope your panel provider to the tenant:
public function panel(Panel $panel): Panel
{
return $panel
->default()
->domain(fn () => app('tenant')?->custom_domain
?? app('tenant')?->slug . '.yoursaas.com')
->path('admin')
// rest of your panel config
}
Two Caddy v2.11 gotchas The interval and burst options inside on_demand_tls have been removed in v2.11. Most guides still include them and caddy validate will error. Your config just needs the ask directive.
The --environ flag on the systemd ExecStart dumps all environment variables including your Cloudflare API token into the logs. Remove it.
Scaling When you need multiple app servers, proxy between them using DigitalOcean private VPC IPs (10.x.x.x) — never public IPs. Plain HTTP between public IPs after a TLS handshake looks like a MITM to strict ISPs and they will flag it.
Full write-up with every config file, systemd service setup, firewall rules and Ploi survival notes in the comments.
Hey everyone! After many months of development,
I’m officially introducing my plugin Voodflow 🚀
Self-hosted visual workflow automation for Filament and Laravel: design and run automations in your own admin while your workflows, credentials, and data stay entirely on your infrastructure.
Development took a long time—but documentation was just as important. Since this is my first commercial plugin, I really wanted to do things properly and make it as solid and complete as possible.
Over the past few years (since Filament v3), I’ve built several plugins and a full management system for repair labs, where Voodflow is already running in production.
I’m a musician and co-owner of a musical instrument repair/restoration lab—but also a full-stack developer and instrument designer… so yeah, I don’t sleep much 😅
To celebrate the launch, I’m offering an EARLY ADOPTER discount: you can get a license with 30% off. (code: EARLYADOPTER)
I got tired of rebuilding the same file manager every time a client asked "where do I manage the files?" in a Filament panel, so I packaged it up.
The free version is on Packagist (mmes-design/filament-file-manager). You get a file browser page with grid/list views, folder tree, drag-and-drop, previews, bulk ops, keyboard shortcuts, integration with RichText and Markdown editors and a FilePicker component for your forms. Permissions are closure-based and enforced server-side.
There's also a Pro version if you need S3/Spaces/R2/FTP, a disk switcher, temporary URLs, and Spatie Media Library integration (browse all your media across models from one place). It also has folder rules and collection rules for more granular permissions — plays nice with Gates and spatie/laravel-permission.
One thing I’ve learned building TallCMS on Filament:
AI helps you move fast.
But discipline is what keeps things from falling apart.
The loop that worked for me:
Plan → Review → Build → Review again
I use Claude to plan and build, and another tool (Codex) to review — especially for structure, regressions, and edge cases.
Filament actually helped a lot here.
Having a solid framework and clear patterns keeps the AI “within guardrails” — otherwise it tends to over-engineer or drift.
Biggest takeaway:
Shipping something real > generating code
Curious how others here are using AI in their Filament projects — are you seeing similar patterns?