esplora/decompresso
Decompresso is a Laravel/PHP package that simplifies working with compressed files and archives. It offers a clean, straightforward API for safe extraction, making it easy to add reliable decompression support to your application workflows with less code.
What changed in 1.1.0. The only documented change is symmetric GPG decryption support (PR #7). This extends the package from asymmetric (keypair-based) decryption to passphrase-based symmetric decryption — i.e., a shared-secret unlock path alongside the existing private-key path. No deprecations or breaking changes are stated.
Version-signal risk (most important finding). The compare link jumps 0.2.0 → 1.1.0, yet "What's Changed" lists a single PR. That means the 1.0.0 and 1.0.x release notes were not aggregated into this one. Two things follow: (a) the project has crossed the 1.0 line and is now asserting semver API stability, and (b) we cannot see from this note alone what landed in 1.0.0 — the very release most likely to contain breaking changes. Treat the "no breaking changes" implication as unverified until the 1.0.0 release page and CHANGELOG.md are read directly.
Architecture fit. The package is a Laravel-style secret-handling add-on (service provider + config + artisan surface) that shells out to or wraps GPG for encrypt/decrypt. That fits naturally where we already need encrypted-at-rest secrets in .env files, deployed artifacts, or CI variables, and where we want decryption to happen inside the framework rather than in bespoke shell scripts. It fits poorly if our target is a managed secrets service (Vault, AWS Secrets Manager, SOPS+age) — this is a file-and-key-centric model, and adopting it now creates a migration to unwind later.
Technical risk.
gpg version, or decryption fails in ways that surface only at boot.Key questions for the maintainers / spike.
gnupg PHP extension or by invoking the CLI? (Affects container hardening and proc_open/exec policy.)Stack fit. Standard Laravel integration: Composer install, publish config, add the service provider (or rely on package discovery), set the relevant env vars. The gating item is not PHP — it is provisioning gpg into every runtime image and confirming the version pin matches what the package expects. Add that to the base image before any application work begins.
Migration path (from 0.2.0, if already in use anywhere) and from ad-hoc scripts.
^1.0 until 1.0.0's changes are read.CHANGELOG.md and the 1.0.0 release page; diff the public API surface we actually call (facade, config keys, artisan commands).1.1.0) in composer.json and lock it.If we are not yet a consumer, the migration path is simply "adopt at 1.1.0 pinned," and the 1.0.0 ambiguity costs us nothing but diligence.
Compatibility work to schedule.
gpg version parity across local / CI / container / prod. Drift here is the single most likely source of "works on my machine."APP_KEY-based encrypt()/decrypt() usage — the two schemes should not be mixed on the same values.Sequencing.
gpg to base images; document version; add a smoke test asserting the binary exists and can decrypt a fixture.Do not skip step 3 — the pilot in step 2 will pass on a developer laptop and fail in a distroless or Alpine container otherwise.
Maintenance. Modest but non-zero: a Composer dependency plus an OS package plus a passphrase. Budget for a quarterly review of the pin and a re-read of release notes, since the project's release hygiene (single aggregated note for a 0.2.0→1.1.0 jump) suggests changelogs will not be self-explanatory. Small-team project — plan on us being the de facto QA for our own upgrade path rather than relying on an LTS promise.
Support. Community GitHub issues, no vendor SLA. Acceptable for internal tooling behind a CI gate; questionable for anything on the critical boot path of a customer-facing service. If it lands there, we need at least one engineer who can read the source and one documented fallback procedure.
Scaling. Decryption is CPU-bound and, if it shells out, process-spawning — roughly milliseconds per invocation but with a fork/exec cost that is not free at high request rates or in a high-fan-out queue worker fleet. Two mitigations to insist on: (a) decrypt once at boot / build time and cache the plaintext for the process lifetime, and (b) never decrypt inside a hot request path or per-job loop. If the package decrypts per-access with no cache, that is a design constraint we must wrap ourselves. Horizontal scaling is otherwise unaffected — no shared state or network dependency, which is a genuine advantage over a secrets-service call in the boot path.
Failure modes to instrument and alert on.
gpg binary absent or version-mismatched in a new image → boot failure or, worse, empty secrets. Alert on process-start failure and on unexpected empty config values.$HOME unset) causing gpg to fail opaquely.composer.lock and a dependency audit in CI.Ramp-up. Low for the Laravel mechanics (config publish, env vars, artisan commands) — a mid-level Laravel developer is productive in under a day. The real ramp is GPG literacy: keypairs vs. symmetric passphrases, what "trust" means for a key, and why a passphrase in a CI variable is a different control than a private key in a vault. Budget a short internal write-up and a runbook before the production rollout, not after. Expect roughly one engineer-week end-to-end for the first domain, and materially less for each subsequent one.
Recommendation. Conditional go. 1.1.0 is a small, additive feature and symmetric GPG support is genuinely useful for CI-time secret handling. But the release note does not let us verify what changed in 1.0.0, and the package sits on a security-sensitive path with a thin maintainer base. Approve the CI-first pilot; gate production runtime adoption on (a) a clean read of the 1.0.0 changelog, (b) a confirmed fail-loud contract on bad passphrase, and (c) gpg baked into the base image with a smoke test.
How can I help you explore Laravel packages today?