studio-design/gesso
Gesso is a Laravel package for building responsive, email-safe templates with Tailwind CSS. It provides Blade components and helpers to assemble transactional emails quickly, keeping markup consistent and compatible across common email clients.
coverage:merge and coverage:gate now default from gesso.php via --config, so contract coverage can be enforced in CI with configuration instead of bespoke pipeline scripts. This is a policy decision: is contract parity a hard requirement or a report-only signal?Contract namespace, gives you a repeatable signal for schema evolution. That supports decisions about when a change is additive vs. breaking, and how long deprecation windows run.doctor --emit-config generates an equivalent gesso.php, and config now drives route-side parity exclusions and the spec list. This lowers the cost of adoption and migration, and supports a decision to standardize tooling rather than per-team configuration.--format and --output-file on every subcommand means contract results can be exported into dashboards or PR annotations without custom wrappers, supporting a decision to publish API quality metrics to stakeholders.explode, and part headers, and preserving body boundaries across adapters, means multipart/form-encoded endpoints are now testable. This supports decisions about whether to accept file upload or form-heavy endpoints into the contract-tested surface.Consider adopting when:
Look elsewhere or defer when:
Fuzz alias to the Contract namespace, or you pin dev analysis tooling and cannot take the PHPStan-related upgrades.Note that this is a minor release: features are additive and the one namespace move is aliased as deprecated, so adoption risk is low, but the deprecation should be scheduled rather than ignored.
For executives. This package makes API contracts enforceable in CI instead of aspirational in a document. The practical effect is that breaking changes to request/response shapes, enum values, and form encodings are caught in the pull request rather than by a partner or a customer. v2.7.0 strengthens that by making contract coverage a configurable gate, exporting results in standard formats for reporting, and adding a self-diagnostic that generates a working config file. The commercial argument is reduced integration incidents and less manual QA on API changes; the cost is a modest one-time investment in owning the spec and a small configuration change.
For engineering leadership. Adoption is low-friction for a Laravel, Symfony, or PSR-7 codebase on PHPUnit or Pest. Configuration is now shared between the test runner and the framework integration, the spec list and route-side parity exclusions are read from config, and doctor --emit-config produces an equivalent gesso.php from an existing setup, which de-risks migration. Contract checks have moved to a Contract namespace with the old Fuzz alias kept as deprecated, so there is a clear, non-urgent migration path. Adapters for Symfony and PSR-7 now inherit policy hooks from shared configuration, which means multi-service PHP estates can standardize on one contract definition. Consumer-side contract testing is supported through spec-driven HTTP client fakes, reducing dependence on live integration environments.
For the engineering team. Every CLI subcommand now accepts --format and --output-file, so results can be piped into CI annotations or dashboards without wrapper scripts. coverage:merge and coverage:gate read defaults from gesso.php via --config. Enum drift is evaluated once per paratest run rather than per worker, which removes a source of duplicated work in parallel suites. Validation now honors form encoding style, explode, and part headers, and body boundaries are preserved across adapters and the doctor command — this is the fix that makes multipart and file-upload endpoints genuinely testable. JSON bodies are decoded as objects so a nested {} is no longer misread as [], and config values are normalized consistently between gesso.php and extension parameters, including without ext-mbstring. Dev analysis tooling is pinned to keep PHPStan 2.3 findings stable — budget a small maintenance window if you track those pins.
How can I help you explore Laravel packages today?