dragon-code/laravel-feeds
dragon-code/laravel-feeds is a lightweight Laravel package for generating RSS and Atom feeds from your application data. Define channels and items with a simple API, customize feed metadata, and serve standards-compliant XML to readers and aggregators without hand-writing feed markup.
Architecture fit. Unchanged in substance. Laravel Feeds remains a serialization layer between your query/data layer and a feed consumer (marketplace, price aggregator, ad platform). The 2.0.0 release actually sharpens this picture: the notable additions — per-feed converter configuration, per-item date formatting, slug-derived filenames — are all output-shaping concerns, not pipeline concerns. That confirms the package is deliberately narrow, which keeps coupling low and keeps the real contract at the file format rather than the package API. The "split feeds" work referenced in the performance fixes (#313, #314) suggests the package does handle partitioned output for large catalogs, which nudges it slightly closer to a batch-export tool but still nowhere near ETL/CDC territory. Fit is good for scheduled catalog and pricing exports from a Laravel app; still a poor fit for streaming, sub-minute freshness, or general data movement.
Integration feasibility. Composer install, config publish, feed definition, artisan/queue entry point — same as before, and the docs surface has grown again (API config-attribute reference, 1.x→2.x upgrade guide, README clarity pass on commands). Feasibility now hinges on a version-matrix question rather than a discovery-cost question: 2.0.0 is explicitly built for PHP 8.4, Laravel 13, Pest 5. That is a forward-leaning support matrix. If your fleet is on Laravel 10/11 or PHP 8.1–8.3, this release may not be installable, and you would be adopting the 1.x line — which in turn raises the question of how long 1.x gets fixes. Confirm the actual composer.json constraints rather than inferring from release notes. [unverified] I still have not read the generation path to confirm whether output is streamed to disk or buffered; the batch-related fixes imply chunked iteration exists, but chunked iteration and streamed writes are not the same thing.
Technical risk. The maturity picture has improved materially and should be re-weighted. A 2.0.0 with a written upgrade guide, a documented config-attribute API, and a run of targeted performance fixes (#313 quadratic split-feed lookups, #314/#315 repeated config resolution, #316 per-row path resolution) is the behaviour of a maintained project with real users hitting real scaling walls. PR numbers in the 280–320 range also imply sustained throughput, not a hobby repo. Risks that remain:
Key questions to resolve before adoption.
Stack fit. Still assumes a current Laravel app, but the assumption is now sharper: 2.x targets Laravel 13 / PHP 8.4. Confirm your upgrade runway before scoping the package work — the integration is trivial next to a PHP runtime bump. Composition with the standard operational stack (scheduler, queue workers, object storage, signed URLs/CDN) is unchanged; the package produces the artifact and nothing else.
Migration path. Two migrations are now in play and should not be conflated:
If you are already on this package at 1.x, the pragmatic sequence is: take the performance fixes only if you are already planning the runtime upgrade; otherwise stay on 1.x and track its support window.
Compatibility. Pin the exact 2.x version in composer.json. Run composer why-not against both your Laravel and PHP constraints before attempting the bump — the failure mode here is a resolver error, not a runtime error, so it surfaces early. Verify ext-xml and ext-mbstring. Treat the marketplace feed specification version as the compatibility boundary that matters most, with the package's own semver second.
Sequencing.
Maintenance. Small code surface, so routine upkeep stays low. The cost that went up, not down, is upgrade cadence: a maintainer shipping majors with platform-floor jumps means you should expect to re-verify dependency constraints and re-run contract tests roughly once per framework cycle, and to absorb consumer-visible naming changes as part of that. Budget for the possibility of vendoring or forking; the code surface makes that tractable, and the release notes suggest the internals are reasonably modular (converters, per-item formatting, split-feed publishers).
Support. Community-only, no SLA. The escalation path remains a GitHub issue. Set expectations internally: the maintainer is highly active, which improves the odds of a fix and worsens the concentration risk if they step away. Keep a named internal owner and a documented fallback — a hand-rolled generator is a few hundred lines — so an unanswered issue never blocks a feed.
Scaling. Generation is CPU- and IO-bound; scale with queue workers, not by tuning the package. The split-feed capability is now the relevant lever for very large catalogs: understand the split capacity, size partitions to stay well under memory limits, and stream each part to a temp file on local disk before moving to object storage. The 2.0.0 fixes target exactly the pathologies that bite at scale — quadratic lookups when publishing split feeds, repeated per-row config resolution, per-row diagnostic path resolution — so large-catalog throughput should be measurably better, but confirm with your own data before assuming it. Watch disk headroom: N concurrent split jobs multiply footprint quickly. Prefer delta/incremental feeds where the consumer accepts them.
Failure modes. Ranked by likelihood:
lazy() used without chunking inside a template, or eager-loaded relations.Ramp-up. A Laravel developer on a compatible stack reaches a first working feed in about a day; the docs have improved again with the config-attribute API reference and the upgrade guide. The effort that needs planning is unchanged and still larger than the integration: scheduling, atomicity, freshness alerting, consumer-side validation, and now a version-migration rehearsal. Treat the package as the easy part and the runtime/filename migration as the project.
How can I help you explore Laravel packages today?