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.
Architecture fit. Filum is a Filament panel plugin, not a standalone chat service. It registers a page, a slide-over Livewire component on every panel page, and a set of migrations into the host application's database. That is a good architectural shape for internal admin tooling: no new service to deploy or operate, no external data processor, no second identity system — it reuses the panel's guard and user model. For a back office where the audience is already authenticated staff, this is close to an ideal integration boundary. The cost of that shape is that chat becomes a schema dependency inside your application: filum_* tables, foreign keys derived from your user model, and a Livewire surface mounted on every page in the panel. You are not adding a widget; you are adding a subsystem whose failure blast radius is the whole panel (a misconfigured user model surfaces as an error on every page, not just on chat).
Integration feasibility. Feasible, with a narrow and unforgiving prerequisite band. PHP 8.3+, Laravel 12 or 13, Filament 4.11.5+ or 5.6.5+. If the estate sits on Laravel 10/11 or Filament 3, this package is not a candidate today and the real project is a framework upgrade. The Filament floor is documented as a security minimum rather than a preference, so the panel must be patched to that level regardless — Filum is simply not resolvable below it. Installation is a three-command path (composer require, filum:install, migrate) plus one line in the panel provider, which is genuinely low-friction. The configuration surface is broad but declarative and env-driven: transport, notifications, groups, attachments, reactions, presence, user model, auth gate. Everything is optional-with-a-default, and the defaults are sane (polling, notifications on, private local disk).
Technical risk. The dominant risks are maturity and deploy discipline, not design.
filum-migrations tag on an existing install duplicates create_filum_tables under a fresh timestamp; migrate then aborts before reaching the new migration, leaving new code on an old schema. The package's own statement is that this is a hard outage: opening a direct conversation writes kind, state, joined_at, and every membership check reads state. That means migration and code must ship in the same release step, and someone on the team must own that rule permanently.Filum::auth() is registered.Key questions.
Stack fit. Strong, conditional on the version matrix being satisfied. Filum deliberately assumes nothing about the user schema — configurable model, optional guard override, configurable name and avatar columns, working with integer, UUID and ULID keys. It reads config/broadcasting.php and adapts, and the notification path reuses Filament's own bell and the application's existing notifications table. There is no new dependency in require that drags in a hosted vendor.
Migration path. Additive on the way in — no existing data is transformed, only new tables created. On the way out, the data is yours: conversations, participants, messages, reactions and attachment metadata live in tables whose migrations you have published, so an exit is a SQL export plus a bespoke UI, not a vendor negotiation. That is a materially better lock-in position than any SaaS chat. Treat the schema as owned by your team from day one: publish migrations, review them, and include them in your own migration-linting checks.
Compatibility. Narrow. Filament 4.11.5+ and 5.6.5+ means the package maintains two UI paths against a framework that behaves differently in exactly the place Filum operates (a Livewire component inside a drawer — the reason group management uses plain fields rather than modals). Pin the package version, test on the exact Laravel/Filament pair you run, and do not let minor framework bumps ride through without a smoke test of the slide-over.
Sequencing.
FILUM_USER_MODEL in every environment's .env — unquoted, and before the first migrate. Not a local-only step.filum:install and migrate; add the plugin to one panel provider only.Filum::auth() explicitly. Do not ship on the default gate.reverb:install (which installs Echo and sets BROADCAST_CONNECTION), npm run build, and an explicit browser check that window.Echo exists on a panel page. Without that check you are in the 30-second orphan state.Maintenance. The recurring cost is not code, it is vigilance. Three standing obligations: publish only per-release migration tags and never the aggregate tag on an existing install; ship schema and code in the same release; re-validate the slide-over and group UI whenever Filament moves. Add a CI check that fails if a second *_create_filum_tables.php appears in the migrations directory — that single guard neutralises the worst documented failure. Budget a named owner and a pinning policy; assume a fork review at each Filament major.
Support. No vendor, no SLA, no paid tier. Escalation is a GitHub issue on a 7-star repository. For internal admin tooling that is defensible; for anything touching regulated communications it is not, unless the fork option is real and staffed. The Notifier contract is a useful escape hatch — chat notifications can be redirected to mail, Slack or a pager without touching the package.
Scaling. The realistic population is staff, i.e. tens to low hundreds, and the package is sized for that. Load characteristics to model: 5-second polling per active client with no broadcaster; 30-second reconciliation polling per client with one; a 60-second presence heartbeat writing last_seen_at; and Filament's own bell polling. Attachment bytes belong on object storage, not the database. messages growth is linear and slow for an internal chat, but a retention policy keeps indexes honest. Reverb, if adopted, becomes a supervised daemon with its own port, TLS and restart policy — a real, if small, operational addition.
Failure modes to pre-write runbooks for.
create_filum_tables migration → migrate aborts → new code queries missing columns → all chat fails, including 1:1. Recovery: delete the newer duplicate, migrate.FILUM_USER_MODEL → error on every page in the panel, since the current user is resolved while building navigation. Highest blast radius of any misconfiguration here.ttl at the 180-second default → a colleague who closed their laptop is still "here," gets no bell, and the coupling is deliberate and documented. Tune ttl if that lag matters more than a twitchier presence indicator.Ramp-up. Admins: near zero — click a colleague in the sidebar, type, done; the slide-over is available on every page, which is the right affordance for a back office. Developers: moderate — the config surface is wide but well documented, and the real learning is deploy discipline rather than API. Ops: minimal on polling; Reverb converts that into a supervised service. Overall, this is a small-team tool with a disproportionately sharp upgrade edge, and the assessment should reflect that: adopt it as a pinned, piloted, single-panel dependency with an explicit gate and a fork contingency — or defer until the framework prerequisites are already paid for.
How can I help you explore Laravel packages today?