{"id":32843142,"url":"https://github.com/pixelworxio/livewire-workflows","last_synced_at":"2026-02-18T08:05:46.148Z","repository":{"id":322900536,"uuid":"1089680586","full_name":"pixelworxio/livewire-workflows","owner":"pixelworxio","description":"Build multi-step workflows in Laravel / Livewire with zero boilerplate","archived":false,"fork":false,"pushed_at":"2026-01-12T05:41:19.000Z","size":236,"stargazers_count":70,"open_issues_count":0,"forks_count":5,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-12T15:42:10.843Z","etag":null,"topics":["laravel","livewire","livewire-laravel","livewire-packages","livewire3","multi-step","multi-step-form","php","workflow","workflows"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pixelworxio.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"Pixelworxio"}},"created_at":"2025-11-04T17:04:00.000Z","updated_at":"2026-01-12T05:41:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/pixelworxio/livewire-workflows","commit_stats":null,"previous_names":["pixelworxio/livewire-workflows"],"tags_count":8,"template":false,"template_full_name":"spatie/package-skeleton-laravel","purl":"pkg:github/pixelworxio/livewire-workflows","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pixelworxio%2Flivewire-workflows","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pixelworxio%2Flivewire-workflows/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pixelworxio%2Flivewire-workflows/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pixelworxio%2Flivewire-workflows/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pixelworxio","download_url":"https://codeload.github.com/pixelworxio/livewire-workflows/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pixelworxio%2Flivewire-workflows/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29573448,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-18T07:57:19.261Z","status":"ssl_error","status_checked_at":"2026-02-18T07:57:18.820Z","response_time":162,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["laravel","livewire","livewire-laravel","livewire-packages","livewire3","multi-step","multi-step-form","php","workflow","workflows"],"created_at":"2025-11-08T05:00:48.835Z","updated_at":"2026-02-18T08:05:46.142Z","avatar_url":"https://github.com/pixelworxio.png","language":"PHP","funding_links":["https://github.com/sponsors/Pixelworxio"],"categories":[],"sub_categories":[],"readme":"![Livewire Workflows Banner](https://raw.githubusercontent.com/pixelworxio/livewire-workflows/main/resources/livewire-workflows-banner.png)\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/pixelworxio/livewire-workflows/actions/workflows/run-tests.yml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/pixelworxio/livewire-workflows/run-tests.yml?branch=main\u0026label=tests\u0026style=flat-square\" alt=\"GitHub Tests Action Status\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/pixelworxio/livewire-workflows\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/pixelworxio/livewire-workflows?style=flat-square\" alt=\"GitHub Stars\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---\n# Livewire Workflows (BETA)\n**Build powerful multi-step workflows in Laravel with zero boilerplate.** Define complex user journeys—onboarding, checkouts, surveys—using an expressive, route-like DSL. Get automatic route registration, guard-based navigation, state persistence, and full Livewire 4.x integration out of the box. Livewire 3.x is also supported.\n\n```php\n// Define a complete workflow in seconds\nWorkflow::flow('onboarding')\n    -\u003eentersAt(name: 'onboarding.start', path: '/onboarding')\n    -\u003efinishesAt('dashboard')\n    -\u003estep('verify-email')\n        -\u003egoTo(VerifyEmail::class)\n        -\u003eunlessPasses(EmailVerifiedGuard::class)\n        -\u003eorder(10)\n    -\u003estep('profile')\n        -\u003egoTo(EditProfile::class)\n        -\u003eunlessPasses(ProfileCompletedGuard::class)\n        -\u003eorder(20);\n```\n\nThat's it. No manual routes. No state management headaches.\n\nView the testbench repo, https://github.com/pixelworxio/livewire-workflows-testbench, for examples of how this package can help you with your project.\n\n---\n\n## ✨ Why Livewire Workflows?\n\n| Feature | Livewire Workflows | Manual Implementation |\n|---------|-------------------|----------------------|\n| **Route Management** | ✅ Auto-generated | ❌ Define every route manually |\n| **State Persistence** | ✅ Built-in (Session/DB) | ❌ Roll your own |\n| **Navigation Logic** | ✅ Guard-based pipeline | ❌ Complex conditionals everywhere |\n| **Back Button** | ✅ History tracking | ❌ Custom session juggling |\n| **Progress Tracking** | ✅ One method call | ❌ Calculate yourself |\n| **Events \u0026 Analytics** | ✅ Fire automatically | ❌ Remember to dispatch |\n\n**Result:** Spend time building features, not workflow infrastructure.\n\n---\n\n## 📦 Installation\n\n```bash\ncomposer require pixelworxio/livewire-workflows\n```\n\n### Quick Setup (Session-Based)\n```bash\nphp artisan workflows:install\n```\n\n### Production Setup (Database-Backed)\n```bash\nphp artisan workflows:install --with-db\nphp artisan migrate\n```\n\n---\n\n## 🚀 Quick Start (3 Minutes)\n\n### 1. Define Your Workflow\n\nOpen `routes/workflows.php`:\n\n```php\nuse Pixelworxio\\LivewireWorkflows\\Facades\\Workflow;\n\nWorkflow::flow('onboarding')\n    -\u003eentersAt(name: 'onboarding.start', path: '/onboarding')\n    -\u003efinishesAt('dashboard')\n    -\u003estep('verify-email')\n        -\u003egoTo(\\App\\Livewire\\Onboarding\\VerifyEmail::class)\n        -\u003eunlessPasses(\\App\\Guards\\EmailVerifiedGuard::class)\n        -\u003eorder(10)\n    -\u003estep('profile')\n        -\u003egoTo(\\App\\Livewire\\Onboarding\\EditProfile::class)\n        -\u003eunlessPasses(\\App\\Guards\\ProfileCompletedGuard::class)\n        -\u003eorder(20);\n```\n\n**Routes auto-registered:**\n- Entry: `GET /onboarding` → `onboarding.start`\n- Step 1: `GET /onboarding/verify-email` → `onboarding.verify-email`\n- Step 2: `GET /onboarding/profile` → `onboarding.profile`\n\n### 2. Create a Guard\n\n**Quick Generation:**\n```bash\nphp artisan make:workflow-guard EmailVerified\n```\n\nThis generates a guard at `App\\Guards\\EmailVerifiedGuard.php` with the proper structure.\n\n```php\nnamespace App\\Guards;\n\nuse Illuminate\\Http\\Request;\nuse Pixelworxio\\LivewireWorkflows\\Contracts\\GuardContract;\n\nclass EmailVerifiedGuard implements GuardContract\n{\n    public function passes(Request $request): bool\n    {\n        return true;\n    }\n\n    public function onEnter(Request $request): void {}\n    public function onExit(Request $request): void {}\n    public function onPass(Request $request): void {}\n    public function onFail(Request $request): void {}\n}\n```\n\n**Guard Logic:** `passes() = true` → skip step. `passes() = false` → show step.\n\n### 3. Build Your Livewire Component\n\n```php\nnamespace App\\Livewire\\Onboarding;\n\nuse Livewire\\Component;\nuse Pixelworxio\\LivewireWorkflows\\Attributes\\WorkflowStep;\nuse Pixelworxio\\LivewireWorkflows\\Livewire\\Concerns\\InteractsWithWorkflows;\n\n#[WorkflowStep(flow:'onboarding', key:'verify-email')]\nclass VerifyEmail extends Component\n{\n    use InteractsWithWorkflows;\n\n    public function resend()\n    {\n        auth()-\u003euser()-\u003esendEmailVerificationNotification();\n        session()-\u003eflash('message', 'Verification email sent!');\n    }\n    \n    public function goToNextStep(): void\n    {\n        // ... handle your logic\n        \n        $this-\u003econtinue('onboarding'); // workflow name is optional when using WorkflowStep attribute\n    }\n\n    public function render()\n    {\n        return view('livewire.onboarding.verify-email');\n    }\n}\n```\n\n**And in your Blade view:**\n```blade\n\u003cdiv\u003e\n    \u003ch1\u003eVerify Your Email\u003c/h1\u003e\n    \u003cp\u003eCheck your inbox for the verification link.\u003c/p\u003e\n    \n    \u003cbutton wire:click=\"resend\"\u003eResend Email\u003c/button\u003e\n    \n    \u003cbutton wire:click=\"goToNextStep\"\u003e\n        I've Verified — Continue\n    \u003c/button\u003e\n\u003c/div\u003e\n```\n\n### 4. Done!\n\nVisit `/onboarding`. The package:\n1. Evaluates guards in order\n2. Redirects to first incomplete step\n3. Tracks progress automatically\n4. Completes when all steps pass\n\n---\n\n## 📖 Core Concepts\n\n### Auto-Generated Routes\n\nRoutes are **automatically registered** from your DSL:\n\n```php\n-\u003eentersAt(name: 'checkout.start', path: '/checkout')  // Entry route\n-\u003estep('shipping')                                       // Auto: /checkout/shipping\n-\u003estep('payment')                                        // Auto: /checkout/payment\n```\n\n**Generated:**\n- `checkout.start` → `/checkout`\n- `checkout.shipping` → `/checkout/shipping`\n- `checkout.payment` → `/checkout/payment`\n\n### Dynamic Routes with Parameters\n\nWorkflows support **dynamic route parameters** and **route model binding**:\n\n```php\nWorkflow::flow('user-checkout')\n    -\u003eentersAt(name: 'user-checkout.start', path: '/user/{user}/checkout/{product}')\n    -\u003efinishesAt('dashboard')\n    -\u003estep('shipping')\n        -\u003egoTo(\\App\\Livewire\\Checkout\\Shipping::class)\n        -\u003eunlessPasses(\\App\\Guards\\HasShippingAddress::class)\n        -\u003eorder(10)\n    -\u003estep('payment')\n        -\u003egoTo(\\App\\Livewire\\Checkout\\Payment::class)\n        -\u003eunlessPasses(\\App\\Guards\\HasPaymentMethod::class)\n        -\u003eorder(20);\n```\n\n**Generated Routes:**\n- `user-checkout.start` → `/user/{user}/checkout/{product}`\n- `user-checkout.shipping` → `/user/{user}/checkout/{product}/shipping`\n- `user-checkout.payment` → `/user/{user}/checkout/{product}/payment`\n\n**Route Model Binding:**\n\n```php\n// Supports Laravel's route model binding syntax\n-\u003eentersAt(name: 'checkout.start', path: '/user/{user:id}/product/{product:slug}')\n```\n\n**Navigation Preserves Parameters:**\n\nRoute parameters are automatically passed through all workflow navigation:\n\n```php\nclass Shipping extends Component\n{\n    use InteractsWithWorkflows;\n    \n    protected ?string $workflowName = 'user-checkout';\n\n    // Livewire receives route parameters\n    public function mount($user, $product)\n    {\n        // $user and $product are automatically injected\n    }\n\n    public function submit()\n    {\n        // Parameters are automatically preserved when continuing\n        $this-\u003econtinue($this-\u003eworkflowName); // Still navigates with {user} and {product}\n    }\n}\n```\n\nThe `continue()` and `back()` methods automatically extract and pass route parameters from the current request, ensuring seamless navigation throughout the workflow.\n\n### Guard Behavior\n\nGuards use **positive semantics**:\n\n```php\nclass ProfileCompleteGuard implements GuardContract\n{\n    public function passes(Request $request): bool\n    {\n        return $request-\u003euser()-\u003eprofile_completed;\n    }\n}\n```\n\n| Guard Result | Step Behavior |\n|--------------|---------------|\n| `passes() = true` | **Skip** this step |\n| `passes() = false` | **Show** this step |\n\nUse `unlessPasses(Guard::class)`: \"Show step UNLESS guard passes.\"\n\n### Navigation Flow\n\n1. User visits entry route (`/onboarding`)\n2. Package evaluates guards in `order`\n3. Redirects to first failing guard's step\n4. User completes step, calls `$this-\u003econtinue('onboarding')`\n5. Re-evaluates from entry → next unmet step or finish\n\n---\n\n## 🧩 Advanced Features\n\n### State Management\n\n#### Setting Workflow Name\n\nUse the `#[WorkflowName]` attribute to explicitly declare your component's workflow, when not using the WorkflowStep attribute:\n\n```php\nuse Pixelworxio\\LivewireWorkflows\\Attributes\\WorkflowName;\n\n#[WorkflowName('checkout')]\nclass CheckoutShipping extends Component\n{\n    use InteractsWithWorkflows;\n\n    // protected ?string $workflowName = 'checkout'; // No need to set \n}\n```\n\n**Benefits:**\n- ✅ Eliminates boilerplate\n- ✅ Makes workflow association explicit\n- ✅ Auto-detected during component boot\n- ✅ Falls back to route-based detection if not present\n\n#### Persisting State\n\nPersist data across workflow steps with the `#[WorkflowState]` attribute:\n\n```php\nuse Pixelworxio\\LivewireWorkflows\\Attributes\\WorkflowName;\nuse Pixelworxio\\LivewireWorkflows\\Attributes\\WorkflowState;\n\n#[WorkflowName('checkout')]\nclass CheckoutShipping extends Component\n{\n    use InteractsWithWorkflows;\n\n    #[WorkflowState]\n    public ?string $address = null;\n\n    #[WorkflowState(encrypt: true)]\n    public ?string $creditCard = null;\n\n    #[WorkflowState(namespace: 'shipping')]\n    public ?string $method = null;\n}\n```\n\n**Features:**\n- Auto-hydration on mount\n- Auto-persistence on dehydrate\n- Encryption support\n- Namespace grouping\n- Session or database storage\n\n[Full state management guide →](STATE_MANAGEMENT.md)\n\n### Progress Tracking\n\n```php\n$progress = workflow('onboarding')-\u003eprogressFor($request);\n\n// Returns:\n[\n    'total' =\u003e 3,\n    'completed' =\u003e 1,\n    'remaining' =\u003e 2,\n    'percentage' =\u003e 33.33,\n    'current_step' =\u003e 'verify-email',\n    'next_step' =\u003e 'profile',\n    'is_complete' =\u003e false,\n]\n```\n\n### Events\n\nListen to workflow lifecycle:\n\n```php\nuse Pixelworxio\\LivewireWorkflows\\Events\\{WorkflowAdvanced, WorkflowCompleted};\n\nEvent::listen(WorkflowAdvanced::class, function ($event) {\n    Log::info(\"User {$event-\u003euserKey} moved from {$event-\u003efromKey} to {$event-\u003etoKey}\");\n});\n\nEvent::listen(WorkflowCompleted::class, function ($event) {\n    Mail::to($user)-\u003esend(new OnboardingComplete());\n});\n```\n\n### CLI Tools\n\n```bash\n# Generate a new workflow\nphp artisan make:workflow checkout\n\n# Generate a guard class\nphp artisan make:workflow-guard EmailVerified\n\n# Add a step to existing workflow\nphp artisan make:workflow-step checkout payment \\\n    --component=App\\\\Livewire\\\\Checkout\\\\Payment \\\n    --guard=App\\\\Guards\\\\CartNotEmptyGuard \\\n    --order=20\n\n# Validate and document all workflows\nphp artisan workflows:scan\n```\n\n---\n\n## 🎯 Real-World Examples\n\n### Multi-Page Checkout\n\n```php\nWorkflow::flow('checkout')\n    -\u003eentersAt(name: 'checkout.start', path: '/checkout')\n    -\u003efinishesAt('orders.confirmation')\n    -\u003estep('cart')\n        -\u003egoTo(ReviewCart::class)\n        -\u003eunlessPasses(CartNotEmptyGuard::class)\n        -\u003eorder(10)\n    -\u003estep('shipping')\n        -\u003egoTo(ShippingAddress::class)\n        -\u003eunlessPasses(ShippingAddressGuard::class)\n        -\u003eorder(20)\n    -\u003estep('payment')\n        -\u003egoTo(PaymentMethod::class)\n        -\u003eunlessPasses(PaymentMethodGuard::class)\n        -\u003eorder(30);\n```\n\n### Employee Onboarding\n\n```php\nWorkflow::flow('employee-onboarding')\n    -\u003eentersAt(name: 'onboard.start', path: '/onboard')\n    -\u003efinishesAt('employee.dashboard')\n    -\u003estep('paperwork')\n        -\u003egoTo(Paperwork::class)\n        -\u003eunlessPasses(PaperworkCompleteGuard::class)\n        -\u003eorder(10)\n    -\u003estep('it-setup')\n        -\u003egoTo(ITSetup::class)\n        -\u003eunlessPasses(ITAccountGuard::class)\n        -\u003eorder(20)\n    -\u003estep('training')\n        -\u003egoTo(TrainingModules::class)\n        -\u003eunlessPasses(TrainingCompleteGuard::class)\n        -\u003eorder(30);\n```\n\n### User Registration Flow\n\n```php\nWorkflow::flow('signup')\n    -\u003eentersAt(name: 'signup.start', path: '/signup')\n    -\u003efinishesAt('welcome')\n    -\u003estep('account')\n        -\u003egoTo(CreateAccount::class)\n        -\u003eunlessPasses(AccountCreatedGuard::class)\n        -\u003eorder(10)\n    -\u003estep('verify-email')\n        -\u003egoTo(VerifyEmail::class)\n        -\u003eunlessPasses(EmailVerifiedGuard::class)\n        -\u003eorder(20)\n    -\u003estep('preferences')\n        -\u003egoTo(SetPreferences::class)\n        -\u003eunlessPasses(PreferencesSetGuard::class)\n        -\u003eorder(30);\n```\n\n---\n\n## 🔧 Configuration\n\nPublish and customize the config:\n\n```bash\nphp artisan vendor:publish --tag=livewire-workflows-config\n```\n\n**`config/livewire-workflows.php`:**\n\n```php\nreturn [\n    // State persistence: 'null', 'session', or 'eloquent'\n    'repository' =\u003e env('WORKFLOWS_REPOSITORY', 'session'),\n    \n    // Middleware applied to all workflow routes\n    'middleware' =\u003e ['web', 'auth'],\n];\n```\n\n### State Repository Options\n\n| Repository | Use Case | Persistence |\n|------------|----------|-------------|\n| `null` | Stateless workflows | None |\n| `session` | Guest users, simple flows | Session lifetime |\n| `eloquent` | Authenticated users, production | Database |\n\n---\n\n## 📊 API Reference\n\n### Workflow DSL\n\n```php\nWorkflow::flow(string $name)\n    -\u003eentersAt(name: string, path: string)\n    -\u003efinishesAt(string $routeName)\n    -\u003estep(string $key)\n        -\u003egoTo(string $componentClass)\n        -\u003eunlessPasses(string $guardClass)\n        -\u003eorder(int $order);\n```\n\n### Livewire Trait Methods\n\n```php\nuse InteractsWithWorkflows;\n\n$this-\u003econtinue(string $flow): RedirectResponse\n$this-\u003eback(string $flow, string $currentKey): ?RedirectResponse\n$this-\u003esyncState(): void  // Manually persist state\n```\n\nNote: When using the `#[WorkflowStep]` attribute, the `$flow` and `$currentKey` properties are optional\n\n```\n#[WorkflowStep(flow: 'my-flow', key: 'current-step', middleware: ['auth'])]\n\nuse InteractsWithWorkflows;\n\n$this-\u003econtinue(): RedirectResponse\n$this-\u003eback(): ?RedirectResponse\n```\n\n### Helper Functions\n\n```php\nworkflow(string $flow)-\u003eredirect(Request $request, ?string $doneRoute = null)\nworkflow(string $flow)-\u003enextRouteNameFor(Request $request, ?string $doneRoute = null)\nworkflow(string $flow)-\u003epreviousRouteNameFor(string $currentKey, Request $request)\nworkflow(string $flow)-\u003eprogressFor(Request $request)\n```\n\n### State Management Helpers\n\n```php\n// Automatic with attributes\n#[WorkflowState] public ?string $email = null;\n#[WorkflowState(encrypt: true)] public ?string $password = null;\n#[WorkflowState(namespace: 'profile')] public ?string $name = null;\n\n// Manual helpers\n$this-\u003eputWorkflowState(string $key, mixed $value)\n$this-\u003egetWorkflowState(string $key, mixed $default = null)\n$this-\u003ehasWorkflowState(string $key)\n$this-\u003eforgetWorkflowState(string $key)\n$this-\u003eclearWorkflowState(?string $namespace = null)\n$this-\u003eallWorkflowState()\n```\n\n---\n\n## 🆚 Comparison with Alternatives\n**Or so Claude.ai says...\n\n| Feature | Livewire Workflows | Spatie Laravel Wizard | Custom Solution |\n|---------|-------------------|----------------------|-----------------|\n| Route Auto-Registration | ✅ | ❌ | ❌ |\n| Guard-Based Navigation | ✅ | ❌ | Custom |\n| State Persistence | ✅ Built-in | ❌ | Custom |\n| Livewire 4 \u0026 3 Native | ✅ | ⚠️ Limited | N/A |\n| History/Back Support | ✅ | ⚠️ Basic | Custom |\n| Progress Tracking | ✅ | ❌ | Custom |\n| Events | ✅ | ❌ | Custom |\n| Learning Curve | Low | Medium | High |\n\n---\n\n## 💬 FAQ\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eDoes this support Livewire v4?\u003c/strong\u003e\u003c/summary\u003e\n\nYes. The package is built and certified for Livewire v4, with full backward compatibility for Livewire v3. All lifecycle hooks and the redirect/navigation API are identical across both versions.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eDo I need to define routes manually?\u003c/strong\u003e\u003c/summary\u003e\n\nNo. Step routes are auto-registered from your DSL. You only need to define the finish route in your regular `routes/web.php`, if not already present.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCan I protect workflows with authentication?\u003c/strong\u003e\u003c/summary\u003e\n\nYes. Add `'auth'` to the `middleware` array in `config/livewire-workflows.php`.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eHow do I skip steps dynamically?\u003c/strong\u003e\u003c/summary\u003e\n\nMake the guard's `passes()` method return `true` when the step should be skipped.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCan workflows share state?\u003c/strong\u003e\u003c/summary\u003e\n\nNo. State is scoped per workflow and per user. This is by design for data isolation.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWhat happens if a user jumps to a step URL directly?\u003c/strong\u003e\u003c/summary\u003e\n\nThe step page loads, but calling `continue()` will re-evaluate guards and redirect appropriately.\n\u003c/details\u003e\n\n---\n\n## 🛠️ Requirements\n\n- PHP 8.3+\n- Laravel 11.x or 12.x\n- Livewire 4.x (3.x also supported)\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for details.\n\n### Development Setup\n\n```bash\ngit clone https://github.com/pixelworxio/livewire-workflows.git\ncd livewire-workflows\ncomposer install\ncomposer test\n```\n\n---\n\n## 📜 License\n\nThe MIT License (MIT). Please see [License File](LICENSE.md) for more information.\n\n---\n\n## 🙏 Credits\n\n- [Whoisthisstud](https://github.com/whoisthisstud)\n\n[//]: # (- [All Contributors]\u0026#40;../../contributors\u0026#41;)\n\nBuilt with ❤️ using [Laravel](https://laravel.com), [Livewire](https://livewire.laravel.com), and [Spatie's Package Tools](https://github.com/spatie/laravel-package-tools).\n\n---\n\n## 🌟 Show Your Support\n\nGive a ⭐️ if this project helped you!\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/pixelworxio/livewire-workflows\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/stars/pixelworxio/livewire-workflows?style=social\" alt=\"GitHub Stars\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://twitter.com/intent/tweet?text=Check%20out%20Livewire%20Workflows%20for%20Laravel!\u0026url=https://github.com/pixelworxio/livewire-workflows\"\u003e\n    \u003cimg src=\"https://img.shields.io/twitter/url?style=social\u0026url=https%3A%2F%2Fgithub.com%2Fpixelworxio%2Flivewire-workflows\" alt=\"Tweet\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpixelworxio%2Flivewire-workflows","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpixelworxio%2Flivewire-workflows","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpixelworxio%2Flivewire-workflows/lists"}