eveseat/seat
EVE SeAT is an open-source Laravel-based management and authentication platform for EVE Online corporations and alliances, offering member management, API key handling, fleet tracking, and extensible integrations.
SeAT (eveseat/seat) is not a typical drop-in library — it's a full Laravel application for EVE Online corporation/alliance management (ESI tokens, characters, squads, roles, assets, wallets, and a plugin ecosystem). Treat it as a codebase you deploy and extend, not a package you composer require into an existing app.
eveseat/seat) or composer create-project eveseat/seat. Requirements in 5.x: PHP 8.x, MySQL/MariaDB, Redis (strongly recommended), and a queue worker.composer.json (require.php) on the tag you're targeting and confirm your runtime — and your Docker base image — meets it. The official image tracks the requirement; hand-built images and distro PHP packages are where this bites.EVE_CLIENT_ID, EVE_CLIENT_SECRET, and the callback URL in .env.php artisan migrate, then php artisan seat:admin:user to create your first admin.config/seat.php and config/eveapi.php (scope groups, ESI tuning), the Seat\Web and Seat\Eveapi namespaces, and app/ for the thin application layer that wires the eveseat/* packages together.In 5.0.1 the default env settings were committed upstream (PR #902), so a fresh checkout boots with far less hand-editing of .env than 5.0.0. Copy the shipped defaults, then override only what's environment-specific (DB, Redis, SSO credentials, APP_URL).
Working with ESI data. Use the Seat\Eveapi models rather than calling ESI yourself. CharacterInfo::find($id) gives you relations (assets, wallet_balance, skills, corporation, etc.) that are kept fresh by SeAT's scheduled jobs. Tokens live on CharacterInfo->refresh_token; refresh is handled by the eveapi layer, so you rarely touch it manually.
Custom jobs. Model new ESI pulls on existing Seat\Eveapi\Jobs\* classes: extend the base job, declare the scope your endpoint needs, and let the token middleware handle 401/refresh. Register recurring work through the scheduler in your service provider ($schedule->job(...)->hourly()), and make jobs idempotent — they'll retry.
Authorization. SeAT layers three things: roles (global, e.g. Admin/HR), squads (membership-based groups used heavily for corp/alliance gating), and Laravel gates. Prefer Squad-scoped checks in new features — role checks are blunt and admins will expect per-squad targeting.
Plugins. A SeAT plugin is a Composer package with a service provider that registers routes, menu entries, permissions, and migrations. Use the provided menu/ACL extension points and vendor:publish conventions instead of editing core files. This is the supported integration path and survives seat:update.
Pin your plugin's PHP constraint. Since 5.0.2 raises core's minimum PHP, plugins should declare a require.php constraint at least as strict as the core version they target. Otherwise Composer can happily install a plugin on a PHP runtime core rejects — or vice versa — and you get fatal errors at boot rather than at resolve time.
API surface. If you need programmatic access, SeAT ships its own API package with token scopes. Reuse its middleware and scope model rather than inventing a second auth scheme.
Settings. Prefer the global settings helper/store over hardcoding values, so admins can tune behaviour without redeploying.
composer install/boot. Verify PHP version before you git pull on a live instance — otherwise you take the site down during a routine update window. Roll the runtime (or the Docker image tag) first, then the code.config:cache bakes in values. After upgrading, run php artisan config:clear (or config:cache again) or you'll see the old, sparse configuration and wonder where the defaults went.queue:work under supervisor (or Horizon) is mandatory in production; the UI silently goes stale without it.php artisan migrate after pulling a new SeAT version — core and plugin migrations both need to run. seat:update wraps part of this, but verify.config/eveapi.php invalidates existing tokens for that scope group; users must re-link. Plan scope changes as a comms event, not a hotfix.storage/ and bootstrap/cache. The classic Docker bind-mount failure. Match the container's www-data UID or nothing writes.storage/logs/laravel.log plus failed-job inspection is your primary loop; APP_DEBUG=true is fine locally but should never be on for a public SeAT instance (it exposes SSO secrets in stack traces).composer.json rather than assuming "8.x" still qualifies.How can I help you explore Laravel packages today?