bagistoplus/visual
bagistoplus/visual is a Bagisto package that adds a visual page builder to the admin panel, letting merchants create and edit storefront pages, content blocks, and layouts with drag-and-drop controls—no code required. Built for Laravel/PHP.
Architecture fit. The package is best understood as a Bagisto theme framework that happens to ship as a Laravel package, not the reverse. It layers a block/component registry, a Blade rendering path, and a visual editor on top of Bagisto's existing theme layering. That is a strong architectural fit only if the storefront is Bagisto and server-rendered Blade. On plain Laravel the value proposition narrows sharply; on a headless or SPA frontend, the editor, preview, and asset endpoints have no natural consumer. The first TPM question is therefore not "is this good?" but "are we on the stack this was built for?" If the answer is no, stop here.
Integration feasibility. Composer install is trivial; the real work is configuration and asset build. The product surface is the config block registry plus the HTTP middleware that resolves design/preview mode and bypasses full-page cache. Both are code, not documented contracts, so feasibility depends on in-house Laravel depth to read src/, config/, and routes/ before trusting prose. The alpha.31 draft-preview-without-editor feature and the middleware-order-independent cache bypass are the two highest-leverage capabilities and also the two least documented. Feasibility is reasonable for a team that can read source; it is poor for a team that needs a supported integration guide.
Technical risk. Concentrated in four areas. (1) Preview as a security boundary — something decides who may render unpublished content, and the release notes do not describe signing, expiry, tenant scoping, or replay resistance. Forwarded preview links are the obvious abuse path. (2) Cache bypass scope — too broad degrades origin and invites abuse; too narrow destroys editorial trust with stale renders. The alpha.31 fix is Laravel-level only and does not reach a CDN or reverse proxy. (3) Alpha churn — 31 alphas into a major line with zero dependents upstream means you are the support organisation, and every bump is a re-validation pass. (4) Silent contract drift — the wishlist/compare PHP-to-TypeScript event mirror has no error surface when it diverges; the symptom is missing analytics weeks later.
Key questions. Which Bagisto major line does this alpha actually target, and are PHP/Laravel constraints encoded in composer.json or only in prose? Is the preview URL signed, expiring, and per-tenant/per-user scoped? What exactly does the cache-bypass middleware key on, and does it fail open or closed? Who owns the PHP/TypeScript event contract as a versioned interface? Do we have a fork-ready posture (private mirror, rebasable patch set) before a blocked storefront depends on it? What is our written exit plan if alpha cadence outruns the content tickets it saves?
Stack fit. Adopt only on Bagisto with Blade-rendered storefront views. Confirm the Bagisto major line, PHP/Laravel constraints, and that the package's own composer.json encodes them; if constraints live only in prose, hardening that is ticket one. The native-Bagisto case is the only one where the block registry, editor routes, and theme layering compound rather than conflict.
Migration path. Do not begin with the editor UI. Begin with the registry: register a single reusable promo block (title, body, image, CTA), render it on a non-critical page (category or CMS, never checkout), then generate a draft preview URL of an edit and open it with no editor session. If the preview renders the edited content — not published, not cached — you have proven registry, rendering, and cache bypass in one pass. Only then expand to self-serve merchandising and multi-block composition.
Compatibility. Pin the literal version — bagistoplus/visual:2.0.0-alpha.31, no caret — commit the lockfile, and record the pin plus rationale in an ADR with a named owner. Expect provider auto-discovery, a publishable config, and a Vite/TypeScript asset build; verify the provider namespace against the package's composer.json rather than copy-pasting. Keep blocks presentational and query-free, resolve data in controllers or view composers, and version blocks (v2 alongside v1) because merchants will have saved layouts referencing old prop shapes. Route every composed layout through a single Blade entry point so editor, preview, and published paths are byte-identical by construction rather than by discipline.
Sequencing. (1) Pin, publish, migrate, build assets; stand up the cache-mode header/log affordance on day one. (2) Prove the preview path end-to-end against your real middleware stack. (3) Encode a cache matrix test — {no cache, Laravel response cache} × {middleware orderings} × {guest, editor, preview} — and re-run it every bump. (4) Add CDN/reverse-proxy verification via cache-busting query strings and curl -I against the public hostname, since the package does not reach that layer. (5) Enable the editor behind an env flag and an editor-user allowlist, canaried to one content type and one editor group. (6) Adopt the typed event contract with a parity assertion before wiring analytics or personalization on top of it.
Maintenance. Budget a re-validation pass per alpha bump and triage each changelog entry as breaking vs. additive before merging. Zero upstream dependents and no visible commercial support path mean bug-fix latency is yours; fork or vendor the source into a private mirror and keep patches as a small, rebasable commit set. Keep the package off revenue-critical paths until several upgrade diffs have been characterised. If the cadence cost exceeds the content tickets saved, stopping is a legitimate outcome, not a failure.
Support. Editor-client-free preview turns review into "open this link," which is a genuine reduction in engineering support load — but it shifts the burden to preview-link governance (who receives it, does it expire, can it be replayed). Editorial trust depends entirely on reviewers seeing what they will publish, so every stale-render report is a support escalation with the same root cause: cache mode resolution. Instrument it.
Scaling. Composed pages stack blocks, and a page that is fine with three blocks can quietly issue forty queries with twelve. Assert query counts on the composed page, not on individual blocks. Watch origin load if cache bypass resolves too broadly, and watch asset-manifest staleness if block styles ship through Vite — stale hashed assets look indistinguishable from "the editor didn't save."
Failure modes to pre-plan. Stale preview served from CDN or reverse proxy; preview URL replay by an unauthenticated forwardee; cache-bypass failing open under an unexpected middleware order; silent PHP/TS event drift surfacing as missing analytics; wrong-template renders caused by view precedence (diagnose with php artisan view:clear and php artisan route:list | grep -i visual, then dump the view finder candidate paths); and a divergent fork that cannot absorb upstream fixes.
Ramp-up. The first-use path is a single promo block end to end, which a mid-level Laravel engineer can complete in days if they read src/*ServiceProvider.php, the config registry, routes/, the cache-mode middleware, and the view/TS resources in that order. Full ownership — registry conventions, block versioning, preview security model, cache matrix, event contract — is a multi-week investment for one named owner. Treat that owner as a hard prerequisite: this is a pre-stable package with modest adoption signals, and the decision to build a merchant-facing workflow on it belongs to the PM, paired with a pinned version, a named owner, and a written exit plan.
How can I help you explore Laravel packages today?