PHPackages                             syriable/laravel-converse - 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. syriable/laravel-converse

ActiveLibrary

syriable/laravel-converse
=========================

Marketplace-grade 1:1 messaging for Laravel: one thread per relationship, per-participant state, governed multi-type messages, and an event for everything.

1.2.1(1mo ago)01↓66.7%MITPHPPHP ^8.3CI passing

Since Jul 18Pushed 1mo agoCompare

[ Source](https://github.com/syriable/laravel-converse)[ Packagist](https://packagist.org/packages/syriable/laravel-converse)[ Docs](https://github.com/syriable/laravel-converse)[ GitHub Sponsors](https://github.com/syriable)[ RSS](/packages/syriable-laravel-converse/feed)WikiDiscussions main Synced 2w ago

READMEChangelog (4)Dependencies (16)Versions (5)Used By (0)

Laravel Converse — 1:1 messaging for any Laravel application
============================================================

[](#laravel-converse--11-messaging-for-any-laravel-application)

[![Latest Version on Packagist](https://camo.githubusercontent.com/7164aecaa215eafa4dea55b9fefa53c1037b1e1bef617a1050985a68fc8591ba/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f7379726961626c652f6c61726176656c2d636f6e76657273652e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/syriable/laravel-converse)[![GitHub Tests Action Status](https://camo.githubusercontent.com/bb2338fab53782ceceddd099a8054a00c7fb2a74f72f4a5c343a996768797474/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f7379726961626c652f6c61726176656c2d636f6e76657273652f72756e2d74657374732e796d6c3f6272616e63683d6d61696e266c6162656c3d7465737473267374796c653d666c61742d737175617265)](https://github.com/syriable/laravel-converse/actions?query=workflow%3Arun-tests+branch%3Amain)[![GitHub Code Style Action Status](https://camo.githubusercontent.com/8ef63e4e7fe2b1ca848752393517545ba915827a46a8644439336bb30fd7f302/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f7379726961626c652f6c61726176656c2d636f6e76657273652f6669782d7068702d636f64652d7374796c652d6973737565732e796d6c3f6272616e63683d6d61696e266c6162656c3d636f64652532307374796c65267374796c653d666c61742d737175617265)](https://github.com/syriable/laravel-converse/actions?query=workflow%3A%22Fix+PHP+code+style+issues%22+branch%3Amain)[![Total Downloads](https://camo.githubusercontent.com/a0a5b12a11d48fdb1c489af7004f64cf6fd6d1585d308e8ae2dc2ad8d43fa37a/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f7379726961626c652f6c61726176656c2d636f6e76657273652e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/syriable/laravel-converse)

Marketplace-grade private messaging between two users — the messaging model behind platforms like Fiverr, generalized into a headless Laravel package: **one trusted thread per relationship, private per-side state, governed multi-type messages, presence-aware notifications, and an event for everything.**

```
$buyer->messageTo($seller)->text('Hi! Is this service available?')->send();
```

No routes, no views, no JavaScript, no broadcasting transport — Converse is a domain layer you build your own UI, API, and real-time transport on top of.

Key features
------------

[](#key-features)

- **One conversation per pair** — a unique normalized pair key, safe under concurrent creation, replaceable via the `ConversationResolver` contract.
- **Per-participant state** — read horizon, unread counter, folders, star, hide, mute, notes, labels: every one-sided action is invisible to the other side.
- **Governed messages** — a send-policy chain, an edit/delete window with an immutable revision log, soft delete only, and a pluggable moderation pipeline with human review.
- **Configurable message pipeline** — whitespace normalization, exact-duplicate blocking, and opt-in PII masking, all reorderable and extensible with your own stages.
- **Structured message types** — plain text and system messages built in; register your own validated types (offers, invoices, appointments).
- **Blocking &amp; reporting** — directional blocks that also stop new conversations from forming, plus message reporting delegated to [Laravel Casework](https://github.com/syriable/laravel-casework) (cases, decisions, enforcement, appeals).
- **Attachments** — Spatie Media Library on messages; MIME allowlist; participant-gated temporary URLs; per-file and per-sender size limits; optional prune retention.
- **Presence-aware notifications** — online/offline from `syriable/laravel-user-context`; an offline recipient gets an email; an online one gets an immediate in-app notification; a recipient already viewing a thread gets no redundant notification. Per-channel preferences, debounced to avoid an email storm.
- **Event-driven** — every domain change fires an event; build response-rate metrics, real-time broadcasts, CRM sync, or anything else as plain listeners.
- **Testable** — `Converse::fake()` plus purpose-built assertions, and every documented notification/presence interaction is testable with `Notification::fake()` alone.

Requirements
------------

[](#requirements)

PHP 8.3+, Laravel 12 or 13. Requires `syriable/laravel-user-context` (presence, locale, timezone, location) and `syriable/laravel-casework` (reporting, cases, enforcement) — both are first-party companions installed automatically and are **not optional**.

Installation
------------

[](#installation)

```
composer require syriable/laravel-converse
php artisan converse:install

# Attachments (Spatie Media Library)
php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --tag="medialibrary-migrations"

# Reporting (Laravel Casework)
php artisan vendor:publish --provider="Syriable\Casework\CaseworkServiceProvider" --tag="casework-migrations"

php artisan migrate

# Seed the default report reasons Converse offers
php artisan db:seed --class="Syriable\Converse\Database\Seeders\ConverseReasonSeeder"
```

Add the trait to any model that should be able to converse:

```
use Syriable\Converse\Concerns\HasConversations;

class User extends Authenticatable
{
    use HasConversations;
}
```

Full walkthrough, including presence setup: **[docs/installation.md](docs/installation.md)**.

Quick start
-----------

[](#quick-start)

```
// Send a message — resolves or creates the pair's conversation automatically.
$message = $buyer->messageTo($seller)->text('Can you design a minimal logo?')->send();

// Reply, attach a file, or send a structured type.
$buyer->messageTo($seller)->replyTo($message)->text('Sounds good!')->send();
$buyer->messageTo($seller)->text('Reference image attached')->attach($uploadedFile)->send();
$seller->messageTo($buyer)->custom('offer', ['price' => 120, 'days' => 4])->send();

// Read the inbox.
$buyer->conversations()->inbox()->cursorPaginate(20);
$message->conversation->messagesFor($buyer)->cursorPaginate(50);
$message->conversation->markReadBy($buyer);

// Organize.
$message->conversation->archiveFor($buyer);
$message->conversation->starFor($buyer);

// Block, report, moderate.
$buyer->block($seller, 'spam');
$message->reportBy($buyer, reason: 'inappropriate');

// Presence-aware notifications — nothing extra to call. An offline
// recipient gets emailed; an online one gets a real-time in-app
// notification instead, and never both.
$buyer->messageTo($seller)->text('Hello!')->send();     // routed automatically
```

Documentation
-------------

[](#documentation)

Everything beyond this landing page lives in **[`docs/`](docs/)**:

PageCovers[Installation](docs/installation.md)Setup, requirements, verification[Configuration](docs/configuration.md)Every config key, explained[Architecture](docs/architecture.md)The mental model — start here for anything deep[Conversations](docs/conversations.md)Identity, resolution, listing, membership[Messages](docs/messages.md)Sending, replies, editing, deleting, reading[Message Pipeline](docs/message-pipeline.md)Text transformation, duplicate blocking, PII masking[Message Types](docs/message-types.md)Structured, validated message types[Moderation](docs/moderation.md)Automated moderation, verdicts, human review[Blocking](docs/blocking.md)Directional blocks and send refusal[Reporting](docs/reporting.md)User-filed reports via Laravel Casework[Attachments](docs/attachments.md)Media Library, MIME allowlist, retention, signed links[Organizing Conversations](docs/organizing-conversations.md)Folders, star, mute, hide, notes, labels[Presence &amp; Real-Time](docs/presence-and-realtime.md)Online/offline detection, active-conversation tracking[Notifications](docs/notifications.md)Channel routing, preferences, debounce, mail content[Events](docs/events.md)The complete domain event catalogue[Models](docs/models.md)Every Eloquent model, at a glance[Database](docs/database.md)Every table, column, and index[Lifecycle](docs/lifecycle.md)Message, conversation, attachment, and notification state machines[Commands](docs/commands.md)`converse:install`, `converse:doctor`, `converse:retention`, `converse:recount`[Extension Points](docs/extension-points.md)Every contract, in one place[Testing](docs/testing.md)`Converse::fake()`, factories, testing patterns[Security](docs/security.md)The full security posture[Performance](docs/performance.md)What's fast, what to watch, and why[Upgrading](docs/upgrading.md)Version support and first-release adoption notes[Troubleshooting](docs/troubleshooting.md)Symptom-first problem index[FAQ](docs/faq.md)Common conceptual questions[Contributing](docs/contributing.md)Development setup, house style, PR conventionsTesting
-------

[](#testing)

```
composer test
```

Contributing
------------

[](#contributing)

See **[docs/contributing.md](docs/contributing.md)** for development setup, code style, and pull request conventions.

Security
--------

[](#security)

If you discover a security vulnerability, please email the maintainer listed in `composer.json` directly rather than opening a public issue. See **[docs/security.md](docs/security.md)** for the package's full security posture.

Credits
-------

[](#credits)

- [syriable](https://github.com/syriable)
- [All Contributors](https://github.com/syriable/laravel-converse/graphs/contributors)

License
-------

[](#license)

The MIT License (MIT). See [LICENSE.md](LICENSE.md) for more information.

###  Health Score

40

—

FairBetter than 85% of packages

Maintenance90

Actively maintained with recent releases

Popularity1

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 51.5% 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

4

Last Release

46d ago

### Community

Maintainers

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

---

Top Contributors

[![alkhatibsy](https://avatars.githubusercontent.com/u/23545455?v=4)](https://github.com/alkhatibsy "alkhatibsy (17 commits)")[![claude](https://avatars.githubusercontent.com/u/81847?v=4)](https://github.com/claude "claude (15 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (1 commits)")

---

Tags

laravelmessagingchatinboxconversationslaravel-conversesyriable

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/syriable-laravel-converse/health.svg)

```
[![Health](https://phpackages.com/badges/syriable-laravel-converse/health.svg)](https://phpackages.com/packages/syriable-laravel-converse)
```

###  Alternatives

[dedoc/scramble

Automatic generation of API documentation for Laravel applications.

2.2k14.2M151](/packages/dedoc-scramble)[spatie/laravel-pdf

Create PDFs in Laravel apps

1.0k6.1M53](/packages/spatie-laravel-pdf)[codewithdennis/filament-select-tree

The multi-level select field enables you to make single selections from a predefined list of options that are organized into multiple levels or depths.

331634.0k38](/packages/codewithdennis-filament-select-tree)[harris21/laravel-fuse

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

24795.1k](/packages/harris21-laravel-fuse)[vormkracht10/laravel-mails

Laravel Mails can collect everything you might want to track about the mails that has been sent by your Laravel app.

25263.1k](/packages/vormkracht10-laravel-mails)[tapp/filament-form-builder

User facing form builder using Filament components

133.9k6](/packages/tapp-filament-form-builder)

PHPackages © 2026

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