tey/concierge
Tey Concierge is a lightweight Laravel package that adds a clean, configurable concierge layer to your application. It centralizes common request-handling logic, keeps controllers slim, follows Laravel conventions, and offers sensible defaults with an expressive API, making it simple to install, con...
Update basis (v0.8.1)
The release notes materially change several assumptions in the previous assessment, and one of them was the pivotal unknown. tey/concierge is not a thin metapackage. It is first-party, code-bearing, and domain-specific: it owns invitations, workspaces, membership, and authorization grants ("the inviter still authorised, grants unchanged, and already a member"), ships database migrations, publishes config, and defines UI-facing contracts (an accept page with a "ready state", MembersIndex row payloads, switchAccount). It also demonstrates real development history — PR #127, a changelog with an explicit compare link from v0.8.0, and maintained docs/scenarios.md with an accept decision tree — which softens, but does not eliminate, the "zero adoption / no issue history" risk.
Architecture fit Reframed: this is a bounded, high-value domain layer for multi-tenant SaaS invitation and membership flows, not a grab-bag of utilities. That is a better architectural story than "opinionated bundle of essentials" and a worse integration story, because the package sits directly in the authorization path and owns schema. Fit is good for a greenfield multi-tenant product that would otherwise build invitations/workspaces from scratch — that is genuinely non-trivial work, and the release shows the edge cases (expiry, revoked, workspace accepting members, inviter authorization, already-a-member) are being handled explicitly. Fit is poor for any existing application with its own tenancy, roles, or membership model, because the package's tables, grants, and accept-flow state machine become the source of truth.
Removal cost is now known to be high: uninstalling leaves columns, an acceptor record, and UI contract assumptions behind. Treat this as a build-vs-buy decision on the invitation/workspace domain, not a utility adoption.
Integration feasibility
Not "composer require and go." The v0.8.1 upgrade notes require publish + run a migration, and the feature requires the host app to pass new arguments (otherEmail, signedInAs, a switchAccount link) into the ready state. So integration costs span: dependency, schema, config, backend wiring, and front-end view changes. Feasibility depends on answers we still don't have around data ownership (does the package own the workspaces/members tables, or reference ours?) and front-end binding (which rendering layer the accept page and MembersIndex components target).
Technical risk
concierge.invitations.match_email (default true, preserving behaviour) lets a signed-in user with a different verified email accept an invitation. This is a deliberate, useful feature, but it expands the policy surface for account/invitation confusion. Good sign: the release records who accepted and whether the email differed, and the docs' decision tree was updated — auditability was considered.Key questions
users/tenants model?update_concierge_invitations_with_acceptor?match_email: false gated on server-side verified-email checks, and what is logged when acceptance uses a different email?MembersIndex target (Inertia/Vue, Livewire, Blade), and how tightly are those contracts versioned?Stack fit Two hard gates now. First, version constraints: pre-1.0 means a minor bump may carry breaking changes and a patch bump may carry a migration — pin exact versions, no caret ranges. Second, rendering-layer fit: the release describes page states and row payloads, implying a specific front-end convention; if we are not on that stack, adoption cost rises sharply. Verify both before any spike.
Migration path
Greenfield or isolated service only. The viable path is unchanged but with a heavier audit: install into a throwaway Laravel skeleton, run composer why, composer audit, capture an SBOM, then publish migrations and inspect the resulting schema — that schema is the real commitment. If the schema duplicates concepts we already own, stop and default to reimplementation.
Compatibility
Re-check collisions with new information: config key concierge.invitations.*, the published migration namespace, view/component names (MembersIndex, accept page), and any helper names. The migration is additive (one boolean, default false), so collision risk is low but table-name collisions in multi-tenant apps are not.
Sequencing
match_email: false — token handling, verified-email enforcement, audit records, and grant re-evaluation at accept time.match_email modes, and diff registered providers and config against a clean skeleton. The diff plus schema delta is the integration contract.Prior composite of 28.5 and zero dependents still argues against wholesale adoption for an existing codebase. What changed: the feature set is substantive enough that fork-and-vendor is now a credible middle path, and the default recommendation narrows to "reference implementation or vendored subset," with wholesale adoption limited to greenfield products that need precisely this model.
Maintenance We now co-own production schema with an upstream that ships migrations in patch releases. Every bump is a potential deploy task, not a lockfile update. Budget for reading migrations before merging them and for maintaining our own copy if the project goes quiet mid-flight — a fork now includes data-bearing migrations, which makes forking more expensive than it looked previously.
Support Materially improved versus the previous assessment: an active release trail, PR references, and maintained scenario documentation mean we can often read our way to an answer. There is still no external community and no commercial support; upstream responsiveness should be assumed slow, and internal ownership named before merge.
Scaling Runtime cost remains boot-time and per-request query work on invitation/member lookups — check indexes on invitation token, invited email, and workspace membership. The larger scaling risk is organizational: the more services adopt the package, the more expensive a coordinated migration becomes, because each adoption introduces a schema our rollback plan must account for.
Failure modes
match_email is disabled without a considered policy.Ramp-up The domain is legible and documented, so engine-level onboarding is reasonable — but engineers must understand the accept decision tree, both email-matching modes, and what the package owns in the schema before touching it. Write an internal one-pager covering registered providers, owned tables, config defaults, deploy ordering, and the audit model for join-as acceptance. Allocate roughly a week plus a security review before committing; the added migration and authorization surface is why the estimate does not shrink despite better documentation.
How can I help you explore Laravel packages today?