namu/wirechat
WireChat is a Laravel Livewire package for adding real-time private and group chat to your app. It offers media attachments, emoji reactions, read receipts, typing indicators, moderation tools, and a customizable Tailwind UI, with easy setup and integration.
Architecture fit. Unchanged in shape: wirechat remains a batteries-included Laravel + Livewire package — a panel-driven, polymorphic-participant chat domain (private chats, self chats, groups, invitations, join requests, attachments, embeds) shipped with routes, middleware, Livewire components, Blade views, migrations, and config. Still a fit for a Blade + Tailwind + Livewire monolith where chat supports rather than constitutes the product; still not a fit for an Inertia/React/Vue SPA or a headless API-first frontend. v0.6.0 strengthens the panel abstraction rather than diluting it: color tone, route registration, mount URLs, conversation query customization, message actions, group invitations, settings, and user-search behavior are now panel-level controls. That is good for hosting distinct chat surfaces in one deployment (customer widget vs internal console) and bad for surface-area discipline — each new panel knob is durable public API you inherit.
Integration feasibility. Still low-to-moderate, but the decision tree has grown. On top of the prior path (composer install, publish config/migrations, WirechatUser + InteractsWithWirechat, PanelProvider, guards, Echo/queue, storage disk), v0.6.0 adds three decisions that are expensive to reverse: message encryption (configurable, with metadata storage and encryption payload handling), per-user Wirechat settings storage (notification, security, privacy), and approval-first private messaging (message requests, pending messages, request drawers, realtime request updates). Encryption in particular behaves like the uses_uuid_for_conversations/table_prefix decisions — pick it correctly before the first message exists, or plan a rewrite. The "hardened participant, sendable, and auth resolution" change is a positive for multi-model participation, but it is also a behavior change in the authorization path and must be re-tested, not assumed equivalent.
Technical risk. Materially higher than the prior assessment.
wirechat/wirechat vs namu/wirechat divergence and the wirechat-pro sibling remain unaddressed by these notes. Nothing here says who owns base-package fixes once a feature lands in pro.Key questions.
searchUsersUsing() and the new user-search panel controls guard-aware, or can a cross-tenant search still leak identities?Stack fit. Target Laravel 11–13, PHP 8.2–8.5, Livewire 3.7/4.0, Tailwind (package assumes zinc neutrals, now with configurable color tone), optional Echo-compatible broadcaster. If your estate includes Laravel 10, this release is not available to you without an app upgrade — treat that as the gating item, not a chat decision. If Livewire is already in the app, marginal cost is config plus domain modeling; if not, you are adopting a second UI paradigm for chat alone. The irreversible-before-first-run settings list has grown from two to four: table_prefix, uses_uuid_for_conversations, encryption enablement/key strategy, and whether per-user settings and request flows are on from day one (because their tables and flags shape the schema and UI).
Migration path.
table_prefix, uses_uuid_for_conversations, and the encryption decision before any real message exists.PanelProvider first (internal staff), now also setting color tone, mount URL, and route registration explicitly rather than accepting defaults.canAccessWirechatPanel(), and route middleware together — still two independent gates.messagesQueue/eventsQueue; only then enable realtime request updates and join-request realtime flows.searchUsersUsing(), and the widget panel. Prove widget and full-page parity separately.Compatibility. Keep relying on models.* overrides and the Wirechat facade rather than vendor patches. Pin Livewire and prove the 3→4 boundary in a branch. For existing installs, treat v0.6.0 as a minor-version-with-migration-risk release: expect new migrations, new config keys, and changed index names, and test the upgrade against a schema clone with representative data volume before production. Do not parallelize encryption rollout with the Livewire upgrade.
Sequencing. Framework floor check (Laravel 10 exit) → sandbox POC (2–3 days) → access control and guard design → config merge and feature-flag baseline → storage and attachments → encryption design and key custody → real-time → request/join-request enablement → widget/second panel → load and failure testing → rollout behind flags.
Maintenance. Upgrade regression is still the dominant cost, and the bill went up. Each release now warrants a regression pass over: multi-guard access, hardened participant/sendable/auth resolution, group permissions (owner/admin/blocked/past-member/banned), invite-link and join-request flows, message-request state transitions and realtime updates, attachment metadata plus download helpers, per-user settings persistence, encryption round-trip and metadata integrity, and both UI modes. Budget roughly 1.5–2 engineer-days per minor upgrade (up from ~1), plus a half-day for the Livewire 4 transition and a further day when encryption or settings defaults change. Exit cost stays low (MIT, schema and models are yours), but exit now includes decrypting your own history if you adopted encryption — confirm the decryption path is independent of the package before you depend on it.
Support. Still no vendor SLA, and the base/pro relationship remains unexplained by the release notes — a question that gets more pointed as the base package adds heavyweight features (encryption, settings, join requests) that a commercial sibling might otherwise have carried. Acceptable for internal tooling; a procurement problem for revenue-adjacent customer chat, where encryption key custody in particular is a commitment you cannot delegate to a community project.
Scaling. Same two bottlenecks, plus two new ones. Write/read volume: messages still dominate row count; encryption payloads and metadata widen each row and make archival/redaction harder, so decide partitioning and retention before volume arrives. Fanout: request updates and join-request realtime flows add channel subscriptions on top of message fanout — size queues per surface, since per-panel broadcasting makes cost attributable. New — key operations: any re-encryption or rotation is a batch job over your largest table with a hard correctness requirement. New — settings writes: per-user notification/privacy settings add a write path that can land on hot request cycles if read naively per render; cache it.
Failure modes.
canAccessWirechatPanel() misconfiguration → silent access denial that reads as a UI bug.Ramp-up. A Laravel developer still reaches a working single-panel integration in days. The learning curve now includes the panel model, the dual-access-control pattern, the group permission state machine, and two new state machines (message request lifecycle; invite-link → join-request → lobby → approval → member/banned) plus encryption key handling. The bundled AGENTS.md and the new contributor documentation remain unusually strong onboarding artifacts, and the added package/discussion templates and Dependabot config modestly reduce the cost of staying current. Practical ramp: half a day on AGENTS.md and workbench panel providers, one day for the first panel, one to two days on broadcasting and storage, and one additional day on request/join-request flows and encryption configuration. Teams without Livewire experience should still add about a week.
How can I help you explore Laravel packages today?