goldnead/statamic-teams
A Statamic addon for organizing users into teams with memberships, roles, and team-aware access control. Manage teams in the control panel, assign members, and scope content or permissions per team. Built for Laravel and Statamic.
Architecture fit: This is a Statamic (Laravel) addon, so it inherits the standard package architecture: a service provider, a Control Panel nav registration path, and config/settings surfaced through Statamic's addon settings system. v0.4.2 adds one thing to that architecture — the addon now declares settingsNavParent(), returning a [section, name] tuple that identifies its own CP navigation entry. That is a presentation-layer contract, not a data or domain change: it tells the host where to mount the addon's settings screen. For a TPM this is a low-surface-area release: it changes where users find configuration, not what the configuration does.
The important architectural nuance is that the behaviour is conditionally applied. With statamic-brand-context 1.16 or newer, the addon's settings render as the sub-item "Einstellungen" beneath the addon's own nav entry. On older brand-context versions the method is ignored and the previous layout persists. That means the addon has an optional, version-gated integration with a sibling package rather than a hard dependency — good for resilience, but it introduces two possible CP layouts across the fleet that support and documentation must account for.
Integration feasibility: High. composer require plus the existing Statamic addon registration is unchanged; there is no migration, no new config key, and no new service to boot. The only integration decision is whether the environment runs brand-context 1.16+.
Technical risk: Low-to-moderate, concentrated in the soft coupling rather than the code change itself.
settingsNavParent() is a Statamic core convention, a brand-context convention, or an addon-local convention that only brand-context happens to consume. If it is brand-context-specific, the addon's CP placement is now partly governed by another vendor's release cadence.[section, name] tuple appears unvalidated at the contract boundary — a malformed return would presumably degrade to the legacy layout or misplace the item.Key questions:
settingsNavParent() specified by Statamic core, or is this an addon-to-addon convention with brand-context? If the latter, what is the compatibility commitment if brand-context changes the signature?Stack fit: Native. Composer-installed Statamic addon on the existing Laravel application; no new runtime, no new datastore, no queue or scheduler footprint. It slots into the same deployment artifact and the same config-cache/build pipeline already used for other addons.
Migration path: Explicitly none. The release states no migration and no new config key, so there is no schema step, no php artisan migrate variant, no backfill, and no settings re-entry for existing installs. Existing configuration persists unchanged; only the CP mount point for the settings screen may shift. That is the defining property of this upgrade: it is a view-layer relocation with a zero-data-migration footprint.
Compatibility: Two axes to pin.
Sequencing:
Keeping the two upgrades in separate changes is the key TPM call here: it isolates "did the addon break anything" from "did the navigation move," which makes rollback attribution trivial.
Maintenance: Low code maintenance, slightly elevated coordination maintenance. The addon itself gains a small, static method; there is no ongoing operational cost. The real overhead is tracking the brand-context version boundary, because the addon's CP behaviour is now a function of another package's version. That is a dependency-graph item to add to the upgrade checklist, not a recurring task.
Support: This is where the release has its main cost. Support must now handle two CP layouts:
Screenshots, KB articles, and onboarding docs should be branched or annotated accordingly. Expect a short tail of "the settings moved" tickets immediately after any brand-context upgrade. The German-language default label also warrants a note if the user base is not German-speaking.
Scaling: No scaling implications. CP navigation is per-request presentation metadata with negligible cost, and there is no data path, no query, no cache, and no queue involved. Multi-site and multi-brand installs should be spot-checked only to confirm nav placement resolves consistently when several brand contexts exist — that is the one place where a shared-suite page could produce ambiguous placement.
Failure modes:
[section, name] return — if the tuple is wrong or partially populated, the settings entry may misplace or fail to attach. Mitigation: smoke-test CP nav after upgrade.settingsNavParent() handling. This is the only genuinely consequential risk, and its blast radius is limited to CP navigation — no data loss, no outage.Ramp-up: Effectively zero for engineers (one method, no migration) and low for support (one relocated settings screen plus a version boundary). The realistic ramp-up cost is documentation refresh, not skill acquisition. A single staging pass per environment plus updated screenshots covers it.
TPM verdict: Adopt. v0.4.2 is a contained, backward-compatible UX refinement with no migration and no new configuration surface. The decision it forces is not "is this safe" (it is) but "do we want to take the brand-context ≥1.16 dependency now or later" — and that should be scheduled as its own change, with docs updated in the same window.
How can I help you explore Laravel packages today?