pulse-development
Skill184 starsChanged 2 months agoApache-2.0View on GitHub
Handles Laravel Pulse setup, configuration, and custom card development. Activates when installing Pulse; configuring the dashboard or authorization gate; setting up recorders and filtering; building custom Livewire cards; optimizing with Redis ingest or sampling; or when the user mentions /pulse, pulse:check, pulse:work, Pulse::record(), or application monitoring.
We split this skill into the rules it gives an agent
9 rules. About 0 are common, 1 is distinctive, and 8 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 13
Use search-docs for detailed Laravel Pulse patterns and documentation, including card layout customization, user resolver configuration, …
- Very specific: line 45
All 10 built-in recorders are configurable in config/pulse.php:
- Very specific: line 76
Use Pulse::filter() in AppServiceProvider::boot() to exclude entries globally.
- Distinctive: line 101
Run a worker to drain the Redis stream into the database:
- Very specific: line 119
Call Pulse::record() from a recorder, listener, or observer.
- Very specific: line 130
When the entry is tied to the authenticated user, use Pulse::resolveAuthenticatedUserId() instead of Auth::id() to respect custom user …
- Very specific: line 188
Run migrations and confirm /pulse is accessible in local
- Very specific: line 191
If using Redis ingest, confirm pulse:work is running
- Very specific: line 204
Always use search-docs for the latest Pulse documentation rather than relying on this skill alone.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Laravel Pulse Development
Documentation
Use search-docs for detailed Laravel Pulse patterns and documentation, including card layout customization, user resolver configuration, all recorder options, sampling, dedicated database connections, Vite/CSS integration, Tailwind scoping, blade card components, and lazy loading.
Installation
Pulse stores data in your application's database. The current package supports MySQL, MariaDB, PostgreSQL, and SQLite.
composer require laravel/pulse
php artisan vendor:publish --provider="Laravel\Pulse\PulseServiceProvider"
php artisan migrateThe dashboard is available at /pulse.
Dashboard Authorization
Define the viewPulse gate in AppServiceProvider::boot() to enable production access:
<!-- Pulse Dashboard Authorization -->use App\Models\User;
use Illuminate\Support\Facades\Gate;
Gate::define('viewPulse', function (User $user) {
return $user->isAdmin();
});Without this gate, the dashboard is inaccessible in all non-local environments.
Recorders
All 10 built-in recorders are configurable in config/pulse.php:
| Recorder | Key Config Options |
CacheInteractions | sample_rate, ignore, groups (regex find/replace) |
Exceptions | sample_rate, ignore, location |
Queues | sample_rate, ignore |
SlowJobs | threshold (ms, per-job regex map), sample_rate, ignore |
SlowOutgoingRequests | threshold (ms, per-URL regex map), sample_rate, ignore, groups |
SlowQueries | threshold (ms, per-query regex map), sample_rate, ignore, location |
SlowRequests | threshold (ms, per-route regex map), sample_rate, ignore |
Servers | PULSE_SERVER_NAME env var, monitored disk paths |
UserJobs | sample_rate, ignore |
UserRequests | sample_rate, ignore |
Per-route and per-job threshold overrides use a regex-keyed map with a default fallback:
<!-- Per-Route Threshold Override -->Recorders\SlowRequests::class => [
'threshold' => [
'#^/api/reports#' => 5000,
'default' => env('PULSE_SLOW_REQUESTS_THRESHOLD', 1000),
],
],The Servers recorder requires pulse:check running as a persistent daemon (Supervisor recommended).
Filtering Entries
Use Pulse::filter() in AppServiceProvider::boot() to exclude entries globally. Return true to record, false to skip:
<!-- Pulse Entry Filter -->use Laravel\Pulse\Entry;
use Laravel\Pulse\Facades\Pulse;
use Laravel\Pulse\Value;
use Illuminate\Support\Facades\Auth;
Pulse::filter(function (Entry|Value $entry) {
return Auth::user()?->isNotAdmin() ?? true;
});Performance
Redis Ingest
Offload entry writes from the request cycle to a Redis stream (requires Redis 6.2+ and phpredis or predis):
PULSE_INGEST_DRIVER=redis
PULSE_REDIS_CONNECTION=pulseRun a worker to drain the Redis stream into the database:
php artisan pulse:workSignal a graceful restart during deployment (requires a working cache driver):
php artisan pulse:restartCustom Cards
Custom cards are Livewire components extending Pulse's base Card class.
Recording Entries
Call Pulse::record() from a recorder, listener, or observer. Chain aggregation methods (avg, count, max, min, sum) in a single call:
<!-- Record Pulse Entry -->use Laravel\Pulse\Facades\Pulse;
Pulse::record('user_sale', $user->id, $sale->amount)
->sum()
->count();When the entry is tied to the authenticated user, use Pulse::resolveAuthenticatedUserId() instead of Auth::id() to respect custom user resolvers.
Card Component
<!-- Custom Pulse Card -->namespace App\Livewire\Pulse;
use Laravel\Pulse\Facades\Pulse;
use Laravel\Pulse\Livewire\Card;
use Livewire\Attributes\Lazy;
#[Lazy]
class TopSellers extends Card
{
public function render(): \Illuminate\View\View
{
$aggregates = $this->aggregate('user_sale', ['sum', 'count']);
$users = Pulse::resolveUsers($aggregates->pluck('key'));
return view('livewire.pulse.top-sellers', [
'sellers' => $aggregates->map(fn ($row) => (object) [
'user' => $users->find($row->key),
'sum' => $row->sum,
'count' => $row->count,
]),
]);
}
}$this->aggregate(type, aggregates) returns a Collection of stdClass objects with key and one property per aggregation method. $this->aggregateTotal(type, aggregate) returns a single scalar.
Custom Recorders
A recorder is a plain class with a $listen array of Laravel events:
<!-- Custom Pulse Recorder -->class SaleRecorder
{
public array $listen = [
\App\Events\SaleCompleted::class,
];
public function record(\App\Events\SaleCompleted $event): void
{
\Laravel\Pulse\Facades\Pulse::record('user_sale', $event->user->id, $event->sale->amount)
->sum()
->count();
}
}Register the recorder in the recorders array in config/pulse.php.
Verification
- Run migrations and confirm
/pulseis accessible in local - Define
viewPulsegate and verify production access - Confirm
pulse:checkis running for the Servers card - If using Redis ingest, confirm
pulse:workis running
Common Pitfalls
- An empty dashboard or database errors usually mean the Pulse tables have not been published and migrated yet.
- The dashboard is local-only by default. Define the
viewPulsegate to enable production access. - The Servers card shows no data unless
pulse:checkruns as a persistent process. Supervisor is recommended. - Redis ingest silently queues data. The dashboard appears empty if
pulse:workis not running. pulse:restartrequires a working cache driver. Without it, the signal is never received.- Pulse exceptions fail silently. Use
Pulse::handleExceptionsUsing()to surface errors during development. - Multiple
Authenticatablemodels can cause incorrect user tracking. UsePulse::resolveAuthenticatedUserId()when recording user-keyed entries. - SQS queues may appear duplicated in the Queue card. Use
ignoreregex patterns to suppress them. - Sampled dashboard values are approximate and prefixed with
~. They are not suitable for financial or audit reporting. - Always use
search-docsfor the latest Pulse documentation rather than relying on this skill alone.
In this repository33 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- .github/copilot-instructions.mdCopilot instructions
- .cursor/rules/laravel-boost.mdcCursor rule
- configure-nightwatchSkill
- configuring-horizonSkill
- inertia-vue-developmentSkill
- infer-conventionsSkill
- laravel-best-practicesSkill
- pulse-developmentSkill
- socialite-developmentSkill
- tailwindcss-developmentSkill
- testing-best-practicesSkill
- wayfinder-developmentSkill
- configure-nightwatchSkill
- configuring-horizonSkill
- inertia-vue-developmentSkill
- infer-conventionsSkill
- laravel-best-practicesSkill
- socialite-developmentSkill
- tailwindcss-developmentSkill
- testing-best-practicesSkill
- wayfinder-developmentSkill
- configure-nightwatchSkill
- configuring-horizonSkill
- inertia-vue-developmentSkill
- infer-conventionsSkill
- laravel-best-practicesSkill
- pulse-developmentSkill
- socialite-developmentSkill
- tailwindcss-developmentSkill
- testing-best-practicesSkill
- wayfinder-developmentSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

