Release Notes
Wirechat 0.6x expands the panel API with more opt-in chat experiences: settings, message requests, group invite links, join-request moderation, content browsing, tabs, tray support, and configurable models for the new records.
From 0.5x To 0.6x
Upgrading to 0.6x should be a small migration for most applications. The main work is updating the package, publishing the new migrations, and enabling the panel features your application needs.
Minimal Breaking Changes
Clear and delete actions are now opt-in panel features:
clearChatAction()is disabled by default.deleteChatAction()is disabled by default.
If your application already shows these actions and you want to keep them visible, enable them in your panel provider:
use Wirechat\Wirechat\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->clearChatAction()
->deleteChatAction();
}
Create a working branch in your application before upgrading:
git checkout -b wirechat-upgrade
Update your Composer constraint:
"wirechat/wirechat": "^0.6"
Then update the package:
composer update wirechat/wirechat
Publish the new migrations and run them:
php artisan vendor:publish --tag=wirechat-migrations
php artisan migrate
If you have published Wirechat views, compare your local copies with the new package views before replacing them:
php artisan vendor:publish --tag=wirechat-views
What Is New
Settings Drawer
Wirechat 0.6x introduces an opt-in settings drawer for each panel. When enabled, users get a Settings entry in the chats header. The first built-in section is notification preferences.
use Wirechat\Wirechat\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->settings();
}
The settings system introduces the wirechat_settings table and a DTO-based API for reading user preferences:
use Wirechat\Wirechat\Facades\Wirechat;
$settings = Wirechat::settings($user);
if ($settings->notification_previews_enabled) {
// Show notification preview text.
}
Settings are disabled by default. You may also enable them conditionally:
public function panel(Panel $panel): Panel
{
return $panel
// ...
->settings(fn () => auth()->user()?->can('manage-chat-settings') ?? false);
}
Read more on the Settings page.
Message Requests
Message requests let a sender start a private conversation without immediately adding the recipient as a participant. The recipient can open the pending thread, review it, and then accept or dismiss the request.
use Wirechat\Wirechat\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->messageRequests();
}
When enabled, the default new-chat UI creates review-first conversations. The sender can continue writing while the recipient sees an incoming request flow.
You can also create a request programmatically:
$conversation = auth()->user()->sendMessageRequestTo($recipient);
Accepting a request adds the recipient to the conversation. Dismissing it keeps the recipient out of the participant list and removes the pending request from the active flow.
Read more on the Message Requests page.
Group Invitations
Group invitations add shareable invite links, public invite preview pages, and in-app join handling for group conversations. They are enabled per panel:
use Wirechat\Wirechat\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->groupInvitations();
}
When enabled, owners and admins can manage invite links from group tools. Invite links can join a user immediately or create a join request, depending on the group access settings.
For public invite pages, you can choose the layout used outside the authenticated chat shell:
public function panel(Panel $panel): Panel
{
return $panel
// ...
->groupInvitations()
->invitePageLayout('wirechat::layouts.app');
}
If your chat runs as a widget, redirect invite joins back to the page that renders the widget:
public function panel(Panel $panel): Panel
{
return $panel
// ...
->groupInvitations()
->inviteJoinRedirect(fn () => route('wirechat.widget'));
}
Read more on the Groups page.
Join Requests
Join requests are the moderation layer behind approval-based group invites. A valid invite does not always mean immediate membership. If the group requires approval, Wirechat creates a JoinRequest record instead.
$request = $conversation->group->requestToJoin($user, $invite);
$conversation->group->acceptPendingJoinRequest(
$user,
reviewedBy: $admin,
markInviteUsed: true,
);
$conversation->group->dismissPendingJoinRequest(
$user,
reviewedBy: $admin,
);
This introduces a safer group-join lifecycle:
- duplicate pending requests are reused instead of recreated
- accepted requests store reviewer metadata
- dismissed requests remain auditable
- invite usage is only counted when the join is accepted
Read more on the Groups page.
Content Viewer
Content Viewer gives a conversation a dedicated place to browse shared media, documents, and links without leaving the chat interface.
use Wirechat\Wirechat\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->contentViewer();
}
When enabled, Wirechat adds a content entry to the conversation details panel. Users can browse media, docs, and links from the current conversation, then jump back to the original message context.
Read more on the Content Viewer page.
Conversation Tabs
Tabs let you split the chats list into focused views such as All, Unread, or Groups.
use Illuminate\Database\Eloquent\Builder;
use Wirechat\Wirechat\Enums\ConversationType;
use Wirechat\Wirechat\Panel;
use Wirechat\Wirechat\Support\Tabs\Tab;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->tabs(
Tab::make('all'),
Tab::make('groups')
->label('Groups')
->query(fn (Builder $query) => $query->where('type', ConversationType::GROUP->value))
->count(),
)
->defaultTab('all');
}
Tabs refine the existing conversations query for the current user. Use them to keep large chat lists easier to scan without building a separate chats UI.
Read more on the Tabs page.
Tray Widget
The tray widget adds a compact floating chat entry point that can live in your authenticated layout. It keeps chat available without forcing users to leave the page they are using.
<html>
<head>
@wirechatStyles
</head>
<body>
...
@wirechatAssets()
@auth
<livewire:wirechat.tray panel="chats" />
@endauth
</body>
</html>
The tray uses the selected panel, so it follows that panel's routes, middleware, actions, tabs, attachments, and other feature settings.
You can customize the tray launcher and opened panel:
<livewire:wirechat.tray
panel="chats"
:limit="8"
class="bottom-3 right-3 w-[28rem]"
launcherClass="rounded-full px-4 py-2 shadow-lg"
heading="Inbox"
/>
Read more on the Tray page.
Notification Preferences
Web push notifications now work with user-owned notification settings when the settings drawer is enabled. Realtime broadcasts still update unread counts and chat lists, but browser notifications respect these preferences:
notifications_enableddirect_message_notifications_enabledgroup_message_notifications_enablednotification_previews_enabled
Enable web push notifications on the panel:
use Wirechat\Wirechat\Panel;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->webPushNotifications();
}
Use the same settings DTO in custom notification code:
use Wirechat\Wirechat\Facades\Wirechat;
$settings = Wirechat::settings($recipient);
$canNotify = $settings->notifications_enabled
&& ($conversation->isGroup()
? $settings->group_message_notifications_enabled
: $settings->direct_message_notifications_enabled);
Read more on the Notifications page.
Configurable Models
The config model map now includes the new records used by settings, message requests, group invites, and join-request flows:
'models' => [
'invite' => \Wirechat\Wirechat\Models\Invite::class,
'join_request' => \Wirechat\Wirechat\Models\JoinRequest::class,
'message_request' => \Wirechat\Wirechat\Models\MessageRequest::class,
'setting' => \Wirechat\Wirechat\Models\Setting::class,
],
Each custom class must extend the matching Wirechat base model. Use this when you need app-specific relationships, scopes, observers, or helper methods while keeping the package schema contract intact.
Read more on the Models page.
Upgrade Checklist
- Update
wirechat/wirechatto^0.6. - Publish and run the new migrations.
- Review any published Wirechat views before replacing them.
- Add
invite,join_request,message_request, andsettingkeys to customized config files if they are missing. - Enable only the panel features your application needs.
- Test private chats, pending message requests, group invitations, join requests, and notification preferences before deploying.