firefly/filament-blog
Feature-rich Filament blog plugin for Laravel 11 and Filament 3.x with scheduling, SEO meta tags, comments, newsletters, social sharing, author blocks, and configurable table of contents.
Architecture fit. firefly/filament-blog is a standard Laravel package with a Filament plugin entry point (Blog::make() inside a panel provider). It honors the conventional package contract — service provider, publishable config (filamentblog.php), publishable views/components/migrations, and artisan installers (filament-blog:install, filament-blog:upgrade-tables). There is no sidecar service, no external CMS, and no separate datastore, so it drops into an existing Laravel 11 + Filament 3 app with minimal architectural negotiation. The important caveat for a TPM: this is not an admin-only add-on. It ships its own public request surface (/blogs by default), front-end Blade views, a comment system, a newsletter subscriber list, and an outbound mail pipeline triggered on publish. The decision on the table is therefore "adopt a blog subsystem" — with its own routes, schema, PII, and deliverability obligations — not "install a CRUD screen." That framing should drive the review bar.
Integration feasibility. The happy path is short and well documented: composer require → filament-blog:install → edit filamentblog.php → php artisan migrate → storage:link → register the plugin in the panel provider. Two config touchpoints dominate feasibility assessment. First, the user block defaults to a package-owned model (Firefly\FilamentBlog\Models\User) — in any real application this must be repointed at the app's own User model, with foreign_key and columns.avatar mapped to existing schema. Second, the tables.prefix setting must be decided before the first migration, because changing it later requires the filament-blog:upgrade-tables command, which mutates live tables. Front-end adoption is the real cost driver: if our public site is server-rendered Blade, the package views are reusable; if it is a Next.js/headless front end, we consume only the data model and discard the shipped views, which means either forking views or writing a separate read API — a scope increase worth surfacing early.
Technical risk. Ranked for planning purposes:
NOASSERTION while the README and LICENSE.txt claim MIT. This is a documentation/packaging inconsistency, not necessarily a legal problem, but it must be resolved by legal before code is merged. Do not treat "MIT" in the README as sufficient evidence.readme, releases — no test suite or CI badge is evidenced. A package with no observable tests plus a destructive table-migration command is a combination that warrants a hands-on spike.Key questions to close before committing.
LICENSE.txt)? Legal sign-off required.main?Stack fit. Strong on paper: Laravel 11 + Filament 3 is the documented target, and the package uses only first-party Laravel primitives (Eloquent migrations, filesystem disks, mail/notifications, Blade views). No new runtime, no new infrastructure. The gating assumptions are (a) our Filament version matches a supported branch and (b) our public site is Blade-rendered. If either fails, the integration cost shifts from "config" to "fork + custom API layer," which changes the estimate by an order of magnitude.
Migration path. The package owns its own tables with a configurable prefix (fblog_ by default). Because tables.prefix must be fixed before the first migrate, prefix selection is a pre-work decision, not an implementation detail — pick it once and lock it in the ADR. Content migration from an incumbent blog (WordPress, Markdown, Ghost) is not provided by the package; posts, categories, authors, slugs, and images must be mapped by hand or by a bespoke importer. Budget this explicitly — it is routinely the largest line item and the package contributes nothing to it. SEO continuity (301s from old URL structures to /blogs/{slug}) is likewise our responsibility, and the configurable route.prefix and route.home keys are the levers.
Compatibility and versioning. Pin the package to an exact version and pin Filament to a compatible major in composer.json; treat both as a coupled upgrade unit. Because the package has historically shipped Filament-major support in lockstep, plan for the package upgrade to be a prerequisite of any Filament upgrade, and for there to be no migration guide when that happens. Establish a policy now: if a Filament upgrade lands and the package has not caught up within N weeks, we fork.
Sequencing (recommended).
show_author, TOC enabled/disabled, queue vs. sync mail.storage:link in the deploy pipeline, queue worker capacity for notifications, scheduler entry for future-dated posts, mail domain authentication (SPF/DKIM/DMARC) before the first newsletter send.Maintenance. This is the dominant ongoing cost and should be stated plainly in the business case: we are adopting an unowned-by-us dependency with one effective maintainer and zero dependents to share the burden. Practical posture is a named internal owner, a pinned version, and a standing quarterly review of upstream activity. If upstream goes quiet, the fallback is a fork — cheap to execute (it is a normal Laravel package) but it converts a config-level dependency into a code-level one we must patch against every Filament major. Publishable views are our primary customization lever and also our primary upgrade friction: every published view becomes a file we must diff on upgrade.
Support. There is no commercial support tier. Upstream responsiveness is best-effort via [email protected] and GitHub issues. For a TPM this means the internal team is tier-1 and tier-2 support for anything blog-related — including bugs that originate upstream. Do not route this to a marketing or content owner. Security disclosures go to the same email with no published SLA or CVE process.
Scaling. Request-path scaling is conventional Laravel: cacheable public pages, indexable slugs, standard Eloquent reads. The pressure points are the ones typically unaddressed by packages of this profile: image delivery through the public disk (needs CDN in front, or the blog becomes the slowest page on the site), N+1 queries in category/search listing views, and comment writes hitting the primary database unpaced. Newsletter fan-out is the only genuinely non-linear workload — publishing to a large list must be queued and chunked, or the publish action becomes a request-timeout incident. Confirm before launch.
Failure modes to design against.
filament-blog:upgrade-tables rewrites table names; running it against production without a verified backup and a dry run is a rollback-hostile operation.storage:link in a container build produces broken images that look like a content problem, not an infra problem. Put it in the pipeline, not a runbook.route.prefix of blogs can shadow or be shadowed by existing routes; check the route table in staging.Ramp-up. One Laravel engineer familiar with Filament can reach productive competence in roughly 1–2 days; the install and config surface is genuinely simple. Content-team onboarding to the admin UI is under half a day. The non-obvious ramp-up cost is organizational: someone must own the fork-or-follow decision, the upgrade cadence, and the newsletter compliance posture — a blog that "just works" is precisely the kind of surface that gets neglected until an upgrade or a spam incident forces attention.
TPM recommendation. Viable and low-effort to pilot, but not a "set and forget" dependency. Fits best as an internal, low-stakes or secondary content surface where a fork is an acceptable outcome and where a Blade front end already exists. It is a poor fit for a revenue-critical marketing site, a headless front end, or an organization without capacity to own a fork — primarily because of licence ambiguity, single-maintainer risk, and the undocumented 3.x → 4.x upgrade path. Gate the pilot on legal clearance plus a two-day spike, and make the fork-or-follow decision at day 90 rather than deferring it.
How can I help you explore Laravel packages today?