liberusoftware/webhooks-livewire
Livewire components for managing webhooks in Laravel apps: create, edit, and delete endpoints, toggle them on or off, and browse delivery logs straight from your dashboard—no custom UI needed.
This package is a presentation adapter: it wires the liberusoftware/webhooks domain module into Livewire components (typically a webhook CRUD screen plus a delivery-attempt log). Treat it as UI glue, not as the source of truth for webhook behaviour.
Minimal steps:
composer require liberusoftware/webhooks liberusoftware/webhooks-livewire
webhooks and delivery/log tables; this adapter should not define schema, but verify with php artisan vendor:publish --tag=webhooks-livewire (tag names may differ; inspect src/Providers).webhooks:: or liberusoftware.webhooks.). Find the exact alias in the provider's Livewire::component(...) calls before writing routes.<livewire:webhooks.webhook-list />
Where to look first: the Livewire/ (or Components/) directory for the public action methods, then the service provider for route/alias registration. Ignore the views until the components render.
Keep domain logic out of the components. The value of this adapter is that it does not contain delivery logic. When you need custom behaviour (retry policy, custom signing header, filtering which events are exposable), extend the core module's service/contract and let the Livewire component inject it — do not add methods on the component.
Embed-per-resource. The natural pattern in a modular Liberu app is to mount the webhook components inside each resource that can emit events (an Order page gets a webhook tab, a Contact page gets one). Pass the model as a typed Livewire property and let the component scope its own queries:
<livewire:webhooks.webhook-manager :model="$order" />
If the component doesn't already accept a scoping model, this is the first place to add a small wrapper rather than forking the package.
Action methods as the integration seam. The public Livewire methods (save, delete, sendTest, rotateSecret) are your integration points. Prefer calling them via Livewire::test() in feature tests over re-implementing the flow — you get coverage of the domain module's real code paths for free.
Delivery-log polling. Most webhook UIs want a live-ish delivery log. Two working patterns:
wire:poll.10s on the log component for low-traffic tenants — simplest, no extra infrastructure.WebhookDelivered/WebhookFailed events and #[On('echo-private:...')] in the component for anything busier. Use the core module's events rather than listening to your own queue events; the adapter is meant to be event-agnostic.Secret handling. Show the signing secret once on creation, then store it write-only in the UI (a masked display with a "rotate" action). Never bind the raw secret to a public Livewire property that persists across requests — Livewire serializes public properties into the payload.
Composition with your own policy layer. Gate the components with your existing WebhookPolicy (authorize create/update/delete against the tenant) instead of assuming the adapter does it. Zero-star, zero-dependent packages rarely ship multi-tenant authorization.
NOASSERTION. That is not a permissive license, it means the repository's metadata didn't resolve to a recognised SPDX identifier. Before shipping this in a commercial product, read the actual LICENSE file and get a human to sign off. This is the single biggest risk with the package and is easy to overlook because Composer won't warn you.app/ or a local path repository.composer why liberusoftware/webhooks first.wire:model on relationships will bite you. If the component binds a webhook.events array, edits to that array in the UI may not persist until the core module's save is called with the full payload. Debug by dumping the component state in a Livewire::test() rather than clicking through the browser.QUEUE_CONNECTION=sync in local dev it appears instant and you'll miss a broken worker in staging; if it's redis and the worker is down, the button silently does nothing. Check failed_jobs and the delivery log before blaming the UI.webhooks. vs webhooks::). If <livewire:...> renders a blank div, Livewire::getClass() for that alias is the fastest diagnostic.How can I help you explore Laravel packages today?