joy/voyager-api-auth
Adds API authentication to Laravel's Voyager admin panel. Protects Voyager admin routes and resources for API clients, SPAs, and mobile apps, extending built-in admin auth to JSON requests so you can avoid building separate authentication plumbing.
Architecture fit. Unchanged by this release. joy/voyager-api-auth remains a satellite module in the Joy Voyager ecosystem — a maintained fork/extension of the Voyager Laravel admin panel, not a standalone auth library. It assumes you already run Joy Voyager as your admin surface and want token-based REST access to the same user/role/permission model (Voyager's BREAD-derived permissions). If our architecture is "Laravel app + Voyager admin + separate SPA/mobile client," conceptual fit is good: one user table, one permission source, one admin UI. If we are not on Joy Voyager specifically, fit is poor — the module's value is almost entirely in its coupling to that host package.
Integration feasibility. Mechanically simple and unchanged: Composer require, service provider, published config, a handful of routes under an API prefix. Realistic spike effort remains 1–2 days for a mid-level Laravel engineer. The blocking question is still the version constraint matrix, and v3.2.39 does not answer it — the release notes are a bare version string with no changelog, no compatibility statement, and no migration notes. We cannot confirm from the release that laravel/framework or php constraints have moved, so the "does its pin intersect with ours" question must still be resolved by reading composer.json at the tag.
Technical risk. Net risk is roughly flat: one data point improved, one new concern introduced.
| Risk | Severity | Why |
|---|---|---|
| Adoption signal | High | Still 8 stars, 0 dependents, single maintainer. Effectively unvalidated in production by anyone we can point to. |
| Security ownership | High | Auth is a security-critical path. Still no evidence of a disclosure policy, security review, or external audit. We inherit full liability for token issuance, TTL, revocation, and permission mapping correctness. |
| Dependency pinning | High | A hard pin on a low-traffic package can block Laravel/PHP upgrades and, worse, block emergency CVE patches. Unchanged by a patch release. |
| Release transparency (new) | High | v3.2.39 ships with an empty changelog. For an auth package this is a material finding: we cannot triage whether a given release contains a security fix, a behavior change to token TTL/revocation, or nothing at all. Every bump becomes a code-diff exercise we perform ourselves. |
| Maintenance velocity (revised) | Medium (was High) | A second observed release, numbered 3.2.39, is evidence the maintainer is active and shipping patches. This downgrades "abandoned satellite" from a live concern to a background one. It does not upgrade the adoption signal — activity is not the same as independent validation. |
Two readings of 3.2.39 are equally consistent with the data: a maintainer doing responsive patch work, or a maintainer shipping frequently without a changelog discipline that would let us tell the difference. The opportunity: 12.8 score still reflects low upside relative to build-it-yourself.
Key questions to resolve before any commitment.
composer.json constraints for laravel/framework, php, and the parent joy-voyager package at tag v3.2.39? Does it support Laravel 11/12?Stack fit. Unchanged. Adopt only if the answer to "are we on Joy Voyager?" is yes — in that case this module is the path of least resistance, closing the gap between an admin-panel-centric permission model and a headless client without us re-implementing BREAD-aware authorization.
If we are on stock Voyager or no Voyager at all, treat this repository as a reference implementation, not a dependency. Its route definitions, middleware, and permission checks give us a spec for a first-party Sanctum implementation of roughly 300–500 lines that we own outright with no pinning risk and no diff-review tax.
Migration path. Two viable tracks, unchanged:
composer.lock, and place an internal AuthService interface in front of every endpoint we expose. Application code calls our interface; the package sits behind it. Preserves the option to swap to first-party Sanctum without touching callers.Track 1 remains the right default. The empty changelog strengthens the case for escalating to Track 2 if a security review surfaces issues we must patch immediately, or if we find ourselves diffing tags more than a couple of times a year.
Compatibility. Verify by installing tag v3.2.39 into a throwaway branch against our current composer.lock, not a greenfield skeleton. A greenfield install tells us nothing. Confirm it resolves alongside our existing guards, session driver, and any Passport/Sanctum usage; guard collisions are a common and confusing failure. Since the release notes assert nothing about framework support, treat compatibility as entirely unverified.
Sequencing.
composer.json at the tag. Record what actually changed. If the diff is large and undocumented, escalate the risk conversation before spending spike time.Ongoing upgrade discipline (new): every upstream bump requires a diff review plus a contract-test run before merge. Add "reads upstream diff" to the PR template for this dependency so the ritual survives staff turnover.
Maintenance. Assume we own this code. The v3.2.39 release slightly reduces the probability of dormancy but leaves the cost model essentially intact: roughly 3–5 engineer-days per year for patch review, plus a new recurring per-release cost of diffing and validating undocumented changes. The real exposure is unchanged and is the one to plan for — a security advisory in Laravel or a transitive dependency where the pin prevents us from patching. That is a same-day outage-class event, not a backlog item.
Support. No vendor, no SLA, no paid tier. Support is GitHub issues plus our own on-call. The empty v3.2.39 changelog is a small but concrete demonstration of the support posture: releases arrive without explanation, so questions about what changed are ours to answer. Keep the stakeholder sentence explicit: "this component has no external support contract and no changelog."
Scaling. Unchanged. Token issuance is stateless and horizontal — not the bottleneck. Pressure points are the token/user store (DB or Redis) and unauthenticated endpoint abuse. Require per-IP and per-account rate limiting at the edge or middleware layer, and a defined token TTL + refresh policy before launch. Verify the package does not do a synchronous DB permission lookup on every request in a way that makes the permission table a hot shard.
Failure modes.
Ramp-up. Reading the codebase is still half a day for a competent Laravel engineer; that is not the cost. The cost is security ownership — someone must be able to answer "is our token revocation correct?" and be right, and now also "what changed in this patch bump?" and be right. Assign a named owner before adoption, or the component becomes an unowned security surface, which remains the worst outcome for an 8-star auth package with an empty changelog.
How can I help you explore Laravel packages today?