ryangjchandler/laravel-bunny-fonts
Laravel integration for Bunny Fonts, the privacy-friendly Google Fonts alternative. Add Bunny Fonts stylesheets to your Blade views and register font families from a single config file, with no Google tracking and no cookie banners.
Architecture fit. laravel-bunny-fonts is a small, single-purpose Laravel package that wraps Bunny Fonts (a privacy-friendly, Google Fonts–compatible CDN) for Blade-driven font inclusion. Architecturally it follows conventional Laravel package patterns: a service provider with package auto-discovery, a publishable config file, and Blade-level helpers/directives for emitting <link> tags and (depending on configuration) local caching of font assets. This is a low-coupling, additive dependency — it does not touch the container, routing, auth, queues, or persistence layers, so it does not constrain application architecture. It sits alongside laravel-vite / asset pipeline concerns rather than competing with them.
Integration feasibility. Integration is a single composer require plus optional vendor:publish of the config. No database migrations, no env-var contract beyond an optional base URL/CDN override, no scheduled jobs. Realistic effort for a competent Laravel developer: under an hour for the first font family, half a day to roll across a multi-brand or multi-locale front end.
Technical risk. Low overall, with three caveats worth naming:
composer.json constraint was widened in a patch — consumers who pin tightly should verify the resolved constraint rather than assume. Confirm that illuminate/support was widened (^10|^11|^12|^13) and that no transitive dependency was force-upgraded.dependabot/fetch-metadata (2.4.0 → 2.5.0), a CI-only GitHub Action. Zero runtime blast radius. The maintainer surface is a single individual, which is the real long-term risk, not this release.Key questions.
illuminate/* constraints, and is the widened constraint covered by CI against Laravel 13 (or is it declared-but-untested)?composer.json?fetch-metadata by tag is acceptable but SHA-pinning is preferable for third-party Actions.)Stack fit. Native fit for any Laravel application using Blade-rendered views. It is framework-idiomatic and does not require Inertia, Livewire, or a specific front-end build tool. It is a poor fit only for API-only services with no server-rendered HTML, or for teams already standardized on self-hosted webfonts via their Vite pipeline (in which case the package is redundant rather than harmful).
Migration path. The natural migration is from the Google Fonts CDN to Bunny Fonts, which is largely a drop-in: Bunny Fonts exposes a Google Fonts–compatible CSS API. Typical steps: (1) install and publish config; (2) port existing font-family declarations and weight/italic variants into the package config; (3) replace hard-coded fonts.googleapis.com / fonts.gstatic.com links and any @import statements in CSS; (4) if local caching is supported and desired, enable it and warm the cache in the deploy pipeline; (5) remove the old Google Fonts CSP allowances and add the Bunny domains to Content-Security-Policy (fonts.bunny.net for CSS, plus the font-file host). Step 5 is the most commonly missed and the most likely source of a silent production regression.
Compatibility. Laravel 13 is now declared supported; the practical floor is likely Laravel 10+ but should be read from composer.json rather than assumed. PHP constraint should be checked explicitly — Laravel 13's PHP floor will dominate. Because the runtime code is unchanged in this release, existing v2.1.0 consumers can upgrade with no code changes expected; treat it as a routine lockfile refresh.
Sequencing.
composer update ryangjchandler/laravel-bunny-fonts and confirm the resolved Laravel constraint.Because the runtime diff is nil and the change is a compatibility widening, this does not need to be coupled to a Laravel 13 upgrade. It can ship independently and early — doing so de-risks the eventual framework upgrade by removing one blocker from the dependency graph.
Maintenance. Near-zero steady-state effort: no migrations, no background jobs, no state. The maintenance burden is concentrated in (a) periodic composer update and (b) config drift when brand typography changes. Dependabot activity on the repo is a positive signal — automated dependency hygiene is present and the Action bump shows the pipeline is alive.
Support. This is a community package with a single maintainer and no commercial backing. That is acceptable for a non-critical, easily-replaceable presentation-layer dependency, and unacceptable as a load-bearing component of a design system without an exit plan. The exit plan is cheap: the package's output is a handful of <link> tags, so replacement with hand-rolled Blade partials or a Vite-based self-hosted font setup is a few hours of work. Document that fallback.
Scaling. Effectively free at the application tier — no server-side compute, no per-request work beyond string rendering. Scaling concerns live entirely at the CDN edge and are Bunny's problem. The one scaling-adjacent decision is caching: enabling local/self-hosted font delivery removes the third-party from the render path, improves cold-load latency and eliminates a class of privacy and availability concerns at the cost of cache invalidation and deploy-pipeline complexity.
Failure modes.
font-display: swap and a system-font fallback stack.@bunnyFonts wrapper) rather than scattering directives across views.Ramp-up. Very low. A developer unfamiliar with the package can read the README and be productive in well under an hour; the conceptual prerequisites are only "how Laravel package config publishing works" and "how webfont loading and font-display behave." The genuinely non-obvious knowledge is environmental, not package-specific: the CSP allowlist, the caching topology, and the brand's approved font inventory. Those should live in the team's runbook, not in individual memory.
Recommendation. Adopt/continue. v2.1.1 is a low-risk housekeeping release whose only substantive content is the Laravel 13 compatibility declaration, which is worth taking early to keep the framework upgrade path clear. Verify the widened constraint is CI-tested against Laravel 13 rather than merely declared, and treat the single-maintainer risk as a documented, mitigated (not eliminated) concern.
How can I help you explore Laravel packages today?