storyfeed/ui
Storyfeed UI offers ready-made Blade components for building story feeds in Laravel apps. Render feed items, avatars, timestamps, and media with clean, customizable views that drop into any existing layout with minimal setup.
Architecture fit
storyfeed/ui is a presentation-layer package, not a domain package: it ships Blade components plus parallel Vue and React kits, all rendering Storyfeed feed data from the host app. That is a good architectural fit for Laravel teams already on Storyfeed core who want a maintained renderer rather than hand-rolled Blade partials — it keeps view concerns in a vendor package and leaves data/domain ownership with the app. The v0.10.0 additions (Code and Callout body renderers, a headline-text formatting seam) extend the package further into "presentation policy" territory, which is fine, but it means the package now encodes decisions (escaping rules, which tokens get formatted, palette semantics) that product and design stakeholders should explicitly sign off on rather than inherit by default.
The most strategically interesting item is the Laravel Boost guideline and storyfeed-ui skill. Shipping agent-facing setup instructions inside the package — with a test that fails if the guideline names a component, prop, provide key, class or path the package does not actually ship — is unusually disciplined DX work. It directly reduces the cost of the hardest part of adopting this package: wiring the kit, @source lines, Vite alias, and props correctly. For a TPM, that is a measurable onboarding-cost reduction and a credibility signal about how this maintainer works.
Integration feasibility
Feasible for a standard Laravel + Vite + Tailwind app, with caveats. Integration is Composer install, optional php artisan boost:install for agent guidance, kit selection (Blade/Vue/React), then Tailwind @source configuration for either a copied kit or a Vite alias into vendor. The vendor-alias path requires an additional Tailwind scan of vendor/storyfeed/ui/resources/js, now documented in the README — that is exactly the class of step teams skip and then debug for a day. The new FeedMedia payload fix removes a previous sharp edge for custom image renderers, so teams that already forked image rendering have a supported escape hatch instead of a patch.
The main feasibility constraint is version coupling with Storyfeed core. Headline formatting delegates count-token exclusion and pluralisation to core 0.21's headline text API; on older core, headlines silently stay plain. Silent capability degradation by dependency version is a support-ticket generator and should be pinned explicitly in the app's composer.json.
Technical risk
vendor and Tailwind @source scans tie the package to Tailwind v4-era tooling (@theme, @source). Apps on older Tailwind or non-Vite bundlers are out of scope in practice.HeadlineText callback returns trusted HTML and must escape text itself. That is a documented, reasonable design — and a straightforward XSS path for a team that skims the README.Key questions
inlineCode headline formatter on by default, and who owns that product decision?Stack fit
Strong fit for Laravel 11+/12 apps on Vite and Tailwind v4 that already consume Storyfeed core. Weak fit for Livewire-only shops that don't run a JS build (Blade kit partially mitigates), for apps on Tailwind 3, and for apps that cannot accept a vendor-path Vite alias. Confirm the kit choice before scoping: Blade is lowest-risk, Vue/React raise the parity and build-config surface.
Migration path
This is an initial adoption, so the path is greenfield: Composer require with a pinned constraint, publish or alias the chosen kit, add @source lines (including the documented vendor/storyfeed/ui/resources/js scan if aliasing), then run php artisan boost:install to seed the agent guideline and skill. If adopting alongside an existing in-house feed renderer, migrate one body type at a time — text first, then Image via FeedMedia with payload, then Code and Callout — so visual diffs stay legible.
Compatibility
Pin both storyfeed/ui and Storyfeed core together; treat them as a single upgrade unit. Headline formatting requires core 0.21+. HeadlineText is additive and no-ops when unset, so it is safe to ship code that registers it before deciding to enable a formatter. The inlineCode formatter is opt-in across all three kits — good, since enabling it changes rendered headline output and should be a deliberate product call.
Sequencing
inlineCode; audit escaping in any custom Blade callback.Maintenance
Ongoing cost is upgrade-driven rather than runtime-driven. Budget a recurring per-upgrade task: bump package + core together, run a visual diff across every feed surface, and re-check that the Boost guideline still matches the installed version (the package's own test guards the guideline against its own components, but not against our overrides). Custom Blade HeadlineText callbacks and custom image renderers become our code to maintain and secure — treat them as owned code with an escaping review, not as configuration.
Support
Support burden concentrates in three places: build configuration (Tailwind @source, Vite alias), version skew against core (silent plain headlines), and escaping bugs in custom formatters. Pre-1.0 status means upstream support expectations should be modest; the maintainer's CI discipline and the doc-drift test are positive signals, but there is no LTS. Document the internal "which kit, which version pair, which surfaces" answer somewhere durable — the Boost guideline helps agents, not on-call humans.
Scaling
Rendering is server/Blade-side plus client hydration for Vue/React kits; there is no new infrastructure to scale. Real scaling risk is breadth, not load: each additional feed surface multiplies the visual regression surface across three kits, and Code/Callout palettes add light/dark permutations. Keep a representative fixture set (including long code blocks, all five callout intents, unknown intent, dense child rows, full image override) as the regression baseline.
Failure modes
vendor path → unstyled or partially styled components in production only.ui without core (or vice versa) around the 1.0 payload window → renderer errors or mismatched props.note → silent design drift rather than a visible error; worth a lint or test on our side.Ramp-up Low for a team already fluent in Laravel + Tailwind + one of the three kits: the Boost guideline compresses setup to roughly a day for a pilot surface, plus a day for visual QA. Add meaningful time if the team must pick a kit, reconcile Tailwind version, or migrate an existing renderer. Non-frontend stakeholders need a short briefing on two decisions that are now product-visible: the callout intent palette mapping and whether headline inline-code formatting is enabled — both change what end users see and should be owned explicitly rather than defaulted.
How can I help you explore Laravel packages today?