dragon-code/env-sync-laravel
Laravel package for keeping .env files synchronized with .env.example. It detects missing environment variables and updates your files, helping prevent configuration drift and onboarding issues across development, staging, and deployment.
What changed in 2.5.0. A single-line release note: Laravel 11 support, contributed by one author in one PR (#27). It is a compatibility patch — no new capability, no breaking changes, no deprecation notices, no security fixes. In isolation it is the least interesting kind of release: a version-ceiling bump that keeps the package installable on a framework we already target.
Why it still matters. The prior assessment rested partly on "last release 2024-03-13, no forward path." That premise now needs qualification. A release landing on a repository we had recorded as archived means one of two things, and we do not yet know which:
Either way, one patch release does not reverse the structural findings. It moves the compatibility ceiling from Laravel 10/11-era to an explicit Laravel 11, and it does nothing about secret handling, the upstream dependency, or the adoption signal.
Architecture fit. Unchanged and still poor for anything production-critical. The package remains a thin adapter over upstream dragon-code/env-sync, and the architectural objection was never about framework version support — it is that the package moves .env, our highest-sensitivity artifact, to a remote backend outside Laravel's configuration pipeline and outside our secrets manager. Laravel 11 compatibility makes it easier to install into a modern codebase, which raises exposure rather than lowering risk.
Integration feasibility. Still trivial: Composer require, auto-discovery, config publish. 2.5.0 removes the one friction point that might have caused a developer to bounce off it on a Laravel 11 app. The trap identified previously is now sharper — the install path is frictionless on our current stack, so approval-by-default is more likely, not less.
Technical risk: high, materially unchanged.
| Risk | Severity | Change since last assessment |
|---|---|---|
| Secret handling | Critical | Unchanged. No encryption, transport, retention, or access-control work in 2.5.0. Still the deciding factor. |
| Repository trajectory | Critical | Unclear, possibly worse. Either unarchived with a single maintainer, or archived with 2.5.0 as the terminal release. Must be re-verified before this row is re-scored. |
| Compatibility ceiling | High (was Critical) | Improved one notch. Laravel 11 supported. Laravel 12 and PHP 8.4 unsupported and unannounced. Ceiling is now one version away instead of two. |
| Bus factor / validation | High | Marginally improved, not resolved. One PR from one contributor is activity, not a maintenance commitment. Star count and dependent count remain negligible; no new production usage signal. |
| Supply-chain drift | Medium | Newly relevant. A minor bump on a repo of uncertain status means composer update moves consumers from 2.4 to 2.5 with no review gate. |
Key questions to resolve before any further work.
dragon-code/env-sync constraint? A widened constraint on an unmaintained upstream is a supply-chain concern..env contents to leave the developer machine at all? If no, framework compatibility is irrelevant..env.example drift? The latter still needs no remote backend.Recommendation: do not adopt as a dependency — unchanged. 2.5.0 removes an objection without addressing the objection that mattered. It is a reason to re-open the file in six months, not a reason to change the answer. Concretely: keep the rejection, add a review trigger ("if the project ships two or more releases across the next two quarters and a security review of the upstream backend passes, re-evaluate"), and proceed with the one-sprint internal alternative. Record the trigger in the ADR so this decision is not re-litigated ad hoc each time a patch release appears.
Stack fit. Superficially better than before — on a Laravel 11 codebase the package now installs and boots without a version conflict, so it looks fully native. Fit must still be judged against the secret-management stack, not the framework stack. Laravel's own guidance is that .env is machine-local configuration, never a shared artifact; 2.5.0 changes nothing about that inversion, about config:cache behaviour, or about 12-factor posture in containerised deploys.
Compatibility. Updated: explicit Laravel 11 support, which matches our target. Gaps remain — no Laravel 12 support and no PHP 8.4 declaration, and because the repository's status is uncertain there is no committed path to either. Treat Laravel 11 as the practical ceiling until proven otherwise. Also note that 2.5.0 is a minor bump: any team already on ^2.x will pick it up on the next composer update without a review, so if any branch currently references this package it should be pinned or removed now rather than after the fact.
Migration path (if we were forced to proceed). Unchanged in shape, with a new step zero:
.env.example key-name drift check in CI — no secret movement; (b) maintained secrets manager (Vault, AWS Secrets Manager, Doppler, 1Password CLI) behind a small artisan wrapper; (c) SOPS-encrypted .env in-repo, decrypted for local dev.composer.json regardless of spike outcome; do not leave an uncertain-status package in the lockfile.Sequencing. Status verification precedes security review; security review precedes spike; spike precedes pilot; pilot never touches shared or production environments. No phase requires a production change, so blast radius stays at zero while we decide.
Maintenance. 2.5.0 defers the "we become the maintainer" problem slightly — the package now works on our current framework — but does not eliminate it. If the maintainer is active, we inherit a single-person dependency whose release cadence we cannot influence; if the repo is archived, we inherit a fork obligation immediately. Either way the realistic ongoing cost is unchanged: a named owner, a CI matrix against each new Laravel and PHP release, and a fork that would be most of the upstream tool's surface. For a package with negligible adoption, that is still a poor return.
Support. No vendor, no SLA, no security advisories. One merged PR does not constitute triage capacity. Any credential-leak incident remains an internal postmortem with no upstream to escalate to, and the incident-response question — "where did this secret go and who can read it?" — is still unanswerable from the package's own documentation.
Scaling. Unchanged. Adequate for a handful of developers, poor beyond. Concurrent .env edits remain an undocumented conflict class inherited from upstream. Secret rotation still does not participate in the sync; rotating a credential means every developer re-syncs with no verification that stale copies were purged from the remote backend.
Failure modes.
.env contents replicated outside our security perimeter with no audit trail. Unchanged by 2.5.0.Ramp-up. Unchanged: install cost is deceptively low, correct onboarding is high. Every developer must understand what leaves their machine and where it lands, and that briefing must be repeated at every team expansion. Laravel 11 support makes the first step easier without touching the second.
Bottom line for the roadmap. Status changes from rejected to rejected with an active re-evaluation trigger. The underlying need — consistent local environments across a team — is still legitimate and still worth one sprint. Budget that sprint against a maintained secrets manager or an internal key-name drift check, assign an owner, and record two things in the ADR log: the rejection, and the explicit condition under which we would look again (sustained releases over two quarters plus a passed security review of the upstream backend). Without that trigger written down, the next developer who rediscovers this package will find a Laravel 11-compatible release and re-propose it as a solved problem.
How can I help you explore Laravel packages today?