vlados / laravel-blade-crawler-detect
Boost Lighthouse and PageSpeed scores by hiding cookie banners, chat widgets and heavy scripts from crawlers via two Blade directives. Octane-safe.
Package info
github.com/vlados/laravel-blade-crawler-detect
pkg:composer/vlados/laravel-blade-crawler-detect
Requires
- php: ^8.1
- illuminate/contracts: ^10.0|^11.0|^12.0|^13.0
- jaybizzle/crawler-detect: ^1.2
- spatie/laravel-package-tools: ^1.14
Requires (Dev)
- orchestra/testbench: ^8.0|^9.0|^10.0|^11.0
- pestphp/pest: ^2.0|^3.0|^4.0
- pestphp/pest-plugin-laravel: ^2.0|^3.0|^4.0
- dev-main
- v0.5.0
- v0.4.0
- v0.3.1
- v0.3.0
- v0.2.0
- v0.1.0
- dev-dependabot/github_actions/actions/checkout-6.0.2
- dev-dependabot/github_actions/dependabot/fetch-metadata-3.1.0
- dev-dependabot/github_actions/anthropics/claude-code-action-38ec876110f9fbf8b950c79f534430740c3ac009
- dev-dependabot/github_actions/stefanzweifel/git-auto-commit-action-7.1.0
- dev-claude/update-laravel-compatibility-eveZ6
- dev-depfu/update/composer/pestphp/pest-4.6.3
- dev-depfu/update/composer/illuminate/contracts-13.5.0
- dev-depfu/update/composer/pestphp/pest-4.6.1
- dev-depfu/update/composer/illuminate/contracts-13.4.0
- dev-depfu/update/composer/pestphp/pest-4.4.6
- dev-depfu/update/composer/pestphp/pest-4.4.5
- dev-depfu/update/composer/illuminate/contracts-13.3.0
- dev-depfu/update/composer/illuminate/contracts-13.2.0
- dev-depfu/update/composer/pestphp/pest-4.4.3
- dev-depfu/update/composer/illuminate/contracts-13.1.1
- dev-depfu/update/composer/pestphp/pest-4.4.2
- dev-depfu/update/composer/pestphp/pest-plugin-laravel-4.1.0
- dev-depfu/update/composer/pestphp/pest-4.4.1
- dev-depfu/update/composer/pestphp/pest-4.3.2
- dev-depfu/update/composer/pestphp/pest-4.3.1
- dev-depfu/update/composer/pestphp/pest-4.3.0
- dev-depfu/update/composer/pestphp/pest-4.2.0
- dev-depfu/update/composer/pestphp/pest-4.1.6
- dev-depfu/update/composer/pestphp/pest-4.1.5
- dev-depfu/update/composer/pestphp/pest-4.1.4
- dev-depfu/update/composer/pestphp/pest-4.1.3
- dev-depfu/update/composer/pestphp/pest-4.1.2
- dev-depfu/update/composer/pestphp/pest-4.1.1
- dev-add-claude-github-actions-1759345066754
- dev-depfu/update/composer/illuminate/contracts-12.31.1
- dev-depfu/update/composer/illuminate/contracts-12.30.1
- dev-depfu/update/composer/pestphp/pest-4.1.0
- dev-depfu/update/composer/illuminate/contracts-12.26.3
- dev-depfu/update/composer/pestphp/pest-4.0.4
- dev-depfu/update/composer/pestphp/pest-plugin-laravel-4.0.0
- dev-depfu/update/composer/pestphp/pest-4.0.3
- dev-depfu/update/composer/pestphp/pest-4.0.2
- dev-depfu/update/composer/illuminate/contracts-12.25.0
- dev-depfu/update/composer/pestphp/pest-3.8.4
- dev-depfu/update/composer/pestphp/pest-4.0.0
- dev-depfu/update/composer/pestphp/pest-3.8.3
- dev-depfu/update/composer/illuminate/contracts-12.24.0
- dev-depfu/update/composer/illuminate/contracts-12.21.0
- dev-depfu/update/composer/illuminate/contracts-12.20.0
- dev-depfu/update/composer/illuminate/contracts-12.19.3
- dev-depfu/update/composer/illuminate/contracts-12.18.0
- dev-depfu/update/composer/illuminate/contracts-12.17.0
- dev-depfu/update/composer/illuminate/contracts-12.16.0
- dev-depfu/update/composer/illuminate/contracts-12.15.0
- dev-depfu/update/composer/illuminate/contracts-12.14.1
- dev-depfu/update/composer/illuminate/contracts-12.13.0
- dev-depfu/update/composer/illuminate/contracts-12.12.0
- dev-depfu/update/composer/illuminate/contracts-12.10.2
- dev-depfu/update/composer/pestphp/pest-plugin-laravel-3.2.0
- dev-depfu/update/composer/illuminate/contracts-12.9.2
- dev-depfu/update/composer/pestphp/pest-3.8.2
- dev-depfu/update/composer/illuminate/contracts-12.8.1
- dev-depfu/update/composer/illuminate/contracts-12.7.2
- dev-depfu/update/composer/pestphp/pest-3.8.1
- dev-depfu/update/composer/pestphp/pest-3.8.0
- dev-depfu/update/composer/illuminate/contracts-12.3.0
- dev-depfu/update/composer/illuminate/contracts-12.2.0
- dev-depfu/update/composer/illuminate/contracts-12.1.1
- dev-depfu/update/composer/illuminate/contracts-12.0.1
- dev-depfu/update/composer/pestphp/pest-plugin-laravel-3.1.0
- dev-depfu/update/composer/pestphp/pest-3.7.3
- dev-depfu/update/composer/pestphp/pest-3.7.2
- dev-depfu/update/composer/pestphp/pest-3.7.1
- dev-depfu/update/composer/pestphp/pest-3.6.0
- dev-depfu/update/composer/pestphp/pest-3.5.1
- dev-depfu/update/composer/pestphp/pest-plugin-laravel-3.0.0
- dev-depfu/update/composer/pestphp/pest-3.5.0
- dev-depfu/update/composer/pestphp/pest-3.4.2
- dev-depfu/update/composer/pestphp/pest-plugin-laravel-2.4.0
- dev-depfu/update/composer/phpunit/phpunit-10.5.19
- dev-depfu/update/composer/orchestra/testbench-9.0.4
- dev-depfu/update/composer/phpunit/phpunit-10.5.18
- dev-depfu/update/composer/phpunit/phpunit-11.1.1
- dev-depfu/update/composer/pestphp/pest-2.34.7
- dev-depfu/update/composer/phpunit/phpunit-10.5.16
- dev-depfu/update/composer/orchestra/testbench-9.0.3
- dev-depfu/update/composer/pestphp/pest-2.34.5
- dev-depfu/update/composer/phpunit/phpunit-10.5.15
- dev-depfu/update/composer/orchestra/testbench-8.22.1
- dev-depfu/update/composer/orchestra/testbench-8.22.0
- dev-depfu/update/composer/pestphp/pest-2.34.2
- dev-depfu/update/composer/phpunit/phpunit-10.5.12
- dev-depfu/update/composer/nunomaduro/collision-8.1.1
- dev-depfu/update/composer/phpunit/phpunit-11.0.4
This package is auto-updated.
Last update: 2026-04-21 21:14:17 UTC
README
Two Blade directives that boost your Lighthouse and PageSpeed scores without changing a thing for real users.
Wrap your cookie banner, chat widget, analytics scripts, video embeds and other heavy chrome in @user ... @enduser. Bots like Googlebot, Lighthouse and PageSpeed will skip it entirely; humans see the same experience as before.
@user <script src="https://heavy-chat-widget.com/loader.js" async></script> <cookie-banner></cookie-banner> @enduser
Result: lighter HTML for crawlers, better Core Web Vitals, more crawl budget spent on the content that actually matters — and zero JS or middleware changes.
Why developers reach for this
- Better Lighthouse / PageSpeed scores. Audit tools render the page like a low-power phone. Strip the widgets they don't need and the score climbs.
- Better Core Web Vitals. LCP, INP and CLS all benefit when crawlers stop pulling in chat libraries and consent banners.
- More crawl budget for real content. Googlebot fetches less JS, indexes more pages.
- One-line wrap. No middleware, no service container plumbing, no view composers — just Blade.
- Octane-safe. Reads the user agent per request, so long-running workers don't serve stale data.
- ReDoS-hardened. User-agent input is clamped before any regex runs.
- Up to date. Built on
jaybizzle/crawler-detect(thousands of bots, regularly updated) plus Lighthouse and PageSpeed out of the box.
Install
composer require vlados/laravel-blade-crawler-detect
That's it — the service provider auto-registers. No config file, no migrations, no env vars.
Requires PHP 8.1+ and Laravel 10, 11, 12 or 13.
The two directives
@user — render only for humans
Anything that hurts your audit score, is invisible to bots anyway, or just doesn't need to ship to crawlers.
{{-- Cookie / consent banners --}} @user <x-cookie-consent /> @enduser {{-- Chat widgets, support bubbles --}} @user <script src="https://widget.intercom.io/widget/{{ config('services.intercom.id') }}"></script> @enduser {{-- Heavy analytics / tag managers --}} @user <script async src="https://www.googletagmanager.com/gtag/js?id=GA_ID"></script> @enduser {{-- Lazy-mounted Vue / Livewire / Alpine widgets --}} @user <livewire:product-recommendations :product="$product" /> @enduser
@unlessuser — render only for crawlers
Server-render the SEO-friendly equivalent of something you ship as JS to humans.
{{-- Humans get the interactive gallery --}} @user <product-gallery :images="{{ $product->images->toJson() }}" /> @enduser {{-- Crawlers get plain, indexable images --}} @unlessuser @foreach ($product->images as $image) <img src="{{ $image->url }}" alt="{{ $image->alt }}" loading="lazy"> @endforeach @enduser
Real-world wins
Wrap this in @user |
Why it helps |
|---|---|
| Cookie consent banner | Removes ~200ms LCP delay on Lighthouse |
| Intercom / Drift / Zendesk widget | Removes 100-300KB of third-party JS |
| Google Tag Manager / Analytics | Removes blocking script + network round-trip |
| Optimizely / VWO / experimentation SDKs | Removes render-blocking script |
| Hotjar / FullStory / session recording | Removes 50-150KB of third-party JS |
| YouTube / Vimeo iframe embeds | Removes a heavy iframe + its JS |
| Mapbox / Google Maps iframes | Removes a heavy iframe + its tile fetches |
| Carousel / slider libraries | Removes JS + CSS that crawlers don't render |
| Chat triggers, modal openers | Removes interactive chrome bots can't click |
What "crawler" means
Detection is delegated to jaybizzle/crawler-detect, a battle-tested PHP library that ships a regex covering thousands of bots — Googlebot, Bingbot, DuckDuckBot, AhrefsBot, SemrushBot, Applebot, and so on.
This package additionally treats these as crawlers, since they typically run as audits rather than real visits:
Chrome-LighthouseGoogle Page Speed
Want to add your own? You can swap or wrap the CrawlerDetect instance through Laravel's container.
Performance
The crawler regex is compiled once per process (so Octane workers compile it at boot, traditional FPM workers compile it on first hit). Each render only does:
- One
substrto clamp the UA to 2KB. - One
preg_replacefor exclusions. - One
preg_matchagainst the compiled crawler pattern.
No DB queries, no cache lookups, no allocations beyond the strings above.
Octane / Swoole / RoadRunner
Safe by design. The user agent is read from the current request inside the directive's closure, so long-running workers always see the active request's UA — never a stale one cached at boot.
When NOT to use this
This package is a tool for hiding things crawlers don't need (heavy widgets, third-party scripts, modal chrome). It is not a tool for showing crawlers different content than you show users — that's cloaking under Google's spam policies and can earn a manual penalty. Use @unlessuser for SSR-equivalents of things you JS-render for humans, not for keyword stuffing.
Testing
composer test
Changelog
Please see CHANGELOG.
Contributing
Please see CONTRIBUTING.
Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
Credits
- Vladislav Stoitsov
jaybizzle/crawler-detect— the regex behind this package- All Contributors
License
The MIT License (MIT). Please see License File for more information.