chiiya/laravel-passes
Create and serve Apple Wallet passes from your Laravel app. chiiya/laravel-passes offers a fluent API for defining pass types, fields, images, and barcodes, then generates signed .pkpass files ready for download or distribution.
Architecture fit. chiiya/laravel-passes is a Laravel package that wraps Apple Wallet (PassKit .pkpass) and Google Wallet pass construction and distribution behind a fluent builder API, a service provider, and publishable config. Architecturally it belongs as a leaf dependency in an outbound artifact service — a WalletPassService in our domain layer that owns template data, signing material references, and delivery links. It should not leak into controllers or models; the pass objects it produces (Apple pass JSON, Google JWT/save URL) are serialization concerns we want behind our own interface so we can swap the implementation. It assumes a full Laravel runtime (container, config, facades, storage) — it is not usable standalone, so it is a non-starter for any non-Laravel consumer we might add later.
Integration feasibility. Straightforward Composer install plus vendor:publish for config. The real work is credential plumbing, not code: Apple requires a Pass Type ID certificate (.p12 + password) and the Apple WWDR intermediate; Google requires a service-account JSON with the Wallet API enabled and an issuer ID. That means secrets management, per-environment certificate separation, and a rotation runbook. Expect roughly 3–5 engineer-days to first production pass, of which the majority is credential/onboarding work with Apple and Google rather than package integration.
Technical risk.
composer.json now permits laravel/framework ^13.0 and that PHP constraints didn't shift.GenericClass/GenericObject types on a Class/Object property). If it changes a property type or return type, static analysis or any subclass we write could break. Low blast radius, but it touches the Google domain model we would extend.Key questions for the maintainer / spike.
php, illuminate/*, and laravel/framework constraints in 1.2.0, and is Laravel 13 support additive or does it drop older majors?Stack fit. Requires a Laravel application on a supported PHP version. If we are on Laravel 11 or 12 today, 1.2.0's Laravel 13 support is forward-looking rather than immediately useful — it de-risks our eventual framework upgrade but is not by itself a reason to adopt or upgrade. If we are already planning a Laravel 13 move, this release removes a blocker.
Migration path. There is no prior assessment and no incumbent identified, so treat this as a greenfield adoption, not a migration. Two paths:
WalletPassService interface, one pass type in one environment, to validate credential onboarding and end-to-end device install.If we already have bespoke pass generation, the migration is a strangler pattern: introduce the package for new pass types only, leave existing passes untouched, and only consolidate once both paths are proven in production.
Compatibility. Pin to ^1.2 and verify the resolved dependency tree against our Laravel and PHP versions before committing. Confirm the package does not conflict with our existing guzzlehttp, firebase/php-jwt, or spatie/laravel-package-tools-style transitive dependencies. Treat the Apple .p12 and Google service account as environment-scoped config, never committed; wire them through our existing secret store rather than the published config file's defaults.
Sequencing.
Maintenance. Low ongoing code maintenance, but a recurring operational obligation: certificate and credential lifecycle. Apple certificates expire annually, and the WWDR intermediate has historically rotated. We need an owner and a calendar reminder, or passes silently stop installing. Budget a few hours per rotation; the failure is easy to miss because already-installed passes keep working while new issuances fail.
Support. No commercial support. Escalation is upstream GitHub issues plus our own fork-if-needed capability. Given single-maintainer status, we should be prepared to vendor or fork the package; keeping our integration behind an internal interface is the mitigation. Our team owns first-line support for anything pass-related regardless.
Scaling. Pass generation is cheap and CPU-bound on signing — trivially horizontally scalable behind our normal app tier, and cacheable if templates are static. The scaling constraint is not this package but the wallet platforms themselves: Apple and Google impose their own rate limits and push-update semantics, and pass updates fan out through Apple's push notification / APNs path, which is a different scaling profile from generation. If we plan high-volume or frequently-updating passes, that deserves its own design review. Dependabot-driven CI bumps in this release have no runtime scaling implication.
Failure modes.
Ramp-up. A mid-level Laravel engineer familiar with the framework can be productive in 1–2 days on the package API; the learning curve is dominated by wallet-platform domain knowledge (PassKit JSON structure, pass type registration, Google Wallet class/object model), not by PHP. Plan for one engineer to become the named owner of wallet credentials and platform relationships — this is a single-owner specialty, and losing that person is a real knowledge-concentration risk. Document the credential rotation runbook as part of the initial delivery, not afterward.
How can I help you explore Laravel packages today?