heyosseus/filum
Real-time chat between admin users inside your Filament panel. Click a colleague, the conversation opens, history persists, and messages arrive as sent. Broadcasting-agnostic and free: uses your broadcaster if configured, otherwise falls back to polling. Dark-first, English and Georgian included.
require, so the decision is engineering hours, not procurement budget.ttl for both the presence board and the bell. This is a defensible product stance (bell and board can never contradict each other) that you should accept or reject explicitly — the honest trade-off is that someone who closed their laptop 30 seconds ago is still "present" at the 180s default and gets no bell. If that lag matters, you lower ttl and get a twitchier presence indicator too; there is no independent knob.Filum::auth(...)) governs the page, the overlay, and the broadcast channels, so authorization cannot drift between the read path and the subscription path. That's a security-review-friendly shape and reduces the review burden of adding an in-panel messaging surface.Consider it when most of the following hold:
users.model, name_column, avatar_column, integer/UUID/ULID keys), which is a real strength for admin-guard panels — but note FILUM_USER_MODEL must be set before migrating and must be set in every environment, and getting it wrong errors on every panel page, not just chat.Look elsewhere (or build) when:
create_filum_tables migration that aborts migrate and leaves new code querying columns that don't exist — a hard outage, including 1:1 chat, not a degradation. Code and schema must ship in the same release step.reverb:install (which wires both halves) or explicitly pin transport.driver to polling.Suggested posture if you proceed: treat it as an internal-tool dependency, pin the version, vendor-fork if your policy requires, and run a timeboxed pilot (1:1 chat only, polling transport, no attachments) before enabling groups, files, or reactions.
To executives: This adds colleague-to-colleague chat directly inside the admin panel staff already use, so operational conversation stays attached to the work instead of scattering into a separate tool. It is MIT-licensed and free, requires no hosted chat vendor or per-seat subscription, and runs on infrastructure we already own. It can launch with no new infrastructure at all — it polls by default and upgrades to real-time only if and when we choose to stand up Reverb. It is fully self-hosted, so message history and shared files stay in our database under our access rules. Scope is controlled: files, groups and reactions are each switchable, so we can start with direct messages only. The principal risk is maturity — the package is new and has a single maintainer — which is why the recommendation is a scoped pilot on the internal admin panel, not a customer-facing surface.
To engineering: Straightforward integration: composer require, filum:install, migrate, then register FilumPlugin::make() in the panel provider. Three things need care before you start. First, set FILUM_USER_MODEL in every environment before migrating and before installing — a wrong value surfaces as an error on every panel page because the current user is resolved while navigation builds. Second, ship the migration in the same release step as the code; new code against an old schema is a hard outage (direct conversations write kind, state, joined_at, and every membership check reads state). Third, on upgrades publish only the release-specific migration tag — never filum-migrations on an existing install, or you get a duplicate create_filum_tables that aborts migrate. Authorization is a single gate (Filum::auth) covering page, overlay and channels, so there is one place to review. Attachments must stay on a private disk (local, not public) — files are served through a membership-checked route that 404s rather than 403s by design. If you configure a broadcaster manually, you must also ship an Echo client in the panel assets, or you will silently land on the 30s reconciliation poll, which is slower than the 5s polling default.
The one-line ask: approve a timeboxed internal pilot — 1:1 chat, polling transport, attachments off — with a written exit plan, and revisit groups and file sharing after the pilot plus a maintenance-health check on the upstream repo.
How can I help you explore Laravel packages today?