elemind/filament-echarts
Filament ECharts integrates Apache ECharts into Laravel Filament panels, making it easy to add beautiful, interactive, customizable charts and widgets with a simple PHP API. Ideal for dashboards, reports, and responsive data visualizations.
Architecture fit. elemind/filament-echarts is a thin integration layer, not a charting engine. Its architectural job is narrow and well-defined: register the Apache ECharts JS bundle through Filament's asset pipeline, expose a Livewire widget (or Blade component) that accepts an ECharts option array from PHP, serialize it to JSON, and hand it to Alpine for client-side initialization. That is a natural fit for Filament's plugin model — Filament is itself a Laravel package that expects third-party panels to register assets via FilamentAsset::register() and widgets via Livewire components. The package does not need to touch Eloquent, routing, auth, or the panel lifecycle, so its blast radius inside a Laravel app is small.
The architectural caveat is that the glue sits on the two fastest-moving surfaces in the Filament stack: the asset registry (which changed shape between Filament v3 and v4) and the Livewire render/morph lifecycle (v3 → v4). A package this thin has little internal surface area to absorb churn, so its long-term viability is almost entirely a function of whether the maintainer keeps pace with Filament majors.
Integration feasibility. Mechanically straightforward: composer require, register the plugin in the PanelProvider, publish/compile assets. Expect hours, not weeks, for a first chart. The real feasibility questions are behavioral, not procedural:
tooltip.formatter, axisLabel.formatter, symbolSize, rich-text label renderers). A PHP-array-only API either drops these, accepts raw strings (escaping/XSS exposure), or requires Laravel's Js::from() and a serialization contract. This is the single most common failure point in ECharts wrappers and determines whether the package is a toy or production-grade.wire:navigate SPA transitions, Livewire re-renders, and tab/visibility toggles — requiring wire:ignore, explicit dispose(), resize observers, and setOption(..., { notMerge: true }) semantics. Getting this wrong produces blank-canvas bugs that are intermittent and expensive to diagnose.Technical risk.
| Risk | Severity | Notes |
|---|---|---|
| Bus factor / abandonment | High | 15 stars, 0 dependents, single maintainer. No ecosystem validation. |
| Filament/Livewire major-version lag | High | Thin wrappers break silently on filament:upgrade; no compat matrix visible. |
| Metadata anomaly | Medium | "Last release 2026-08-28" is future-dated; verify actual Packagist release cadence and commit history before trusting. |
| CSP / asset injection | Medium | Inline option scripts can violate strict CSP; Filament nonce handling must be confirmed. |
| JS callback serialization | Medium | Determines ceiling on chart sophistication; also an XSS vector if options embed user data. |
| Test coverage | Medium | Client-render behavior is hard to unit test; check for Dusk/browser tests and CI matrix. |
| Client-render only | Low–Medium | No server-side image; PDF/email exports and no-JS fallbacks require a separate path. |
Note the aggregate score (17.4/100) and zero dependents. That is not a statement about code quality — it is a statement about unvalidated supply chain. Treat the package as a well-scoped prototype accelerator, not an infrastructure dependency, until it clears an internal audit.
Key questions to answer before adoption.
^3.x, ^4.x) and Livewire versions are constrained in composer.json? Is the constraint honest, and is there a CI matrix proving it?ChartWidget / Widget contract, or ship a parallel abstraction? Contract alignment determines whether it inherits filters, polling, lazy-loading, and column-span behavior for free.Js::from(), raw strings, or unsupported? What is the escaping story?fetch? Is there server-side downsampling?wire:navigate, polling, and re-render? Any documented dispose() handling?SECURITY.md, release cadence, and issue responsiveness?composer audit cleanly?Stack fit. Laravel 11/12 + Filament 3.x or 4.x + Livewire 3 + an existing Vite/Tailwind theme. The package should slot in as a panel plugin alongside your existing theme build, with ECharts loaded through Filament's asset registry rather than a hand-rolled <script> tag. If your panel already uses a custom Vite theme, confirm the package doesn't double-register assets or fight your bundler.
Migration path. Do not rip out Filament's built-in Chart.js widgets. Run them in parallel and migrate per chart type, on the basis of capability gap rather than novelty:
large: true, dataZoom, progressive rendering).App\Support\Charts\BaseEchartsWidget) that extends the package's widget, owns the option-building DTO, and centralizes theme tokens, resize handling, and wire:ignore/dispose behavior. All application widgets extend your class, never the vendor class directly. This is the swap seam — if the package is abandoned, you replace one file's parent class.Compatibility. Pin exact package versions in composer.json (not ^), commit composer.lock, and treat Filament upgrades as gated events: upgrade Filament in a branch, run the panel's chart regression matrix, then merge. Verify that php artisan filament:assets (v3) or the Vite theme build (v4) correctly emits the ECharts bundle in your deploy pipeline — asset-publication omissions are the number-one cause of "chart blank in staging" failures.
Sequencing.
wire:navigate, polling, and a JS-formatter callback end to end.Verdict: Adopt with containment for advanced visualizations only. Not an approved default charting layer, and not on the critical path for anything customer-facing without a vendored fork.
Maintenance. Assume you own it. With 15 stars, zero dependents, and a single maintainer, budget for a vendored fork within 12 months: fork to a private VCS or path repository, and keep the diff to upstream minimal so re-syncs stay trivial. Ongoing cost is modest — the package is small, so a fork is measured in hours per Filament major, not weeks — but the obligation is real and should be assigned to a named owner. Add it to the dependency-review checklist and composer audit gate.
Support. No vendor SLA, no commercial backing. Support channels are GitHub issues and the Filament Discord. Mitigate with an internal runbook covering: asset rebuild after deploy, chart-blank triage steps, CSP exceptions, and the fork-and-patch procedure. Expect the team — not the maintainer — to be the escalation path.
Scaling. Three distinct axes:
fetch over Livewire property transport for large series. Cache expensive aggregates.dispose() on Livewire teardown.Failure modes to instrument and document.
wire:navigate or a tab switch (missing re-init / wire:ignore mishandled) — the highest-frequency field failure.Add browser-side error reporting (Sentry or equivalent) with a tag for chart-init failures; server logs will never see these.
Ramp-up. A Laravel developer comfortable with Filament and Livewire reaches a first working chart in 1–2 days. Proficiency is gated by the ECharts option API, which is large and idiosyncratic — budget 1–2 weeks for a developer to be independently productive across non-trivial chart types, plus documentation of your internal DTO and base-widget conventions so the patterns don't get reinvented per dashboard. Total onboarding investment is small; the durable cost is the standing ownership obligation created by the dependency's immaturity.
How can I help you explore Laravel packages today?