timolake/livewire-tables
A Laravel Livewire package for building dynamic, interactive data tables with sorting, searching, pagination, and customizable columns and filters. Drop tables straight into your Livewire components with minimal setup and no extra JavaScript.
Architecture fit
This package is an opinionated layer over Livewire's server-driven reactivity model and Eloquent, not a rendering library. It asks the application to accept one structural convention: every table becomes a declared table class (with pagination, search, sort, and trashed state persisted in the session), and Blade views shrink to a directive. For a Livewire 3.x codebase, that convention is cheap to adopt and pays compounding dividends across many near-identical admin screens — user management, order tracking, audit logs, moderation queues, inventory. The value is standardisation and velocity on undifferentiated CRUD, not table innovation. Where tables are the product (public-facing, hierarchical, export-driven, Airtable-style), the architecture fights us rather than helps us. The TPM framing should be: this is a convention we adopt, and a package that happens to ship it.
Integration feasibility
Technically light: composer require, one table class per model, a Blade swap, no JavaScript surface to negotiate, no schema change. The genuine feasibility constraints are organizational, not technical:
composer require.PaginationTrait before any table is written.Technical risk
NOASSERTION means there is no reviewable license. This cannot ship commercially until legal clears it, and the derivation from danielbinsmaier/livewire-tables and coryrose/livewire-tables muddies our obligations further. This is gate zero, not a footnote.livewire-powergrid and scoping interaction with spatie/laravel-permission need explicit compatibility testing, not assumption.Key questions
NOASSERTION, and are the two upstream packages' terms compatible with our distribution model?Stack fit Strong: Laravel 10/11, Livewire 3.x, PHP 8.1+, Eloquent-backed, Alpine/Tailwind-friendly, no frontend framework required. Poor: Inertia/React/Vue stacks, public design-critical surfaces, or any workload above ~100K rows with sub-second expectations. Scope the pilot deliberately to internal tools where speed beats polish.
Migration path Run this as a bounded programme, not a platform bet:
Timolake\* directly. This converts "adopting a package" into "adopting a convention we can re-implement," and is the exit seam.Compatibility
Known-good with Livewire 3.x. Test explicitly against livewire-powergrid if both are present, and against spatie/laravel-permission for row-level scoping. Search semantics differ by database — PostgreSQL ILIKE versus MySQL collation — so define search behaviour once and test per environment. Livewire 2.x and Laravel 9 stacks are out of scope; the codebase carries two parallel version lines and we do not want a third in our estate.
Sequencing Sessions are the hidden dependency. Because sort/search/page/trashed state persists in the session, QA must test multi-tab, back-button, and stale-state behaviour, and support must learn that "missing rows" is usually retained filter state. Write the state-behaviour spec before wave two, and ship a visible "clear filters" control in wave one — not after the first support ticket. Sequence legal → pin → spike → wrapper → waves, with the wrapper landing before any second table is built.
Maintenance Assume ownership. Budget one named engineer plus a fork vendored into our VCS (or a private Composer path repo) so we can patch without waiting on upstream. At 0 dependents, upstream fixes are best-effort; fork-and-vendor should be the default posture, not the contingency. Add a lightweight upgrade review each time upstream tags, and never float the version range.
Support
Two new support patterns to pre-empt with a one-page runbook: (a) "the table is filtered/sorted oddly" — session state, needs a visible reset affordance; (b) "row X isn't showing" — soft-delete/trashed state retained across requests. There is no vendor escalation path, so tier-2 ownership must be internal and named. Expect a small but persistent trickle of these tickets for the first quarter.
Scaling Performance is a function of indexing and query design, not the package. Set an explicit intake threshold: tables under ~50K rows are in scope; above that require an index review and a query-count budget per render. Watch Livewire payload size and session state on large pages. Treat 100K rows as a re-platform trigger and re-evaluate rather than push through.
Failure modes
Ramp-up Low for engineers already fluent in Livewire: roughly a day to a working table class, a week to fluency in formatting, actions, and relations. The non-obvious costs sit outside engineering — QA and support education on session-persisted state, and a design review to accept theming limits, since tables will look like default Livewire unless we invest in Blade overrides.
Portfolio recommendation Treat this as a time-boxed scaffold for internal admin surfaces, adopted behind an internal abstraction layer, with a license gate at the front and a documented exit path at the back. Expected return: meaningful delivery acceleration on undifferentiated CRUD screens across multiple teams. Expected cost: a small, permanent ownership burden. Kill criteria: license not cleared, pilot fails parity on search accuracy or query count, or any public-facing or differentiated table enters scope. Low adoption does not disqualify it for internal tooling — but it does disqualify it for anything we would not be willing to maintain ourselves.
How can I help you explore Laravel packages today?