tey / starter
Tenant-aware Laravel starter built for the Tey Labs fleet.
Fund package maintenance!
Requires
- php: ^8.4
- glhd/gretel: ^1.10
- inertiajs/inertia-laravel: ^3.0
- inertiaui/modal: ^3.1
- laravel/fortify: ^1.41
- laravel/framework: ^13.17
- laravel/mcp: ^1.0
- laravel/nightwatch: ^1.30
- laravel/passport: ^13.10
- laravel/pennant: ^1.0
- league/flysystem-aws-s3-v3: ^3.29
- lorisleiva/laravel-actions: ^2.12
- resend/resend-php: ^1.17
- spatie/laravel-data: ^4.23
- spatie/laravel-medialibrary: ^11.13
- spatie/laravel-multitenancy: ^4.2
- spatie/laravel-query-builder: ^7.3
- spatie/laravel-settings: ^3.9
- tey/concierge: ^0.9
- tey/kit: ^0.14.1
- tey/mod: ^0.11
- tey/standards: ^0.11.74
Requires (Dev)
- larastan/larastan: ^3.9
- laravel/boost: ^2.4
- laravel/pail: ^1.2
- laravel/pao: ^1.0.6
- laravel/pint: ^1.27
- laravel/tinker: ^3.0
- opis/json-schema: ^2.4
- pestphp/pest: ^5.0
- pestphp/pest-plugin-browser: ^5.1
- pestphp/pest-plugin-drift: ^5.0
- pestphp/pest-plugin-laravel: ^5.0
- spatie/laravel-typescript-transformer: ^3.3
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-11-08 07:43:43 UTC
README
Built for the Tey Labs fleet. Public but unsupported: no support, no stability promise, use at your own risk.
The new-app template for tenant-aware Laravel apps, built on tey/kit with the kit's default features added: workspace membership and invitations, versioned settings shared by session pages and MCP tools, Fortify sessions, Inertia/Vue pages, and Passport OAuth with PKCE. Notes is opt-in: add it with php artisan kit:add notes (lifecycle). Maintained packages own their jobs; no production application or database is copied.
PHP 8.4 or 8.5 and Node 22 are required.
First run
composer setup
From a fresh clone (or laravel new app --using=tey/starter once the template is on Packagist), one command installs the dependencies, copies .env.example to .env, generates the key, creates database/database.sqlite, migrates, builds the frontend and creates the first local owner and workspace (php artisan starter:first-owner). It prompts for the owner's password; with --no-interaction it generates one and prints it once. Nothing is stored or seeded outside the local environment, and there are no default credentials. Then php artisan serve and sign in at /login, with the password or, locally, with Concierge's one-click "Sign in as owner@example.com" (CONCIERGE_LOCAL_LOGIN; Concierge never offers it outside the local environment).
laravel/tinker is a dev dependency (php artisan tinker).
Check
vendor/bin/pint --test php artisan standards:check vendor/bin/pest --tia # the tests your change touches composer fixture:check composer test:browser npm run typecheck && npm run build && npm test sh bin/privacy-check.sh
The PHP suites run on PostgreSQL, as production does, and in parallel with a database per worker ({DB_DATABASE}_w{token}, created on first use). The connection comes from the committed .env.testing (Herd's PostgreSQL on 127.0.0.1:5432, user root, database starter_testing), and any DB_* variable set for the run overrides it; .env is never read. Each run wipes its database, so name a disposable one. pest and composer fixture:check print the database in use:
vendor/bin/pest --tia --parallel # or composer test
DB_DATABASE=my_branch_testing composer fixture:check
SQLite stays only for the few checks that read a SQLite dump (TEST_DB_CONNECTION=sqlite vendor/bin/pest --no-tia tests/FeatureSeamsTest.php) and for pure unit tests that touch no database.
composer test:local runs the whole suite on a laptop when you mean to: the PHP suite on 8 processes (without the nightly group), then the browser suite on 4. Ctrl-C stops both and every worker. CI is the gate, so a push never waits for it.
php artisan standards:check runs tey/standards' conformance rules (configured in tests/Arch/configuration.php) and must exit 0. The gate is strict: every optional and advisory rule is on (optionalRules), rule 51 (CI shape) is enforced (ciEnforce, and PREFLIGHT_CI_ENFORCE=true in CI), and the allowlist is empty. A finding is fixed in the code, never allowlisted. Before building a page, action, MCP tool or setting, find its pattern with bakery.find (offline: php artisan standards:pattern "<intent>"). standards:install also adds Claude Code hooks in .claude/settings.json (a pre-commit and Stop check, a pattern lookup for new files, and a check after each edit) and a git pre-push hook running standards:check --changed. Laravel Boost (boost.json, .ai/guidelines) publishes the guidelines and skills to Claude Code and Codex; refresh them with php artisan boost:update.
CI checks Pint and standards, runs the PHP suites in parallel on PostgreSQL, checks the template's feature files against kit:add on a clean Laravel app, and runs composer setup and the browser test on a fresh clone. See testing.
Status
v0.3 rebuilds the template on tey/kit 0.1. Not yet available: laravel new --using=tey/starter (not on Packagist yet), password reset (it needs mail, #24) and the deploy smoke command (#32). Not yet proven: PostgreSQL concurrency, jobs and files. See ROADMAP.md.
License
MIT, see LICENSE. The UI primitives and sign-in page come from Laravel's Vue starter kit (MIT, see resources/js/components/ui/LICENSE.md). Provided as is, with no support.
Docs
- Architecture: tey/kit, the packages and the job each owns
- Operations: settings, versions, intent keys, audit
- Transports: session/Inertia and MCP/OAuth, scopes, consent
- Lifecycle: install, kit features, migrations from 0.2 and updates
- Deploy: the Laravel Cloud deploy commands, in order
- Testing: gates and focused checks
- llms.txt: index for coding agents
- AGENTS.md: contributor and agent conventions
Machine-readable maps live in docs/*.json: mcp-capabilities.json (the MCP capability declaration, validated against the vendored schemas/mcp-capabilities.schema.json), package-map.json, conformance.json, feature-transports.json and generation-manifest.json.