neo/laravel-early-access
Neo Laravel Early Access is a lightweight Laravel package for adding waitlists and invite-only registration to your app. Collect early-access signups, manage invitations, and gate features with middleware and Eloquent models until public launch.
What it is. A small Laravel package that ships a config file, a public route, a controller and Blade view, an email-capture table/model, and — typically for this pattern — a middleware that gates the rest of the application behind a "pre-launch" state. It packages a landing-page convention rather than a platform capability.
Architecture fit. Narrow but clean. It composes only with standard Laravel primitives: service-provider auto-discovery, publishable config/views/migrations, Blade, Eloquent. No queue workers, no external services, no exotic runtime. That means it either drops in with almost no ceremony on a compatible version, or it fails loudly at install — there is no deep coupling either way. The one architecturally loaded decision is whether the gate is middleware-based, because that places a third-party package in the request path of every user, which is a security-adjacent position for unmaintained code.
Integration feasibility. Low-to-moderate, and the friction is release-era rather than conceptual:
illuminate/* and php constraints almost certainly need loosening before it installs on a current stack.app/Http/Kernel.php, the Laravel 11+ skeleton — which has no Kernel and moves registration to bootstrap/app.php — needs an adapter. Backwards compatibility exists but is easy to get wrong.users table rather than its own.Technical risk. Bounded, with one sharp edge.
Key questions.
composer.json constraints on PHP and illuminate/*, and does it install cleanly on our target version?users? Is there deduplication, validation, and any abuse control?Stack fit. Good on paper: first-party Laravel idioms only, no Node toolchain, no external SaaS, no services to provision. Equally at home on Sail, Forge, or Vapor. The misfit is version-era, not paradigm.
Build vs. adopt. This is the central TPM call, and the scoring argues against adoption as a dependency. At 178 stars, 0 dependents, four years since release, and a low opportunity score, the package's durable value is as a reference implementation of a well-understood pattern: a route, a Blade form, a controller, a table, a middleware gate. Reimplementing that against our pinned framework version is closer to a one-to-two-day task than a project, and it yields code we own, test, and can extend with double opt-in, rate limiting, analytics, and a launch-day toggle.
Recommended path: read it, don't depend on it. Adopt the pattern, write the implementation in-house. If schedule pressure forces a shortcut, fork into our namespace rather than composer require, and pin the fork to our repository.
Migration path (if adopting).
composer.json requirements, run our suite, catalogue deprecations./login), and test the "gate on, misconfigured" path deliberately.Compatibility and sequencing. Do this before the next major framework upgrade, not during it — bundling a stale third-party gate into a framework upgrade conflates two failure domains. Order of operations: version spike → build-vs-fork decision → gate and consent hardening → launch-day toggle exercised in staging → only then wire into the deploy pipeline. If the app is already live, this is a feature-flagged addition behind config, not a change to existing routing.
Maintenance. As a live dependency it is an unbounded recurring tax: every major framework release (roughly annual) becomes an unassisted compatibility exercise on code nobody on the team wrote, with no upstream to file against. As a vendored pattern it approaches zero, because it is a few hundred lines of ordinary Blade and middleware our existing upgrade process already covers. That delta is the strongest argument in this assessment.
Support. No maintainer SLA, no security advisory channel, and zero dependents means no peer debugging or prior-art fixes. Any incident is ours alone, and the first responder will be reading the source cold.
Scaling. Throughput is a non-issue — it is a form and a redirect. The scaling concerns are blast radius: a global gate middleware adds a check to every request, and a waitlist endpoint is an unauthenticated public write path. Both are cheap at any realistic volume, but both need rate limiting and a fail-closed default before they face the internet.
Failure modes, ranked by consequence:
Ramp-up. Very low for any Laravel developer; the whole package is readable in under an hour, and every concept involved (service provider, publishable config, middleware, Blade form) is framework fundamentals. The real ramp-up cost is decision cost: someone must own the fork, the gate semantics, and the data policy. Budget half a day for the spike and one to two days to build and harden in-house; budget an ongoing trickle of unplanned work if it instead becomes a live dependency.
Bottom line. Treat it as documentation, not infrastructure. The pattern is worth copying; the package — four years stale, zero dependents, and placed in a security-adjacent position in the request path — is not worth taking ownership of. Ship our own version, pin it, test the fail-closed path, and close the item.
How can I help you explore Laravel packages today?