Wire-Up is an opinionated, strict and fully tested Livewire Laravel Starter Kit.
- Multi-language Support - Easily build applications with localization and translations
- Real-time Interactivity - Dynamic content updates without page refreshes
- Server-side Rendering - Fast initial page loads with SEO-friendly content
- Modern UI Components - Built with Flux UI Pro for beautiful, accessible interfaces
- Developer Experience - Hot reloading, type-safe code, and comprehensive testing
- Responsive Design - Mobile-first approach with Tailwind CSS
- Security First - Laravel's built-in security features and best practices
- Laravel 13 - The PHP framework for web artisans
- Livewire 4 - Full-stack framework for Laravel
- Flux UI Pro - Beautiful UI components for Livewire
- Tailwind CSS v4 - Utility-first CSS framework
- Pest 4 - Delightful PHP testing framework
- PHPStan + PestStan - Static analysis for application and Pest tests
- Rector - Automated refactoring and code quality checks
- Laravel Pint - Code style fixer
- Vite - Fast build tool and dev server
- PHP 8.5+
- Node.js 22+ (see
.nvmrc) - Composer 2.0+
- MySQL/PostgreSQL/SQLite
- PHP
gdextension (image resizing/cropping) - Optional: PHP
imagickextension built withlibheif— enables HEIC/HEIF uploads (converted to JPEG on upload). Without it, HEIC uploads are rejected with a friendly message; all other image formats are unaffected.
-
Clone the repository
git clone https://github.com/your-username/wire-up.git cd wire-up -
Install PHP & Node.js dependencies and Environment setup
composer setup
Wire-Up uses Pest v4 for testing, including browser testing capabilities:
# Run the full quality pipeline (type coverage, tests, lint, static analysis)
composer test
# Run just the Pest test suite
composer test:unit
# Run static analysis only
composer test:typesThe project uses Laravel Pint + Prettier for formatting:
# Fix code style issues
vendor/bin/pint
npm run lint
# Check for style issues without fixing
composer test:lintRequirements on the server: PHP 8.5, Composer, Node.js 22+, git, MySQL.
-
Add a deploy key (read-only SSH key) to the GitHub repository and clone it:
git clone git@github.com:raz-iacob/wire-up.git cd wire-up -
Place your Flux UI Pro credentials in
auth.json(gitignored):{ "http-basic": { "composer.fluxui.dev": { "username": "your-email", "password": "your-license-key" } } } -
Create
.envfrom.env.examplewith production values (APP_ENV=production,APP_DEBUG=false,APP_URL, MySQL credentials). -
Install PHP dependencies and run the installer:
composer install --no-dev php artisan wireup:install
The installer generates the app key if missing, migrates the database, links storage, builds the frontend, caches the app, and creates the first admin user.
-
Add the scheduler cron entry and a supervised queue worker (required for e-mail/Slack notifications and admin-triggered updates):
* * * * * cd /path/to/wire-up && php artisan schedule:run >> /dev/null 2>&1
php artisan queue:work --tries=3 --timeout=3600
Keep
DB_QUEUE_RETRY_AFTER=3700in.env(it must exceed the worker--timeout, or a long-running update job gets re-dispatched mid-run).
Releases are git tags (v0.x.y) with matching sections in CHANGELOG.md. The scheduler checks for new releases daily (php artisan wireup:check); when one is available, the admin shows a badge on Settings → Updates with the release notes.
- From the admin: Settings → Updates → Update now (runs as a queued job — requires the queue worker above).
- From the CLI:
php artisan wireup:update(options:--tag=vX.Y.Z,--force). - Automatic: enable Automatic updates on Settings → Updates; the daily check then installs new releases unattended.
An update puts the public site into maintenance mode (the admin stays reachable), then: fetch + check out the tag, composer install --no-dev, migrate --force, npm ci + build, cache rebuild, queue:restart, and back up. If a step fails, the site stays in maintenance mode — review the error on Settings → Updates (or the console), fix it, then run php artisan up. Roll back with:
git checkout vPREVIOUS
composer install --no-dev && php artisan migrate --force
npm ci && npm run build && php artisan optimize && php artisan upRelease routine: add a ## vX.Y.Z section to CHANGELOG.md, commit, tag (git tag vX.Y.Z), push with tags.
Pexels media library integration: Add a free Pexels API key (from pexels.com/api) under Settings → Integrations in the admin to enable the integration. Editors can then search Pexels photos and videos directly from the media picker and import them into the library. When no key is set, the Pexels option is hidden. Per the Pexels API Guidelines, photographer attribution and a link back to Pexels are shown in the picker, and the photographer/source details are stored with each imported asset (in
media.metadata) so credit can be surfaced wherever the media is used.
Every public page renders a full discovery layer from the head component, and the site exposes machine-readable resources for crawlers and AI agents:
- Social & search meta - canonical URL, Open Graph, Twitter cards,
hreflangalternates (for multi-locale sites),theme-color, and JSON-LD structured data (Organization,WebSite,WebPage,BreadcrumbList). Descriptions fall back to a clean excerpt derived from a page's content blocks when no description is set. - Block-level structured data - Location, Team, Pricing, Video, Audio, and Gallery blocks emit
matching Schema.org types (
LocalBusiness,Person,Offer,VideoObject,AudioObject,ImageObject) into the page's JSON-LD. - Share images - each page's Open Graph image is used when set; otherwise the Default share image from Settings → Identity is used.
/sitemap.xml- dynamically lists published pages across their published locales withlastmodandhreflangalternates./llms.txt- a Markdown index of published pages (title, URL, description) for AI crawlers./llms-full.txt- the full plain-text content of every published page.- Markdown for agents - every published page and record also serves a clean Markdown
representation of its content blocks from the same URL via content negotiation: requests with an
Accept: text/markdownheader (as sent by AI agents) get Markdown instead of HTML, cutting token noise while keeping canonical URLs. /robots.txt- dynamic; references the sitemap and reflects the indexing settings below.
MCP server for AI agents:
Wire-Up ships a local MCP server so AI agents (Claude Code, Cursor, and other MCP clients) can build and edit the site programmatically:
- Start it with
php artisan mcp:start wire-up, or point your MCP client at that command; debug it interactively withphp artisan mcp:inspector wire-up. - The
block-typesresource documents every content block and its JSON shape. Tools cover the full site-building workflow: pages (list-pages,get-page,create-page,update-page-blocks,publish-page), media (list-media,import-media-from-url,search-pexels,import-pexels-media), site settings (get-settings,update-design,update-identity,update-social), and navigation (get-menus,update-menu). Agents can verify their work by fetching page URLs with anAccept: text/markdownheader (see above).
Controlling indexing:
- Settings → Identity has a Discourage search engines toggle. When on, every page gets a
noindexrobots tag,robots.txtreturnsDisallow: /, images send anX-Robots-Tagheader, and/sitemap.xml+/llms.txtare emptied. - Each page's SEO Settings has its own Discourage search engines from indexing this page
toggle, which adds
noindexto that page only and drops it from the sitemap.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow Laravel conventions and best practices
- Write tests for new features
- Use meaningful commit messages
- Ensure code passes all tests and style checks
This project is licensed under the MIT License - see the LICENSE file for details.
- Laravel team for the amazing framework
- Livewire team for making full-stack development delightful
- Flux UI for beautiful components
- Tailwind CSS for excellent utility classes
Built with ❤️ using Laravel + Livewire