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.
Lumos is Esplora's Laravel wrapper around GPG/PGP encryption, aimed at projects that need to encrypt or decrypt payloads and files without shelling out to gpg by hand.
Start with:
composer require esplora/lumos — note that the package jumped from 0.2.0 straight to 1.1.0, so treat the install as a potential breaking upgrade if you were on the pre-1.0 line. Pin the constraint (^1.1) before touching an existing project.php artisan vendor:publish --tag=lumos-config or the equivalent tag documented in the README) and read the config file first — key paths, passphrase handling, and default cipher/digest settings are the things you will actually change day-to-day.public/ (typically storage/app/keys or an env-driven path) and confirm the process user can read the private key.gnupg extension or a gpg binary on PATH, depending on which driver the package uses.The first real use case is inbound decryption: a partner or internal service sends you an armored PGP message, and you decrypt it in a controller or job rather than in a one-off script. As of 1.1.0 you also have symmetric decryption, which is the faster path when both sides share a passphrase rather than a keypair — useful for internal service-to-service payloads and for decrypting files produced by gpg --symmetric.
Wrap it in a service, not a controller. Resolve Lumos once in a small PayloadDecryptor / FileEncryptor class and inject that. You want a single place to swap key paths per environment and a single place to add logging when decryption fails.
Environment-specific keys. Keep public keys for outbound encryption and private keys for inbound decryption in separate config values, and point them at different files per environment (staging key vs production key). Loading a private key you don't need is a needless blast-radius increase.
Asymmetric for external, symmetric for internal. The 1.1.0 symmetric support is a good fit for:
Keep asymmetric (public-key) flows for anything crossing a trust boundary with a third party.
Decrypt at the edge of your application. Do it in middleware, a form request, or the first line of a job handler, then pass plaintext around internally. Don't scatter decrypt calls through your domain layer.
Queue long-running crypto. Decrypting large files is CPU-bound; push it to a job rather than blocking a request. Pair this with the package's exception types so a bad passphrase retries or fails cleanly rather than throwing an opaque error into the queue log.
Log the envelope, never the contents. Record which key ID / which passphrase identifier was used and the outcome; never log ciphertext-adjacent plaintext or the passphrase itself.
1.0.0 in the compare range shown, so the maintainers appear to have collapsed pre-1.0 work into 1.1.0. Before upgrading an existing install, diff the public API (facade methods, config keys, exception classes) rather than assuming the only change is the new symmetric feature.gpg invocation your counterparty uses — gpg --symmetric defaults have shifted across GPG versions..asc) vs binary (.gpg/.kbx) keys are not interchangeable, and an armored key pasted into an env var will lose its newlines. Prefer file paths over inline env strings for keys.config/*.php committed to git. If the package supports a passphrase callback, use it so the secret isn't held in memory longer than needed.gnupg extension, confirm it's installed in every environment including CI and your queue workers — a missing extension often surfaces as a confusing "no encryption backend" error rather than an install error.InvalidSignature, DecryptionFailed) so callers don't have to string-match GPG stderr output.How can I help you explore Laravel packages today?