wallacemartinss/filament-onboarding
Database-driven onboarding for Filament v5: a progress checklist that follows users across every panel page, guided spotlight tours, video steps, and condition-based steps that complete automatically so existing users enter journeys already partly done.
Architecture fit. Unchanged in substance: a Filament panel plugin delivered as a standard Laravel package (service provider, config, publishable migrations, views/assets). Journeys, steps and per-user progress are database-backed, while completion logic is delegated to host-registered conditions — the right seam for a TPM, since product owns journey content and ordering and engineering owns only the predicates. The notable addition in this release is that the destination picker now lists a panel's ->tenantProfile() page, not just ->pages(), so a multi-tenant onboarding can finally route "finish setting up your team" to the tenant profile. That narrows one of the gaps flagged in the previous assessment, though it addresses destinations, not progress scoping.
Integration feasibility. Low-friction, but the version story has changed materially and for the better. The previous assessment described this as a v5-only package. It is now two maintained lines sharing one source: 1.x on Filament v4 (this release, the backport of v2.6.0) and 2.x on Filament v5 (upstream). Consequences for us: (a) a greenfield Filament v5 panel sits on the 2.x line, which is the upstream where fixes originate — good; (b) v4 panels now have a supported path rather than being stranded; (c) Filament v3 remains out of scope; (d) we must be explicit that 1.x is a manual backport line, not the stable branch — Dependabot only targets the default branch, so 1.x toolchain and dependency updates arrive by hand, as they did here. Pinning must record which line, not just a version.
Technical risk.
queue:work, serving stale flows until a worker recycled. Fixed, but it confirms the caching model is subtle and that long-lived-worker deployments carry a distinct risk class. Condition-evaluation cost per page view still needs our own measurement.form.details.title vs the bare name title) previously broke every stop on a Group/Section/Tab/wizard-nested form, and the picker returned no targets at all on 8 of 34 form resources that reached for the Livewire component. Both fixed. This was the single largest "will tours actually work on our forms" risk and it is now substantially retired — but it also demonstrates how fragile the selector layer is and how easily the failure is silent.localStorage, so a broken selector returns stalled on every reload until the subject presses Skip. The specific cause is fixed; the design pattern is that tour failures are sticky and user-visible. Demand a fail-open/dismiss path.php artisan filament:assets. A skipped asset rebuild yields a stale runner — a visible, confusing failure in an otherwise no-op upgrade.Key questions.
filament:assets) be automated in our deploy pipeline, and is there a smoke test that catches a stale tour runner?Stack fit. Unchanged: Laravel on a current PHP 8.x runtime, Filament, Livewire, and the existing panel — no separate admin surface, no new identity concept. Reuses the existing User model and panel middleware. Multi-tenant panels should now expect the tenant profile to be reachable as a journey destination; validate tenancy and progress scoping before authoring.
Migration path. Still no incumbent worth displacing in most cases — the alternative is scattered, untracked welcome modals. Where such code exists, inventory it, map each step to a condition or page-reach trigger, run in parallel on staging, then delete the old widgets. Content migration remains a product task with a content-freeze window, not a code freeze. New this release: the target picker now works on nested forms and forms that introspect the rendering component, so re-audit any form resources previously written off as "can't be toured" — on the upstream panel that was roughly a quarter of them.
Compatibility. Pin the package and record the line (1.x for Filament v4, 2.x for v5); do not float. Treat the asset rebuild as part of the upgrade, not an optional step: the tour runner changed in this release and a stale runner is silently wrong. Verify published assets survive filament:assets and production builds, test against our custom theme, and confirm locale resolution per request. Add a smoke test that boots the panel and renders a page with an active journey — it catches both Filament-upgrade markup changes and stale-asset regressions.
Sequencing.
php artisan filament:assets and the smoke test.Maintenance. Our surface is conditions, content, and translations; the vendor surface is now two lines with a manual backport between them. Budget a few hours per Filament minor upgrade for regression testing, plus asset republish. Vendor risk is lower than the prior assessment implied — external contributors, a real production reference implementation, and a maintainer actively fixing Octane-correctness bugs — but it is still a small project. Keep the version pinned, keep an internal-fork readiness check (MIT permits it), and name an owner who watches releases and knows which line we track.
Support. Two channels, as before: engineering for conditions and rendering, product/ops for authoring. The authoring channel gains a specific runbook item — if a tour stalls, the subject is stuck until Skip, and the stall survives reloads. Give support a documented escape hatch and a way to preview a journey as a specific user. Localization still adds a translation workflow with a fallback policy.
Scaling. Server-side: the checklist-on-every-page pattern remains the scaling question; per-request condition evaluation and progress lookups multiply across page views. Expect request-level memoisation or a short-TTL per-user cache, with cheap indexed conditions. Progress rows grow users × journeys — trivial in size, but they need a cleanup policy for deleted users and retired journeys. Client-side: meaningfully better after this release — the per-frame render/poller storm while waiting on a hidden target is gone, and horizontal-scroll targets (every table on a phone) now resolve — but tour JS still scales with the browser, not the server.
Failure modes.
Next disabled, stall persisted in localStorage until Skip. Specific causes fixed; the sticky failure mode is by design.filament:assets is skipped.queue:work, but verify on our topology.Ramp-up. Engineering ramp-up stays low — roughly half a day to a day for a Laravel/Filament developer to install, author a journey, and register a condition. This release adds a short but non-zero upgrade-runbook step (asset rebuild plus smoke test) that should be scripted once and forgotten. Product ramp-up remains the larger investment: an authoring walkthrough, a copy/translation style guide, and a documented definition of "done" per step. Time to production pilot is still plausibly one to two weeks, with the remaining uncertainty concentrated in multi-tenant progress keying, per-request performance under our load, and the backport policy for whichever line we adopt rather than in the integration itself.
How can I help you explore Laravel packages today?