statamic/collaboration
Statamic Collaboration adds real-time multi-user editing and presence indicators to the Statamic control panel, so teams can see who is viewing or editing content, avoid conflicting saves, and coordinate publishing work more smoothly.
Architecture fit. This is not a general-purpose Laravel package — it is a Statamic Pro control-panel addon. There is no meaningful integration path in a stock Laravel application. The only viable architecture fit is: Statamic Pro as the CMS, editors working in the Control Panel, and an operable broadcasting layer (Laravel Reverb self-hosted, Pusher, or Ably) underneath. If any of those three are absent, the evaluation ends at the prerequisite gate. Treat "we run Laravel" as irrelevant; the qualifying question is "we run Statamic Pro and can operate websockets."
The functional scope is narrower than the marketing reads. What ships is advisory presence: live avatars, "someone else is editing" warnings, conflict prompts before save. It is not hard locking, not character-level co-editing, not merge resolution. That distinction is the single most important thing to get right before it reaches a stakeholder deck — "co-editing" oversells it and will set expectations the package cannot meet.
Integration feasibility. Installation itself is cheap: composer require, publish config, wire BROADCAST_CONNECTION, run install:broadcasting, start Reverb, rebuild assets. The real work is not the install, it is the four things around it:
Upgrade header handling, and CSP connect-src entries. Pusher/Ably converts this into a vendor line item. Either way it is a real cost that is not on the composer receipt.routes/ and src/ to confirm it inherits Statamic's permission model. If it doesn't, users without edit rights can see who is editing, or presence attaches to the wrong entry across sites. This is an unverified assumption until someone reads the code.Technical risk. Ranked by probability × impact:
Key questions to answer before committing engineering time.
Stack fit. Only one shape qualifies: Statamic Pro + Laravel with a broadcasting driver you can operate + PHP/Statamic versions pinned in composer.json. There is no broadly published compatibility matrix, so the composer.json is the contract. Pin statamic/collaboration >=2.0.1 — below that, multi-site is disqualifying rather than merely risky.
The dependency footprint is unusually clean for a real-time feature: presence tracking, channel authorization, reconnection and state reconciliation, and stale-presence cleanup are all deceptively expensive to build well on Laravel. Building it internally is an open-ended project; buying it converts that into a license line plus an infrastructure dependency. Name that trade explicitly in the decision log so it doesn't get relitigated in month three.
Migration path. Greenfield is straightforward — no existing state to reconcile. The two paths that need their own work item:
Compatibility. Three compatibility surfaces to validate independently:
Sequencing. Order matters; each step gates the next.
>=2.0.1; scope 1.x → 2.x separately if applicable.The two-window test — two different users in two browsers, not two incognito tabs of one user — exercises roughly 80% of what goes wrong in production. Assert on the visible presence affordance, not internal state; presence is timing-sensitive and unit tests won't touch the failure modes that matter.
Maintenance. The package is maintained by Statamic core maintainers (jackmcdade, jasonvarga), which shifts the support posture from community-first to vendor-first. That is the reason to trust it — provenance, not popularity. The practical consequence is that there is almost no public troubleshooting trail, so on-call capacity should be budgeted for vendor escalation rather than forum archaeology.
Support. Two support surfaces, not one:
Scaling. Presence scales with concurrent editors in the CP, not with site traffic — a small number relative to public traffic. The scaling constraints that actually bite are:
Failure modes. Document each of these and their expected behavior before the pilot, so tickets route to the right team:
| Failure | Symptom | Owner |
|---|---|---|
| Broadcast server down | CP presence dead, possibly hard error | Infra |
| Stale presence after hard disconnect | Phantom collaborators | Product/docs — document the staleness window |
Reverse proxy dropping Upgrade |
"Collaboration broken," nothing in app logs | Infra |
CSP connect-src missing broadcast host |
Silent websocket block | Infra |
| Channel auth mismatch (silent 403) | Presence missing for some roles only | App |
| Stale config cache | Presence "just stopped" after a config change | App — run config:clear |
| Simultaneous saves on network storage | Lost work | Platform — not fully solvable by the addon |
Do not build automation — auto-save gates, publish blocks — on presence state until the staleness window has been measured empirically. Use the improved debugging output from #114 as the first diagnostic before reaching for Redis or Echo inspection.
Ramp-up. Editor-facing ramp-up is small but not zero: presence affordances, the conflict warning, and the expectation that phantom collaborators are a known artifact rather than a bug. Plan a short comms note rather than training. Engineering ramp-up is moderate — the install is trivial, the surrounding infrastructure and authorization validation is where the calendar time goes.
Strategic posture. Treat this as a pilot candidate, not a default. It is a table-stakes checkbox for enterprise editorial teams and rarely the highest-value item for a two-person content team. It competes for the same budget as approvals, scheduled publishing, localization workflows, and audit trails — and it does not solve any of those. Extension points are limited; it is a closed, opinionated CP feature. If the real gap is workflow rather than presence, extending this package to cover it is a build project wearing a vendor costume. Buy presence here; build workflow elsewhere.
Kill criteria, written into the ticket not the retro. Two candidates: no measurable drop in overwritten-revision incidents after 60 days, or websocket ops burden exceeding the collaboration value delivered. A config-flag rollback is what makes the kill cheap — that is the primary architectural insurance this package offers, and it should be wired before the pilot opens, not after it stalls.
How can I help you explore Laravel packages today?