awcodes/filament-badgeable-column
Filament Badgeable Column lets you show additional context as badges alongside table column values. Add prefix or suffix badges with dynamic labels and colors, making statuses and metadata easier to scan in Filament tables.
Architecture fit. This is a thin presentation-layer add-on, not a domain package. BadgeableColumn extends Filament's own TextColumn, and Badge is a small value object with label(), color(), textColor(), visible(), fontFamily(), weight(), and size() supporting closures. There are no migrations, no service-provider bootstrapping of business logic, no persistence, no auth surface, and no API contract. It renders in both Filament tables and infolists, and works with the Panels package or the standalone Tables package. Adoption therefore commits us to nothing architecturally — the blast radius is one column class and a CSS build step. It is a UX/scanability tool for back-office operators, not a data-modeling one.
Integration feasibility. High. composer require awcodes/filament-badgeable-column, add one @source glob to the theme CSS, and swap individual TextColumn::make() calls for BadgeableColumn::make() with prefixBadges() / suffixBadges(). Because it subclasses TextColumn, existing ->searchable() / ->sortable() chains survive the swap. Realistic effort for a pilot resource: 3–5 dev-days including theme rebuild, eager-load audit, and UX review.
Technical risk. The dominant risk is tight coupling to Filament's TextColumn internals, and the changelog proves it is not theoretical: Filament 4.15/5.10 added parameters to TextColumn::getPrefix()/getSuffix(), which produced a fatal error on load until v3.2.1; Filament 5.7+ changed default state handling and broke rendering until v4.1.0/v3.2.0. The failure mode is "admin tables 500 on a framework minor bump" — high visibility, low detectability by unit tests. Secondary risks: the two-track version matrix (3.x for Filament 4.x with backports, 4.x consolidated for Filament 4.x and 5.x) means a fix can land on the line we are not on; the CSS @source requirement fails silently as unstyled or invisible badges; and the composite score (30.4, opportunity 43.1) with 148 stars, 0 listed dependents, and a single maintainer reflects a bus factor of one, mitigated only by MIT licensing and a surface small enough to fork credibly.
Key questions.
@source glob acceptable to platform/DevOps?Stack fit. Laravel 12/13 on PHP 8.3–8.4 (current test matrix) with Filament 4.x or 5.x → plugin 4.x. Filament 3.x panels must stay on plugin 2.x; Filament 2.x on 1.x. Legacy panels should be treated as out of scope rather than pinned to abandoned lines.
Migration path. No data migration, no schema change. Convert columns incrementally, one resource at a time; rollback is a one-line revert per column plus composer remove. That reversibility is what justifies piloting rather than a design review gate.
Compatibility and sequencing.
@source '../../../../vendor/awcodes/filament-badgeable-column/resources/**/*.blade.php'; to the theme CSS and rebuild; verify compiled CSS actually contains the badge/color utilities.BelongsToMany topics pattern in the README) will N+1 unless ->with([...]) is added — make this part of the conversion checklist, not an afterthought.SelectFilter/TernaryFilter on the same attribute; a visible status the user cannot filter on is a UX regression.Sequencing against platform work. Schedule independently of any Filament major upgrade — that is precisely when the package's overrides break. When Filament does bump, upgrade both in the same PR with a visual QA pass on table pages.
Maintenance. Low steady state, non-zero. Two live release lines plus backports means subscribing to releases and reading both changelogs each bump. Budget ~1–2 dev-days per quarter, spiking to 1–2 days whenever Filament ships a minor touching TextColumn affixes or state handling.
Support. No vendor SLA. Community GitHub issues, single maintainer. The credible escalation path is fork-and-patch; name one backend owner (column logic) and one frontend owner (theme/CSS) so styling drift does not accumulate unowned.
Scaling. Rendering cost per row is trivial. Real scaling risks are (a) N+1 from closure badges on relationships and (b) badge explosion on wide tables — cap or truncate with a "+N" affordance, and validate at realistic page sizes including Filament's "all records" pagination option.
Failure modes.
@source glob is missing or assets are stale. Detect with a snapshot test on one table page.Ramp-up. Half a day. Any developer who has written a Filament TextColumn already knows the API. The one footgun to teach explicitly: fontFamily(), weight(), and size() on the column style the column text, while the same calls on Badge style the badge — called in the wrong place you get mis-styled cells, not an error. Also teach the house convention: "if you badge it, filter it."
Verdict. Adopt for internal admin UX if we are already on Filament 4/5 with a custom theme, treating it as a cosmetic, non-load-bearing dependency pinned lockstep with Filament and forkable on short notice. Do not adopt it as the vehicle for anything a user must filter, sort, or export — that is a first-party build, not a plugin.
How can I help you explore Laravel packages today?