ralphjsmit/tall-install
Install the full TALL stack (Tailwind CSS, Alpine.js, Laravel, Livewire) in any Laravel project with a single Artisan command. It handles dependencies, configuration and opinionated presets so you can start building reactive interfaces in minutes.
ralphjsmit/tall-install is a one-shot scaffolder, not a runtime dependency. There is no meaningful "day-to-day" usage in a running application — the realistic workflow is: run it once to bootstrap a TALL-stack app, commit the result, and own the generated code from that moment on. Everything below assumes that framing.
Minimal path:
composer.json for type and bin, and src/Console/*.php for the command $signature. Expect one of two shapes: a Composer project you scaffold via composer create-project ralphjsmit/tall-install my-app, or an Artisan/global command you run inside a fresh Laravel app (e.g. php artisan tall-install). Don't guess — the invocation differs and only one will work at your pinned versions.README. The installer shells out to Composer, npm, and Artisan; a Node 14-era package.json against Node 20+ is a classic silent failure.git init && git add -A && git commit the instant it finishes — before you run npm install or touch anything. That single commit is your diff base for every later "what did it actually generate vs. what did it promise?" question.First use case: an internal admin panel or CRUD MVP. After the run, do a five-minute smoke test before celebrating:
php artisan about # framework + env sanity
php artisan migrate --seed # does the generated schema actually run?
npm install && npm run build # does the generated Tailwind pipeline compile?
php artisan route:list # is auth/login routing wired?
Then create one throwaway Livewire component and one Alpine x-data block in the generated layout. If both work, the wiring is real. If Alpine throws Alpine Expression Error, the frontend integration is half-baked and you've found it in five minutes instead of five days.
Pattern 1 — Sandbox spike, then mine it. Run the installer into /tmp/tall-spike, commit, and diff composer.json, package.json, tailwind.config.js, vite.config.js, resources/js/app.js, and resources/views/layouts/app.blade.php against a bare laravel new app. That diff is the product. Extract it into a checklist doc; you now have the package's opinionated defaults without the dependency.
Pattern 2 — Promote to an internal starter repo. If the defaults are good, fork (MIT permits it) into acme/tall-starter, pin versions, name an owner, and add a CI job that runs composer install, npm ci, npm run build, php artisan test. Teams then use composer create-project acme/tall-starter — one maintained baseline, no template drift, no archived dependency.
Pattern 3 — Scripted replacement for the interactive command. Interactive prompts are unusable in CI, containers, or onboarding scripts. Don't try to drive it with yes |; instead read src/Console/ for the exact package list and prompt branching, then codify it as an idempotent shell script in your starter repo:
composer require livewire/livewire:^3.0
npm install -D tailwindcss @tailwindcss/forms alpinejs
# ...mirror the installer's steps explicitly, in a script you own
You get reproducibility and a readable record of why each package is there.
Pattern 4 — Day-to-day work lives in the generated app. Once scaffolded, write components the ordinary way: php artisan make:livewire Users/Index, a Blade view with wire:model.live, and Tailwind classes inline. Use Alpine for purely local UI state (x-data="{ open: false }"), Livewire for anything that touches the server. Keep that boundary clean — mixing wire: and heavy x- state machines is the most common TALL maintenance problem.
Pattern 5 — Upgrade as a project, not a command. The generated app targets Laravel 9 / Livewire 2 / Tailwind 3-era conventions. Modernizing means livewire/livewire:^3, @livewireStyles removal, wire:model → wire:model.live where you need eager updates, and Tailwind 3 → 4 config migration. Do it on a branch, one dependency per commit, with composer audit and npm audit gating each step.
Integration tips: verify config/auth.php points at the right App\Models\User (that exact fix landed in 1.4.0 — if you rename or move the model, update it again). Check tailwind.config.js content globs cover any directory you add later. Remove the installer from require-dev after scaffolding — it is ephemeral tooling and should not ship.
post-create-project-cmd.git clean -xfd is your reset.routes/auth.php. Diff the generated structure against your target Laravel version before blaming the package.alpinejs and you also run Livewire 3 (which bundles Alpine), you get duplicated initialization and cryptic expression errors. Pick one: import Alpine yourself and call Livewire.start() after, or drop the manual import entirely.resources/views/admin/** and seeing unstyled markup is almost always a missing content entry, not a build failure..gitignore. Release 1.4.0 explicitly added build files to GitIgnore — confirm your deploy pipeline actually runs npm run build, or you'll ship an unstyled app.-vvv for the Composer phase, then inspect the actual composer.json/package.json rather than trusting the prompt summary. Check storage/logs/laravel.log for Artisan-phase errors.composer outdated --direct and npm outdated. The output tells you how far behind the baseline is and whether a fork is a weekend job or a quarter.CHANGELOG.md in your starter repo listing every divergence from the original scaffold so future maintainers know what's inherited versus deliberate.How can I help you explore Laravel packages today?