Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Compress Html Laravel Package

akankov/laravel-compress-html

Laravel middleware that minifies HTML responses on the fly, removing whitespace, comments, and redundant markup to shrink page size and speed up delivery with zero template changes.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. akankov/laravel-compress-html is a response-rewriting package: a service provider registers a middleware that minifies HTML response bodies, with an optional Blade directive for partial-level compression and a publishable config/htmlmin.php that maps onto the underlying minifier engine's constructor arguments. It occupies a well-understood slot in the Laravel HTTP kernel — after the response is generated, before it is sent. There is no persistence, no queue, no external service, and no auth surface. For a package of this class, that is the right architecture, and the footprint is small enough that the integration decision is a cost/benefit call on output mutation rather than an architectural one. The main structural constraint is ordering: it must be positioned relative to response-caching middleware, CSP/nonce injectors, Debugbar/Telescope collectors, and any compression layer, because it reads and replaces the entire response body.

Integration feasibility. Low effort. composer require, optional vendor:publish of the config, middleware registration (global or web group), optional directive. A competent Laravel engineer can have a working proof in under a day. v2.1.1 does not change any of this — it is a patch release with no API, config-schema, or behavioural changes to the middleware or directive.

Technical risk. The dominant risk is output mutation, not the package's code quality: minification touching <pre>/<textarea> content, significant whitespace between inline-level elements, conditional comments, and templating attributes used by Alpine.js, Vue, or Livewire. These failures are silent and user-visible, and they will not surface in unit tests — only in a byte-diff of real rendered pages. Secondary risks: (a) the service provider resolves the engine at boot from the published config, so a stale key after an upgrade is a whole-application boot failure — a hard outage vector, which v2.1.1 materially improves by replacing a cryptic Unknown named parameter $camelCasedKey with an InvalidArgumentException naming the snake_case key, the file, and the fix; (b) single-maintainer bus factor; (c) the newly added quality gates (Infection MSI floor 70 / ~74% measured, composer audit, Dependabot with a 7-day cooldown) are explicitly non-blocking, so they are informative signals rather than enforced guarantees.

Key questions.

  1. What are the exact composer.json constraints on PHP and laravel/framework, and which underlying minifier engine/version is pulled in?
  2. Does the middleware explicitly skip StreamedResponse, BinaryFileResponse, and non-HTML content types, and does it strip or recompute Content-Length / ETag?
  3. What is the recommended middleware position, and does it compose safely with our response-cache and CSP middleware?
  4. If the Blade directive and the middleware are both enabled, is content minified twice, and is that idempotent?
  5. Does minification interfere with inline <script>/<style> content, and is JS/CSS minification in scope or passthrough?
  6. License and maintainer succession — is the package small enough to vendor/fork if it is abandoned?
  7. What measurable benefit do we expect, given nginx gzip/brotli and HTTP/2 are already in play?

Integration Approach

Stack fit. Standard Laravel HTTP stack; the package is framework-native and does not contend with our data layer. It coexists with Inertia (JSON responses, no-ops) and Livewire (HTML, requires verification), and is largely neutral toward our auth/session model. The only stack-level interaction to design for is middleware ordering against response-rewriting neighbours.

Migration path. There is no prior assessment and no incumbent, so this is greenfield adoption, not a migration. Any 2.x → 2.1.1 bump is a drop-in patch: no config key additions, no signature changes. The one upgrade sharp edge — a published config holding a key the engine no longer accepts — now fails at boot with an actionable message and a one-line fix (delete the key), which converts an opaque incident into a checklist item for the upgrade runbook.

Compatibility. Verify the PHP/Laravel support matrix against our runtime before pinning. Confirm behaviour alongside: response-caching middleware (cache the minified or unminified body — decide deliberately, and never both), CSP nonce injection, Debugbar/Telescope in non-prod, and server-level compression. Pin ^2.1.1 and commit the lockfile.

Sequencing.

  1. Local proof on a representative template set (forms, tables, code blocks, Alpine/Livewire components).
  2. Golden-output diff: capture rendered HTML with the middleware off, then on, across the top 20–30 routes; review every diff.
  3. Enable in staging with the published config committed to the repo, so stale keys are caught in CI rather than at production boot.
  4. Enable on one low-traffic route group in production; watch error rate, response size, and TTFB for one release cycle.
  5. Full rollout, with a documented kill switch (remove from the middleware stack + php artisan config:cache).
  6. Add a post-deploy smoke check that asserts HTTP 200 on a handful of HTML routes — this catches the boot-failure mode immediately.

Operational Impact

Maintenance. Very low surface area and few transitive dependencies. The Dependabot configuration (composer + github-actions, 7-day cooldown) is a sensible posture for a small package: automated PRs without same-day noise. The composer audit job being non-blocking means advisories will not gate merges — assign a human owner to review its output on a fixed cadence, otherwise it is decoration. Same for the Infection gate: an MSI floor of 70 with ~74% measured is a reasonable ratchet for a package this size, but only if it is eventually promoted to blocking.

Support. No vendor SLA; GitHub issues only, single maintainer. Designate one backend engineer as internal owner and keep the package on a short list of "vendorable" dependencies — the code is small enough that forking is a realistic contingency rather than a rewrite. The v2.1.1 error-message change is the highest-value operational item in this release: it targets the single most likely production incident (boot failure after a dependency update) and reduces MTTR from "escalate and read provider source" to "read the exception, delete the key."

Scaling. Cost is linear in HTML payload size per request, with the whole response buffered and rewritten in-process. For typical page sizes this is trivial next to template rendering and database time. Two caveats: (1) it is pure per-request CPU with no memoisation, so on high-traffic, cacheable pages it should sit behind a full-page/response cache — not in front of one; (2) very large HTML documents raise peak memory per worker. The bandwidth benefit is real but often marginal once gzip/brotli and HTTP/2 are already enabled — measure before assuming a win, and treat the primary justification as payload consistency rather than raw savings.

Failure modes.

Mode Blast radius Detection Mitigation
Stale published config key → InvalidArgumentException at boot Total outage Immediate, loud (v2.1.1 names key + file) Commit published config to the repo; catch in CI; smoke-check post-deploy
Minifier corrupts edge-case markup (<pre>, inline whitespace, Alpine/Livewire attrs) Silent, user-visible Golden-output diff in staging Curated route diff review; report upstream; exclude routes or disable
Interaction with response cache / CSP / Debugbar middleware Corrupted or double-processed bodies Staging soak; diff testing Fix ordering explicitly; document the required stack position
Streamed/SSE responses mishandled Broken real-time features Integration test Verify skip logic; exclude affected route groups
Package abandoned / dependency drift Slow-burn Dependabot; audit cadence Fork-and-vendor plan with a named owner

Ramp-up. Hours to low days for a Laravel-fluent engineer. The learning curve is not the API — it is the blast radius: knowing which templates are whitespace-sensitive and how to roll back in one deploy. Budget the majority of the effort on the golden-output diff and rollback rehearsal, not on installation.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
ignibyte/aic-framework
glavweb/data-schema-bundle
glavweb/datagrid-bundle
tacticmedia/scim-server
uni-method/frame
neika-ai/sdk
adachsoft/php-code-style
pharaonic/laravel-notification-dependencies
beautinow/translug
dev-brainiac/bot-cloaked
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
adachsoft/api-version-bundle
cgv/localized-resource
noith/settings
kda/laravel-package
kda/filament-dynamic-navigation
bypersoft/signbox