relaticle/flowforge
FlowForge is a Laravel package for building and running workflows and automations in PHP. Define multi-step processes, persist state in the database, and execute steps via queues—useful for approvals, onboarding, and other business logic.
Flowforge is a Laravel Kanban package with two rendering modes: Classic and Modern. v4.3.0 only touches Modern — Classic boards are byte-for-byte unchanged, so the upgrade path depends entirely on which mode your boards use.
First steps on a fresh install:
config/flowforge.php first. That's where board defaults, asset/route registration and mode selection live. Read it before writing any board class.First use case to aim for: a single board page for one aggregate (project, sprint, pipeline), Classic mode, drag-and-drop persisting to an order column. Once that renders, flip the same board to Modern to pick up grouping and collapsible lanes.
Pick the mode per board, not globally. Since Classic is unchanged in this release, put Modern on your highest-traffic boards where the new perf and lane UX matter, and leave heavily customised boards on Classic. This gives you a per-board rollback if something regresses.
Replace custom swimlane code with "Group by". Modern lanes now ship a group-by menu plus sticky lane labels and collapsible lanes. If you previously built your own grouped views by issuing multiple board instances or post-processing the card query, delete that and drive grouping through the board definition instead — you get sticky headers and collapse for free, and one board page instead of N.
Stop shipping card payloads to the browser. The headline change is real: a 125-card flat board dropped 2.6 MB → 1.0 MB because per-card records are no longer embedded in the HTML. The pattern this enables: render cards server-side as the package does, and when a user opens a card action, fetch the detail over Livewire/a small endpoint rather than reading inlined JSON. If you were relying on embedded records to avoid a round-trip, this is the one place you'll feel the change — the fix is an on-demand fetch, not a workaround.
Keep your Alpine state owned by you. Write x-data on your own wrapper and talk to the board through $wire, Livewire events, or the package's public props. Never treat the board component's internal $data as an API — this release proves the point.
Eager-load what your card view renders. Payload got smaller, not zero. Cards still render N times; any relationship touched in the card partial must be eager-loaded in the board query or you've traded a big HTML payload for an N+1.
Test the board as a Livewire component. Assert the rendered board contains the expected card titles, then fire the drag/order persist path and assert your ordering column. This catches both query regressions and the click/drag behaviour change below.
$data.state is gone on Modern boards. If your Alpine code read it, it silently loses its value — no deprecation, because it was never part of the contract. Grep your Blade views for $data and move that state into your own x-data before upgrading. This is the only breaking-ish change in v4.3.0 and it is scoped strictly to Modern.composer update. New group-by menu, sticky labels and collapse are UI-layer; if the board HTML references assets you haven't republished (or your build cached them), the features appear broken rather than missing. Clear view/asset caches too.wire:key values or you'll see state bleed between cards after a group-by switch.How can I help you explore Laravel packages today?