Product Decisions This Supports
- Developer experience / internal tooling investment. This is not a customer-facing feature; the "feature" is engineering throughput. The decision it informs is whether the database reset loop (
migrate:fresh --seed) is slow enough to be worth optimizing, and whether we fund that optimization at all.
- Build vs. buy (vs. "just write it"). Still a thin wrapper over a known Laravel extension point — the real decision is dependency-vs-own-code, not buy-vs-build in any commercial sense. Note that v2.2.1 raises the honest cost of "just write it": the release is almost entirely edge-case hardening (table-name validation, foreign-key-referenced parents, tables sharing a create migration), which is exactly the logic a naive 40-line version would omit. Budget roughly a day, not an hour, to reach parity.
- CI and test architecture. Reset speed sets the floor on PR feedback latency and on whether engineers run the full suite before pushing. Relevant if we're choosing between transaction-wrapped tests, schema dumps, template databases, or seed-once strategies. v2.2.1 also has CI-visible behavior: in non-interactive mode the command now preserves the entire related table group rather than prompting, so runs stay deterministic but may preserve more than the exclusion list names.
- Environment parity policy. Adoption is an explicit acceptance that a developer's or CI database may diverge from migrations. That's a governance call, not just a tooling call — it should be made deliberately, ideally by whoever owns the seeders. v2.2.1's validation and warnings make drift louder (missing tables error out; dropped children referencing preserved parents get logged) but do not make drift safe.
- Roadmap relevance: essentially zero. Treat it as a keep-the-lights-on productivity item. It does not unlock a use case, a segment, or a release. If it appears on a roadmap at all, it belongs in an engineering health line item, not a product one.
- Supply-chain posture. Low stars, zero dependents, single maintainer, one narrow purpose — the decision it forces is whether our dependency policy permits unproven micro-packages for non-production tooling. A steady trickle of edge-case fixes is a mild positive signal on maintenance, not a change in bus factor.
When to Consider This Package
Consider it when:
- You are on Laravel and
migrate:fresh --seed is dominated by re-importing large, effectively-static datasets: countries/currencies/timezones/postal codes, permission and role matrices, product catalogs, CMS templates, or settings rows.
- Measured reset time is in the minutes, and engineers or CI jobs pay it many times per day. Below roughly 10–15 seconds total, this is noise and the added invariant risk is not worth it.
- The tables you'd preserve are genuinely static — they change via deploy or an external sync, never via a migration. If a preserved table ever gets a schema migration, exclusion silently skips it. v2.2.1 mitigates this only partially: it warns about referential relationships and prompts when a targeted table shares a create migration with related tables, but it still cannot tell you that a preserved table's schema has drifted.
- You need the guardrails, not just the mechanism. Typos in the exclusion list now fail loudly instead of silently doing nothing, which removes the most common silent-misconfiguration failure mode of earlier versions. Pin to >= v2.2.1 if you adopt.
- You can gate the command to
local / testing / CI in code, not by convention, and production or shared staging can never invoke it.
- You're comfortable treating the package as a snippet: vendor it, fork it, or reimplement it. Its value is the pattern, not the artifact — though the pattern now includes more edge cases than a first pass suggests.
Look elsewhere — or decline — when:
php artisan schema:dump --prune, idempotent chunked seeders with upserts, or a Postgres template database already get you under the threshold. These are lower-risk and don't break the schema/migration invariant.
- Your test suite leans on
RefreshDatabase transactions. The package solves nothing for steady-state test runs; it only helps full resets.
- Any table on the exclusion list is schema-mutable. Preserving it creates drift and "works on my machine" bugs whose debugging cost dwarfs the seconds saved.
- Your CI relies on interactive confirmation semantics. v2.2.1 changed non-interactive behavior to preserve whole related table groups; if your pipeline ever drops tables that share a create migration, you may now retain more data than you expect. Verify before upgrading.
- You operate under audit or compliance constraints requiring the database state to be reproducible from migrations alone.
- You want a dependency with a maintenance story. Zero dependents and a single maintainer means bus factor one; an internal command carries the same behavior with no external risk, at the cost of re-deriving the edge cases v2.2.1 just fixed.
How to Pitch It (Stakeholders)
Executives. This is a small developer-productivity utility, not a product feature — no customer impact, no revenue impact. It shortens the loop engineers and CI spend rebuilding databases by preserving static reference data across a reset. The payoff is minutes per engineer per day, and only if our seed data is already slow; if it isn't, the benefit is negligible. The latest release is maintenance work — input validation and safer handling of related tables — not new capability, and it slightly raises the effort to replicate the behavior ourselves. Recommendation unchanged: do not adopt as a dependency. Replicate the behavior internally, gated to local and CI, or use schema:dump if that already clears the bar. Low cost, no production risk, no ongoing vendor exposure.
Engineering. The package lets you name tables that migrate:fresh should not drop, so reference data survives a reset. v2.2.1 is worth reading before you pin a version: invalid or empty table lists now error instead of silently no-op'ing; warnings about dropped child tables referencing preserved parents are now conditional on --drop-referenced and downgraded to informational logs; and dropping a table that shares a create migration with related tables now prompts, cancelling if declined and preserving the whole group in non-interactive mode. That last change is the one to check against CI. Two things to internalize: (1) it still breaks the invariant that the database equals what migrations describe — any schema change to a preserved table will silently not apply, so the exclusion list must live next to the seeders and be reviewed whenever those tables migrate; (2) the maintenance signal is unchanged — single maintainer, near-zero adoption — so treat it as a code snippet, not a platform. First, measure whether seeding is actually the bottleneck; schema:dump plus idempotent, chunked seeders fixes most cases with strictly less risk. If we still need exclusions, we can vendor it or reimplement locally in a local-only command that logs loudly when it skips a table — but scope that as a day, not an afternoon.