PHPackages                             padosoft/laravel-rebel-bridge-fortify - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Authentication &amp; Authorization](/categories/authentication)
4. /
5. padosoft/laravel-rebel-bridge-fortify

ActiveLibrary[Authentication &amp; Authorization](/categories/authentication)

padosoft/laravel-rebel-bridge-fortify
=====================================

Bridge between Laravel Fortify and Laravel Rebel: exposes password-confirm / passkey / TOTP as step-up drivers, maps Fortify events into the Rebel audit trail, and enables passkey-first login. Part of padosoft/laravel-rebel-\*.

v0.1.1(1mo ago)087↓90%[1 PRs](https://github.com/padosoft/laravel-rebel-bridge-fortify/pulls)1MITPHPPHP ^8.3CI passing

Since Jun 3Pushed 1mo agoCompare

[ Source](https://github.com/padosoft/laravel-rebel-bridge-fortify)[ Packagist](https://packagist.org/packages/padosoft/laravel-rebel-bridge-fortify)[ Docs](https://github.com/padosoft/laravel-rebel-bridge-fortify)[ RSS](/packages/padosoft-laravel-rebel-bridge-fortify/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (2)Dependencies (12)Versions (7)Used By (1)

Laravel Rebel — Fortify Bridge
==============================

[](#laravel-rebel--fortify-bridge)

> Official documentation:

> **Make Laravel Fortify's factors first-class step-up methods.** This bridge turns Fortify's password confirmation, TOTP two-factor, and passkeys into Rebel **step-up drivers** — so you can require the *right strength* of re-authentication per sensitive action — and it folds Fortify's login/2FA events into one unified Rebel **audit trail**. It also ships a **passkey-first login** flow with an email-OTP fallback. Part of the `padosoft/laravel-rebel-*` suite.

 [![Laravel Rebel](resources/screenshoots/Laravel-Rebel-banner.png)](resources/screenshoots/Laravel-Rebel-banner.png)

 [![Laravel 12|13](https://camo.githubusercontent.com/9e9b743bcbf97a29fe735334a4a8e906d05d60310969905af6607cef8da30138/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d313225323025374325323031332d4646324432303f7374796c653d666c61742d737175617265266c6f676f3d6c61726176656c266c6f676f436f6c6f723d7768697465)](https://camo.githubusercontent.com/9e9b743bcbf97a29fe735334a4a8e906d05d60310969905af6607cef8da30138/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d313225323025374325323031332d4646324432303f7374796c653d666c61742d737175617265266c6f676f3d6c61726176656c266c6f676f436f6c6f723d7768697465) [![PHP 8.3+](https://camo.githubusercontent.com/6aa777dd33ef43fbef727d8187b578003a61e5dc41bbc958b0938c996cdc92f2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e33253230253743253230382e34253230253743253230382e352d3737374242343f7374796c653d666c61742d737175617265266c6f676f3d706870266c6f676f436f6c6f723d7768697465)](https://camo.githubusercontent.com/6aa777dd33ef43fbef727d8187b578003a61e5dc41bbc958b0938c996cdc92f2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e33253230253743253230382e34253230253743253230382e352d3737374242343f7374796c653d666c61742d737175617265266c6f676f3d706870266c6f676f436f6c6f723d7768697465) [![PHPStan max](https://camo.githubusercontent.com/4b9a3c97d76534abb905e64bd9e5bb9f13fe68e962071e0ccbbe7b629112f11c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048505374616e2d6d61782d3241364644423f7374796c653d666c61742d737175617265)](https://camo.githubusercontent.com/4b9a3c97d76534abb905e64bd9e5bb9f13fe68e962071e0ccbbe7b629112f11c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048505374616e2d6d61782d3241364644423f7374796c653d666c61742d737175617265) [![Pest 4](https://camo.githubusercontent.com/9b9da1d7d243a7465ab338e9374e47300a7fe2e26b5c291e7e3c95b53153789a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d50657374253230342d3232433535453f7374796c653d666c61742d737175617265)](https://camo.githubusercontent.com/9b9da1d7d243a7465ab338e9374e47300a7fe2e26b5c291e7e3c95b53153789a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d50657374253230342d3232433535453f7374796c653d666c61742d737175617265) [![Fortify bridge](https://camo.githubusercontent.com/029c872aa1e199e12024d8e837bbba699481b57a01ee8eae88f28c661d0f8c7e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466f72746966792d6272696467652d4646324432303f7374796c653d666c61742d737175617265)](https://camo.githubusercontent.com/029c872aa1e199e12024d8e837bbba699481b57a01ee8eae88f28c661d0f8c7e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466f72746966792d6272696467652d4646324432303f7374796c653d666c61742d737175617265) [![MIT](https://camo.githubusercontent.com/ac049ef4e7a0b7196b09add6ac2d4f180e544c0ac779c2b2ac2fd2723a209579/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75653f7374796c653d666c61742d737175617265)](https://camo.githubusercontent.com/ac049ef4e7a0b7196b09add6ac2d4f180e544c0ac779c2b2ac2fd2723a209579/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75653f7374796c653d666c61742d737175617265)

---

Table of contents
-----------------

[](#table-of-contents)

- [What it is (and what it is not)](#what-it-is-and-what-it-is-not)
- [Quick glossary (one minute)](#quick-glossary-one-minute)
- [Why this bridge — the moats](#why-this-bridge--the-moats)
- [Rebel Fortify Bridge vs the alternatives](#rebel-fortify-bridge-vs-the-alternatives)
- [How it works (step by step)](#how-it-works-step-by-step)
- [Installation (junior-proof)](#installation-junior-proof)
- [Configuration (every option)](#configuration-every-option)
- [Usage examples](#usage-examples)
    - [1. Require a strong step-up for a sensitive action](#1-require-a-strong-step-up-for-a-sensitive-action)
    - [2. Password re-confirmation (sudo mode)](#2-password-re-confirmation-sudo-mode)
    - [3. TOTP and recovery codes](#3-totp-and-recovery-codes)
    - [4. Passkey step-up (phishing-resistant)](#4-passkey-step-up-phishing-resistant)
    - [5. Passkey-first login with email-OTP fallback](#5-passkey-first-login-with-email-otp-fallback)
    - [6. Unified audit trail](#6-unified-audit-trail)
- [The assurance hierarchy (important)](#the-assurance-hierarchy-important)
- [`.env.example`](#envexample)
- [Security notes](#security-notes)
- [Testing &amp; License](#testing--license)

---

What it is (and what it is not)
-------------------------------

[](#what-it-is-and-what-it-is-not)

**It is** the glue between [Laravel Fortify](https://github.com/laravel/fortify) and the Rebel step-up engine ([`padosoft/laravel-rebel-step-up`](https://github.com/padosoft/laravel-rebel-step-up)). Fortify gives your app password/2FA/passkey *plumbing*; Rebel gives you a *policy* layer ("this action needs AAL2 + phishing-resistant"). This bridge lets the two talk: Fortify's factors become Rebel step-up **drivers**, and Fortify's auth **events** become Rebel audit records.

**It is not** a login UI and it does not replace Fortify — keep using Fortify for registration, login, 2FA enrolment and passkey management. This package adds the *re-authentication policy* and *audit unification* on top.

Depends on [`padosoft/laravel-rebel-core`](https://github.com/padosoft/laravel-rebel-core)and [`padosoft/laravel-rebel-step-up`](https://github.com/padosoft/laravel-rebel-step-up). Fortify itself is **optional** (feature-detected): without it, the password-confirm driver still works and the Fortify-only pieces are simply skipped.

---

Quick glossary (one minute)
---------------------------

[](#quick-glossary-one-minute)

TermIn plain words**Step-up**"You're already logged in, but for THIS action prove it's really you again."**Step-up driver**A way to perform that proof: password, TOTP, passkey… Each declares the strength it provides.**AAL** (Authenticator Assurance Level)NIST strength level. `aal1` = one factor (e.g. a password); `aal2` = two factors / stronger.**AMR***Authentication Methods References* — the methods used, e.g. `['pwd']`, `['otp','totp']`, `['webauthn']`.**Phishing-resistant**A proof phishing can't steal — typically a **passkey/FIDO2**. A password or a TOTP is **not**.**TOTP**The 6-digit code from an authenticator app (Google Authenticator, 1Password…).**Recovery code**A one-time backup code used when the authenticator device is unavailable.**Audit trail**One table (`rebel_auth_events`) where every auth event lands, regardless of which library produced it.---

Why this bridge — the moats
---------------------------

[](#why-this-bridge--the-moats)

★WhatIn short★★★**Per-action strength**Require `aal2` + phishing-resistant for a payout, just a password for a profile tweak — declaratively, via step-up policies.★★★**NIST-correct assurance**Password = AAL1, TOTP = AAL2, passkey = AAL2 phishing-resistant. No over-claiming: a password can't satisfy a high-assurance action.★★★**Replay-resistant by design**Passkey confirmations are bound to a single-use server challenge; recovery codes are consumed atomically (row-locked).★★**Unified audit**Fortify logins, failures, lockouts and 2FA events all land in `rebel_auth_events` — lockouts with HMAC'd IP/identifier (no plaintext PII).★★**Passkey-first login**Offer passkeys first, fall back to email-OTP automatically when the user has none.★★**Optional Fortify**Feature-detected: installs and partly works even without Fortify; no hard crash.★**Pluggable passkeys**Bring your own WebAuthn implementation via a tiny contract; a fake ships for tests.---

Rebel Fortify Bridge vs the alternatives
----------------------------------------

[](#rebel-fortify-bridge-vs-the-alternatives)

How "re-authenticate before a sensitive action" looks with each approach:

Capability**Rebel Fortify Bridge**ShopifyFortify aloneLaravel `password.confirm`Hand-rolledRe-confirm with a password✅➖✅✅✅Re-confirm with **TOTP**✅❌❌❌❌Re-confirm with a **passkey**✅❌❌❌❌**Per-action** required strength (AAL/AMR)✅❌❌❌❌Rejects a factor **below** the required assurance✅❌❌❌❌Passkey confirm bound to a single-use challenge✅❌➖❌❌Atomic, single-use recovery codes for step-up✅❌➖ (login only)❌❌Confirmation decays after a TTL✅➖➖✅❌**PSD2/SCA dynamic linking** (amount+payee)✅ (via step-up)❌❌❌❌Unified audit trail across login + 2FA + step-up✅➖❌❌❌Lockout audit with HMAC'd IP/identifier✅❌❌❌❌Multi-tenant aware✅❌❌❌❌> Legend: ✅ built-in · ➖ partial / only in a narrow flow / hosted-only / not exposed to you · ❌ not available. Fortify is excellent at what it does (login, 2FA enrolment, passkey management) — this bridge builds the *policy + audit* layer on top of it, it does not compete with it. Note on Shopify: it is a **hosted, closed commerce platform** you can neither self-host nor extend — it exposes none of these re-authentication primitives to your own Laravel app, so it's a black box you don't control.

---

How it works (step by step)
---------------------------

[](#how-it-works-step-by-step)

```
You configure a step-up "purpose" (in laravel-rebel-step-up) and list the drivers it accepts:

  'checkout-credit-order' => [
      'required_assurance' => 'aal2',
      'require_phishing_resistant' => true,
      'drivers' => ['fortify_passkey_confirm', 'fortify_totp'],  //  issue a challenge, verify the assertion (phishing-resistant, AAL2)
  - else TOTP?          -> verify the 6-digit code or a recovery code (AAL2)
  - else password?      -> verify the password (AAL1)  [only if the policy allows AAL1]
        |
        v
Meanwhile, every Fortify/framework auth event (login, failure, lockout, 2FA enabled...)
is mapped into rebel_auth_events -- one audit trail for the whole stack.

```

---

Installation (junior-proof)
---------------------------

[](#installation-junior-proof)

> Prerequisites: Laravel **12 or 13**, PHP **8.3+**, and `padosoft/laravel-rebel-core` + `padosoft/laravel-rebel-step-up` installed (they come as dependencies). [Laravel Fortify](https://github.com/laravel/fortify) is recommended but optional.

**1) Require the package**

```
composer require padosoft/laravel-rebel-bridge-fortify
```

**2) (Recommended) install Fortify and enable two-factor / passkeys**

```
composer require laravel/fortify
php artisan fortify:install
php artisan migrate
```

Enable the features you want in `config/fortify.php` (e.g. `Features::twoFactorAuthentication()`). See the [Fortify docs](https://laravel.com/docs/fortify) for the enrolment UI.

**3) Publish the bridge config (optional)**

```
php artisan vendor:publish --tag="rebel-bridge-fortify-config"
```

**4) Use the drivers in your step-up policies** (`config/rebel-step-up.php`):

```
'purposes' => [
    'change-email' => [
        'required_assurance' => 'aal1',
        'drivers' => ['fortify_password_confirm'],
    ],
    'checkout-credit-order' => [
        'required_assurance' => 'aal2',
        'require_phishing_resistant' => true,
        'drivers' => ['fortify_passkey_confirm', 'fortify_totp'],
    ],
],
```

That's it — the bridge has already registered the drivers; the step-up engine will use them.

---

Configuration (every option)
----------------------------

[](#configuration-every-option)

File `config/rebel-bridge-fortify.php`:

KeyDefaultWhat it does`drivers.password_confirm``true`Register the `fortify_password_confirm` step-up driver (works even without Fortify).`drivers.totp``true`Register `fortify_totp` — only when Laravel Fortify is installed.`drivers.passkey``true`Register `fortify_passkey_confirm` — only when a `PasskeyConfirmer` is bound (see below).`audit_events``true`Map framework + Fortify auth events into `rebel_auth_events`.To enable the **passkey** driver, bind your WebAuthn implementation:

```
// In a service provider
use Padosoft\Rebel\Bridge\Fortify\Contracts\PasskeyConfirmer;

$this->app->singleton(PasskeyConfirmer::class, MyWebAuthnPasskeyConfirmer::class);
```

(For passkey-first **login** you bind `PasskeyAuthenticator` the same way.)

---

Usage examples
--------------

[](#usage-examples)

### 1. Require a strong step-up for a sensitive action

[](#1-require-a-strong-step-up-for-a-sensitive-action)

Protect a route with the step-up middleware (from `laravel-rebel-step-up`); this bridge supplies the factors the policy is allowed to use:

```
Route::middleware(['auth', 'rebel.stepup:checkout-credit-order'])
    ->post('/checkout/confirm', [CheckoutController::class, 'confirm']);
```

With the policy above, the engine will demand a **passkey** (or TOTP) — a password alone won't pass, because it's only AAL1.

### 2. Password re-confirmation (sudo mode)

[](#2-password-re-confirmation-sudo-mode)

```
// config/rebel-step-up.php
'delete-account' => [
    'required_assurance' => 'aal1',
    'drivers' => ['fortify_password_confirm'],
],
```

```
// The user re-enters their password; the driver verifies it via the framework hasher.
$result = app(\Padosoft\Rebel\StepUp\RebelStepUp::class)
    ->confirm($challengeId, $request->string('password'), $ctx);
```

### 3. TOTP and recovery codes

[](#3-totp-and-recovery-codes)

When the policy lists `fortify_totp`, the user submits their 6-digit code — or, if they lost their device, a **recovery code** (consumed once, atomically):

```
$result = $stepUp->confirm($challengeId, $request->string('code'), $ctx);
// '123456'        -> verified via the authenticator app
// 'ABCD-EFGH-...' -> verified via a recovery code (then invalidated)
```

### 4. Passkey step-up (phishing-resistant)

[](#4-passkey-step-up-phishing-resistant)

```
// 1) start() issues a single-use challenge -- send it to the browser
$start = $stepUp->start($ctx);              // $start->reference = the WebAuthn challenge

// 2) the browser produces an assertion via navigator.credentials.get(); verify it
$result = $stepUp->confirm($start->challengeId, $assertionJson, $ctx);
```

The assertion is verified against *that* challenge, so a captured assertion cannot be replayed.

### 5. Passkey-first login with email-OTP fallback

[](#5-passkey-first-login-with-email-otp-fallback)

```
use Padosoft\Rebel\Bridge\Fortify\PasskeyFirstLogin;

public function begin(Request $request, PasskeyFirstLogin $login)
{
    $options = $login->begin($request->string('email'));

    if ($options === null) {
        // No passkey for this user -> fall back to email-OTP (laravel-rebel-email-otp)
        return response()->json(['fallback' => 'email_otp']);
    }

    // Persist the challenge (e.g. in the session) to bind it on completion
    $request->session()->put('passkey_challenge', $options['challenge']);

    return response()->json(['passkey' => $options]);
}

public function complete(Request $request, PasskeyFirstLogin $login)
{
    $user = $login->complete(
        $request->string('assertion'),
        (string) $request->session()->pull('passkey_challenge'),
    );

    return $user !== null
        ? response()->json(['ok' => true])
        : response()->json(['error' => 'invalid'], 422);
}
```

### 6. Unified audit trail

[](#6-unified-audit-trail)

No code needed — once installed, framework and Fortify events are recorded automatically:

```
use Padosoft\Rebel\Core\Models\RebelAuthEvent;

RebelAuthEvent::query()->where('event_type', 'login.succeeded')->latest()->take(20)->get();
RebelAuthEvent::query()->where('event_type', 'login.lockout')->get(); // IP/identifier are HMAC'd
RebelAuthEvent::query()->where('event_type', 'fortify.two_factor.enabled')->get();
```

**Rich login context (since 0.1.1).** Framework login/logout events are recorded with the request **IP** and **User-Agent** (keyed HMACs, never plaintext) and a successful password login records `aal = aal1` plus the `pwd` factor in `amr` — so the admin panel's Audit Explorer shows IP, country (via `laravel-rebel-core`'s geo capture), assurance and AMR for these events, not blanks.

---

The assurance hierarchy (important)
-----------------------------------

[](#the-assurance-hierarchy-important)

This bridge is deliberately honest about strength, so a weak factor can never satisfy a strong requirement:

DriverAALPhishing-resistantGood for`fortify_password_confirm`**AAL1**❌Low-risk re-auth ("sudo mode"), profile edits.`fortify_totp`**AAL2**❌Medium-risk actions; the everyday second factor.`fortify_passkey_confirm`**AAL2**✅High-value actions (payments, credit orders, recovery).A purpose that requires `aal2` + `require_phishing_resistant` can only be satisfied by a passkey. `rebel:validate-config` (from the step-up package) fails your CI if a purpose lists no driver that can meet its bar.

---

`.env.example`
--------------

[](#envexample)

```
# Which Fortify-backed step-up drivers to register
REBEL_FORTIFY_DRIVER_PASSWORD=true
REBEL_FORTIFY_DRIVER_TOTP=true
REBEL_FORTIFY_DRIVER_PASSKEY=true

# Map framework + Fortify auth events into the Rebel audit trail
REBEL_FORTIFY_AUDIT_EVENTS=true
```

---

Security notes
--------------

[](#security-notes)

- **No assurance over-claiming**: assurance levels follow NIST (password = AAL1, TOTP = AAL2, passkey = AAL2 phishing-resistant). The step-up engine enforces them against the policy.
- **Passkey replay resistance**: confirmations are bound to a single-use, server-issued challenge; a missing challenge is refused.
- **TOTP replay**: delegated to Fortify's `TwoFactorAuthenticationProvider` (cache-backed in a real Fortify install), plus every step-up challenge is single-use.
- **Recovery codes**: consumed atomically (row lock + targeted update) so they can't be redeemed twice, and the consumption is audited (`fortify.recovery_code.used`).
- **No plaintext PII in audit**: lockouts store IP and identifier as keyed HMACs; a failed passkey login does not claim a WebAuthn AMR.

---

🔋 Vibe coding with batteries included
-------------------------------------

[](#-vibe-coding-with-batteries-included)

This package ships **AI batteries** — so you (and your AI agent) can extend it correctly on the first try:

- **`CLAUDE.md`** — a concise AI working guide (purpose, conventions, architecture, how to extend, Definition of Done). Plain Markdown, so Claude Code, Cursor, Copilot and Codex all read it.
- **`AGENTS.md`** — the agent/workflow contract (branch → PR → CI → tag/release, the gates).
- **`.claude/skills/`** — invocable skills (at least `rebel-package-dev`) encoding the suite's TDD loop, the **PHPStan-level-max** recipes, the security/telemetry rules, and the release discipline.

Open the repo in your AI editor and just start — the rules, guardrails and extension recipes come with it. PRs that follow the shipped `CLAUDE.md` pass CI (PHPStan max + Pest + Pint) and review the first time around.

---

Testing &amp; License
---------------------

[](#testing--license)

```
composer test      # Pest (drivers, event mapping, passkey-first login, step-up integration)
composer phpstan   # static analysis, level max
composer pint      # code style
```

**License:** MIT — see [LICENSE](LICENSE). Part of the [`padosoft/laravel-rebel`](https://github.com/padosoft) suite.

###  Health Score

40

—

FairBetter than 86% of packages

Maintenance91

Actively maintained with recent releases

Popularity11

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity43

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

2

Last Release

51d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/10467699?v=4)[Lorenzo](/maintainers/lopadova)[@lopadova](https://github.com/lopadova)

---

Top Contributors

[![lopadova](https://avatars.githubusercontent.com/u/10467699?v=4)](https://github.com/lopadova "lopadova (8 commits)")

---

Tags

laraveltotpAuthenticationpasskeyfortifypadosoftRebelstep-up

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/padosoft-laravel-rebel-bridge-fortify/health.svg)

```
[![Health](https://phpackages.com/badges/padosoft-laravel-rebel-bridge-fortify/health.svg)](https://phpackages.com/packages/padosoft-laravel-rebel-bridge-fortify)
```

###  Alternatives

[defstudio/telegraph

A laravel facade to interact with Telegram Bots

813336.8k3](/packages/defstudio-telegraph)[rawilk/profile-filament-plugin

Profile &amp; MFA starter kit for filament.

3914.8k](/packages/rawilk-profile-filament-plugin)[harris21/laravel-fuse

Circuit breaker for Laravel queue jobs. Protect your workers from cascading failures.

45955.7k](/packages/harris21-laravel-fuse)[masterix21/laravel-licensing

Laravel licensing package with polymorphic assignment to any model, activation keys, expirations/renewals, and seat control via LicenseUsage. Supports offline verification with public-key–signed tokens, a CLI to generate/rotate/revoke keys, and an extensible architecture via config and contracts.

1613.3k4](/packages/masterix21-laravel-licensing)[simplestats-io/laravel-client

Server-side analytics for Laravel that follows the full funnel from visit to registration to payment, attributed to the channel that drove it. Revenue, MRR, churn and ad-spend profit (ROAS/CAC) per channel. GDPR compliant, ad-blocker proof.

5022.6k](/packages/simplestats-io-laravel-client)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
