robyconte/filament-flow
Filament Flow is a plugin for building visual, node-based workflows and pipelines inside Filament panels. Design flows with a drag-and-drop canvas, connect steps, and control transitions without leaving your admin panel.
We are assessing filament-flow at v0.5.0 from release notes only — no prior assessment exists, and no source artefacts were supplied. The package is a Laravel/PHP Filament plugin that models workflows as state machines: records occupy states, transitions move them between states, transitions are gated by access rules, actor checks and guards, and the whole definition is diffed against a database-persisted workflow (DiffsWorkflowDefinition). v0.5.0 is a feature-and-fix release that materially changes how bulk transitions behave and how definition changes reach an existing database.
Architecture fit. The package is opinionated about two things a TPM should clock immediately: (1) workflow definitions are code-defined but database-persisted, with a diffing layer reconciling the two; and (2) UI affordances (Filament bulk actions) are generated from the same definition. That is a good fit for admin-panel-heavy Laravel estates where state lives in Eloquent models and operators work through Filament resources. It is a poorer fit where workflow state is owned by an external system, where transitions are event-sourced rather than row-updated, or where the admin surface is not Filament.
Integration feasibility. The new forDatabaseRecord() signature is additive ($only is optional and null preserves existing behaviour), so existing call sites should compile. The behavioural changes are the real integration surface, not the API: duplicate-looking transitions now collapse into one action; per-record applicability is resolved through getAvailableTransitions(); and a record that is applicable by state but blocked by access rules, actor or guards is now reported rather than silently absent. Any UI copy, tests, or operator runbooks that assumed one action per transition, or that assumed inapplicable records vanish, will need review.
Technical risk. Moderate, concentrated in three places. First, the dedup rule — "same label, same target state" — is a user-facing heuristic; two genuinely distinct transitions that happen to share a label and target will merge, and the surviving behaviour is whatever getAvailableTransitions() returns for the current user, which is per-user and therefore non-deterministic across the operator population. Second, the docblock no longer promises no-op actions are hidden; a bulk action cannot be hidden record-by-record, so the UI will offer actions that some records cannot complete, and the "reported" path for blocked records is now a first-class UX concern whose presentation we have not seen. Third, the metadata fix silently changes planner behaviour: workflows already in the database will now receive metadata changes that were previously dropped, which means the next deploy can mutate live workflow definitions. That is the highest-risk item in the release and the one most likely to surface as an incident.
Key questions. What does "reported" look like to the operator — a toast, a per-record result row, a partial-success summary? Is the dedup key configurable, and can two transitions be forced distinct? Does the metadata diff apply forward-only, and is there a dry-run or preview for planner changes against an existing database? Is forDatabaseRecord() covered by the package's BC promise, and what is the deprecation policy for the docblock semantics we just lost? Are the EN/IT strings complete, or is filament-flow.bulk_action.not_available the first of a translation set that will need ongoing localisation? What is the minimum Filament and Laravel version this release assumes?
Stack fit. Assumes a Laravel application with Filament as the admin panel, Eloquent-backed records, and a workflow definition expressed in PHP. The metadata fix confirms the package expects definitions to evolve after first persistence, so it fits teams that iterate on state machines rather than freeze them at launch. If workflow definitions are considered immutable in your organisation, the diffing layer is dead weight and the metadata fix is irrelevant — but harmless.
Migration path. Treat this as a minor-version upgrade with non-minor behavioural edges. Sequence: (1) inventory every StateBulkActionGroup::forDatabaseRecord() call site and note whether any relied on duplicate-per-transition actions or on inapplicable records being hidden; (2) run the upgrade in a staging environment against a copy of production workflow tables, because the metadata fix only manifests where definitions already exist — a clean database will not exercise it; (3) diff the resulting workflow rows before and after to see exactly which metadata changes the planner now applies; (4) only then promote.
Compatibility. The $only parameter is backward compatible: omit it and null yields every transition, as before. The dedup and reporting changes are not opt-in and are not guarded by a flag in the notes — assume they apply unconditionally. The translation keys are additive. The docblock change is documentation-only but signals a semantic contract change that tests may encode; grep test suites for assertions that no-op actions are absent.
Sequencing. Land the dependency bump behind the existing test suite first with no call-site changes, to isolate behavioural regressions from your own edits. Then adopt $only deliberately: pass [] as a kill switch for a given bulk action if the new reporting behaviour proves noisy, and pass an explicit allowlist where the dedup heuristic is too aggressive. Adopt the metadata capability last, and pair it with whatever change-management review your organisation applies to production data mutations.
Maintenance. Low ongoing surface — one optional parameter, one dedup heuristic, one translation pair, one diff rule. The maintenance cost is in the heuristic: dedup by label-plus-target means label text becomes semantically load-bearing. A copy edit to a transition label can change which transitions merge in bulk actions. Document that labels are not purely cosmetic.
Support. Expect two new ticket classes. "I ran a bulk action and some records were skipped" — now a designed outcome with a message rather than a bug, so first-line support needs the not_available copy and an explanation of state-applicable versus user-available. And "the workflow changed after deploy" — the metadata fix, which operators may experience as an unexplained state machine edit. Both are documentation problems more than engineering ones, but they will arrive as support load on upgrade week.
Scaling. The dedup and per-record availability resolution move work from "build N actions" to "evaluate availability per record against the current user." For large bulk selections this is a per-record authorization and guard evaluation, which is more correct but plausibly more expensive than the previous path. Worth a load check if bulk actions are run over hundreds or thousands of records; the notes give no complexity guarantee.
Failure modes. (a) Over-merging: distinct transitions with matching label and target collapse, and the surviving action is chosen by getAvailableTransitions(), so two operators may see different actions under the same name. (b) Partial success without clarity: state-applicable-but-user-blocked records need visible reporting or operators will believe the bulk action failed silently. (c) Unannounced definition drift: the metadata fix applies changes to live workflows at deploy time with no stated preview, which is the most dangerous failure mode here — it is a data mutation triggered by a code release. (d) Localisation drift: only EN and IT ship, so non-English, non-Italian panels fall back to keys for the new message until translated.
Ramp-up. Small for developers — one optional argument and a changed expectation about duplicates. Moderate for operators and support, who must internalise "bulk actions cannot be hidden record by record" as a mental model, and who need the new skipped-record messaging explained before the first bulk run post-upgrade. Budget a short briefing and a runbook note for the metadata change; neither is large, but both are load-bearing for trust in the admin panel.
How can I help you explore Laravel packages today?