agentleFS
syofyanzuhadsyofyanzuhad/uptime-kita/.github/skills/pulse-development/SKILL.md

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
  1. Very specific:

    Use search-docs for detailed Laravel Pulse patterns and documentation, including card layout customization, user resolver configuration, …

    line 13
  2. Very specific:

    All 10 built-in recorders are configurable in config/pulse.php:

    line 45
  3. Very specific:

    Use Pulse::filter() in AppServiceProvider::boot() to exclude entries globally.

    line 76
  4. Distinctive:

    Run a worker to drain the Redis stream into the database:

    line 101
  5. Very specific:

    Call Pulse::record() from a recorder, listener, or observer.

    line 119
  6. Very specific:

    When the entry is tied to the authenticated user, use Pulse::resolveAuthenticatedUserId() instead of Auth::id() to respect custom user …

    line 130
  7. Very specific:

    Run migrations and confirm /pulse is accessible in local

    line 188
  8. Very specific:

    If using Redis ingest, confirm pulse:work is running

    line 191
  9. Very specific:

    Always use search-docs for the latest Pulse documentation rather than relying on this skill alone.

    line 204

≈ “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.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

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 migrate

The 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:

RecorderKey Config Options
CacheInteractionssample_rate, ignore, groups (regex find/replace)
Exceptionssample_rate, ignore, location
Queuessample_rate, ignore
SlowJobsthreshold (ms, per-job regex map), sample_rate, ignore
SlowOutgoingRequeststhreshold (ms, per-URL regex map), sample_rate, ignore, groups
SlowQueriesthreshold (ms, per-query regex map), sample_rate, ignore, location
SlowRequeststhreshold (ms, per-route regex map), sample_rate, ignore
ServersPULSE_SERVER_NAME env var, monitored disk paths
UserJobssample_rate, ignore
UserRequestssample_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=pulse

Run a worker to drain the Redis stream into the database:

php artisan pulse:work

Signal a graceful restart during deployment (requires a working cache driver):

php artisan pulse:restart

Custom 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

  1. Run migrations and confirm /pulse is accessible in local
  2. Define viewPulse gate and verify production access
  3. Confirm pulse:check is running for the Servers card
  4. If using Redis ingest, confirm pulse:work is 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 viewPulse gate to enable production access.
  • The Servers card shows no data unless pulse:check runs as a persistent process. Supervisor is recommended.
  • Redis ingest silently queues data. The dashboard appears empty if pulse:work is not running.
  • pulse:restart requires a working cache driver. Without it, the signal is never received.
  • Pulse exceptions fail silently. Use Pulse::handleExceptionsUsing() to surface errors during development.
  • Multiple Authenticatable models can cause incorrect user tracking. Use Pulse::resolveAuthenticatedUserId() when recording user-keyed entries.
  • SQS queues may appear duplicated in the Queue card. Use ignore regex patterns to suppress them.
  • Sampled dashboard values are approximate and prefixed with ~. They are not suitable for financial or audit reporting.
  • Always use search-docs for the latest Pulse documentation rather than relying on this skill alone.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

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.