packstub/filament-kanban
Filament Kanban adds drag-and-drop Kanban boards to Filament admin panels. Organize records into columns, move cards between stages, and manage workflows without leaving the panel. Simple setup for Laravel and Filament apps.
Architecture fit
packstub/kanban is a Filament panel plugin that renders a board as a Livewire component, mapping one Eloquent model per card and one enum/closure-defined set per column. v0.2.0 moves it from a display-and-drag widget toward a full work-surface: card and create actions run through Filament's action system, WIP limits and column creatability are enforced server-side, and column summaries plus polling make the board a live operational view rather than a static grid. That is the right architectural direction for a TPM — the enforcement layer now sits on the server, so the board can be trusted as a system of record for column constraints rather than a cosmetic UI.
Integration feasibility
Feasible in a standard Laravel + Filament panel with an existing resource. The package resolves card actions through the board's own query, which means it inherits whatever scoping the board is configured with rather than requiring a parallel authorization path — a meaningful reduction in integration surface. Costs to budget: one Eloquent model plus a status/column attribute per board, a Filament resource (or at minimum HasActions) on the card component, and, for summaries, an aggregate expression per column that must be expressible as a Builder callback.
Technical risk
CreateAction::make()->schema([...]) and the HasActions contract place this firmly in the Filament v4 action API. Teams on v3 will need a v3-compatible branch or a version bump; this is the single largest adoption gate.HasActions get no card or create actions — no exception, no warning. A misconfigured resource renders a plausibly working board with missing capability, which is the kind of defect that surfaces in production, not in review.summarize() runs per column, refreshed after every move. On a wide board this is N aggregate queries per move, uncached unless we add caching ourselves.Key questions
CardMoved dispatched inside a transaction, and is it reliable enough to drive downstream automation (notifications, SLA clocks)?Stack fit Best fit is a Filament v4 panel backed by a single table carrying a column attribute (enum or string) plus an ordering field. Teams already using Filament resources get actions, modals and slide-overs for free; teams without Filament should not adopt this package, since the action, create and card-action surface is now the core value.
Migration path Greenfield boards are straightforward: define the enum, map columns, wire the board query. Brownfield boards already using a hand-rolled drag-and-drop Livewire component should be migrated board-by-board rather than wholesale, because the enforcement semantics change — moves that previously always succeeded can now be refused. Any existing client-side limit logic should be removed at cutover to avoid two sources of truth disagreeing.
Compatibility
Enum columns require HasLabel and HasColor on the backing enum; without them the board renders but columns are unlabelled. Card avatars expect a URL plus display name, so the owner/assignee relation must be resolvable cheaply — eager-load it or the card foot becomes an N+1. The browser kanban-card-moved event gives a low-risk hook for front-end analytics without touching PHP.
Sequencing
Column::limit() and creatable() once the refusal UX is designed.summarize() last, with caching, and measure query count per move before shipping.poll() only after concurrent-edit behaviour is tested with two sessions.Maintenance Small dependency with a fast-moving surface — v0.2.0 alone adds eight feature areas. Pin the version and treat upgrades as scheduled work, not automatic. The ghost/Alpine and dark-mode fixes suggest the drag layer has had rendering rough edges; expect ongoing small patches there.
Support
Support load will concentrate in two places: "the button isn't there" (missing HasActions, or Card::actions() narrowing the list) and "the move was refused" (WIP limit or read-only column, presented without enough explanation). Both are preventable with a short internal runbook and explicit UI copy. CardMoved and kanban-card-moved give support a concrete trace to reason from when a card ends up somewhere unexpected.
Scaling Polling is the main scaling consideration: every open board issues a recurring request, and each poll that returns changes triggers a refresh. Boards with many concurrent viewers, heavy summaries and deep "Load more" pagination will compound. Mitigate by increasing the poll interval for large boards, caching summary aggregates, and capping initial card loads. Auto-loading "Load more" on scroll removes a user gate that previously bounded pagination — watch for long-lived boards pulling large result sets.
Failure modes
HasActions — feature silently absent rather than loudly broken.Ramp-up Low for a developer already fluent in Filament v4 — an afternoon to a first working board, a day or two to production-grade with limits, actions and summaries. Non-Filament developers will spend most of their time on the action system and Livewire lifecycle rather than the board itself. Budget explicit time for the refusal UX and the authorization audit; those are the two areas where the package's server-side guarantees meet our own policy requirements, and neither is fully answered by the release notes.
How can I help you explore Laravel packages today?