joy/voyager-export
Export Voyager admin data to Excel or CSV in one click. joy/voyager-export adds BREAD-aware export actions to Laravel Voyager, letting you download any table, filtered list, or dataset straight from the admin panel.
Architecture fit. joy/voyager-export is a plugin for Voyager, the Blade-based Laravel admin panel. It extends Voyager's existing BREAD (browse/read/edit/add/delete) listing screens with export actions rather than introducing a parallel admin surface. That means fit is binary: on a Voyager-backed admin it slots into the existing menu, ACL, and datatable conventions with little ceremony; on Filament, Nova, Inertia, or a custom admin it has no role. As a rule, the module is only worth evaluating if Voyager is already a committed part of the stack.
Integration feasibility. Straightforward in mechanics: composer require, service-provider auto-discovery, likely a published config, a Voyager menu entry, and role/permission assignment through Voyager's own ACL. Expect a spike measured in hours. The real cost is not installation but the transitive surface: the joy-voyager-* family (datatable/bread modules) plus a spreadsheet library (PhpSpreadsheet or maatwebsite/excel) will land in composer.lock and become constraints you carry forward.
Technical risk.
Key questions.
joy-voyager-* and spreadsheet packages are hard dependencies, and what are their maintenance states?Stack fit. Assumes PHP 8.x, a Laravel version within Voyager's supported window, and Voyager 1.6+. Database-agnostic, since export is driven by the BREAD query layer. Confirm the package's composer.json constraints before committing — a narrow Laravel range is the most likely blocker.
Migration path. Export is a shallow feature with a thin seam: one route, one button, one serialization concern. That makes lock-in low. If the admin is later rebuilt on Filament or a custom panel, the export capability is reimplemented against the same domain queries in a day or two. Do not let the package's data-shaping logic leak into controllers or models; keep it behind an internal ExportService contract so the swap is mechanical.
Compatibility. Pin exact versions in composer.json and commit the lock file. Add a CI smoke test that exercises one export end to end so Laravel upgrades fail loudly rather than silently at runtime. Where the package's constraints and the application's diverge, resolve with a fork rather than by holding the framework back.
Sequencing.
Maintenance. Budget for ownership, not consumption. Assume you will vendor or fork the package. There is no release cadence to depend on, no deprecation policy, and no security disclosure channel — you are the maintainer of record for any security defect found in it.
Support and ramp-up. No documentation community, no issue triage. Onboarding cost is modest: a Laravel developer needs roughly one to two days to learn Voyager's BREAD, ACL, and menu conventions, and the package's own code surface is small enough to read in full. That readability is the main mitigant to the abandonment risk.
Scaling. Synchronous spreadsheet generation is memory-bound and will exhaust limits in the tens of thousands of rows, particularly on shared or containerized hosting with low memory_limit. Push exports to a queue, stream CSV rather than materializing a workbook, cap concurrent exports, and rate-limit the route. Export is also a database-load amplifier — a full-table export runs the same query as the listing screen without pagination.
Failure modes.
=, +, -, @ prefixes) if exported cells are opened in Excel.Recommendation. Conditional adoption. Use it only where Voyager is already committed, pin and fork it from day one, gate the route with explicit authorization, and queue anything beyond pilot volumes. Absent an existing Voyager investment, build the export in-house — the package's low adoption, single maintainer, and commodity scope make it a liability that does not repay the diligence it requires.
How can I help you explore Laravel packages today?