[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-laravel-octane-development":3,"mdc--qjlta6-key":34,"related-repo-laravel-octane-development":885,"related-org-laravel-octane-development":893},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":20,"repoUrl":21,"updatedAt":22,"license":23,"forks":24,"topics":25,"repo":29,"sourceUrl":32,"mdContent":33},"octane-development","develop applications with Laravel Octane","Use this skill when working with Laravel Octane, a long-running PHP worker server (Swoole, FrankenPHP, RoadRunner) where the application boots once and serves many requests instead of rebooting for each request like PHP-FPM. Trigger when installing Octane or starting its server; configuring or detecting the active driver for driver-specific code; using Octane::concurrently(), Octane::table(), the Octane cache, or shared in-memory state across workers; controlling worker memory growth; or testing Octane behavior. Skip plain PHP-FPM applications with no persistent worker.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"laravel","Laravel","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Flaravel.png",[12,16,19],{"name":13,"slug":14,"type":15},"PHP","php","tag",{"name":17,"slug":18,"type":15},"Performance","performance",{"name":9,"slug":8,"type":15},4021,"https:\u002F\u002Fgithub.com\u002Flaravel\u002Foctane","2026-07-16T06:02:20.284131","MIT",343,[8,26,27,28],"octane","roadrunner","swoole",{"repoUrl":21,"stars":20,"forks":24,"topics":30,"description":31},[8,26,27,28],"Supercharge your Laravel application's performance.","https:\u002F\u002Fgithub.com\u002Flaravel\u002Foctane\u002Ftree\u002FHEAD\u002Fresources\u002Fboost\u002Fskills\u002Foctane-development","---\nname: octane-development\ndescription: \"Use this skill when working with Laravel Octane, a long-running PHP worker server (Swoole, FrankenPHP, RoadRunner) where the application boots once and serves many requests instead of rebooting for each request like PHP-FPM. Trigger when installing Octane or starting its server; configuring or detecting the active driver for driver-specific code; using Octane::concurrently(), Octane::table(), the Octane cache, or shared in-memory state across workers; controlling worker memory growth; or testing Octane behavior. Skip plain PHP-FPM applications with no persistent worker.\"\nlicense: MIT\nmetadata:\n  author: laravel\n---\n\n# Laravel Octane\n\nOctane boots the application container once and reuses it across requests in a long-running worker. Follow these rules to avoid Octane-specific bugs caused by PHP-FPM assumptions.\n\nAlways verify against the docs. Octane's APIs, configuration keys, and driver options change between versions. Before giving setup steps, configuration examples, or exact API syntax, call the Laravel Boost `search-docs` tool scoped to the installed `laravel\u002Foctane` version. Treat the rules below as durable patterns, and treat `search-docs` as the source of truth for specifics such as installation commands, Caddyfile and `.rr.yaml` configuration, server flags, and method signatures.\n\n## Detect the Driver First\n\nRead `config('octane.server')` to determine the driver: `swoole`, `roadrunner`, or `frankenphp`. Guard `Octane::concurrently()`, `Octane::table()`, the `octane` cache store, and ticks or intervals behind this check, because they run on Swoole only.\n\n## State Isolation (all drivers)\n\nAvoid storing request-specific state in singletons or static properties. State set during one request can survive into the next, which is the most common source of Octane bugs.\n\n```php\n\u002F\u002F Avoid: holds request 1's user for every later request\n$this->app->singleton(UserContext::class);\n\n\u002F\u002F Prefer: flushed and re-resolved per request\n$this->app->scoped(UserContext::class);\n```\n\n- Scope, lazily resolve, or add to the `flush` list (`config\u002Foctane.php`) any service that holds data derived from `$request`, `Auth::user()`, or another per-request value.\n- Inject `Request` through method parameters or the `request()` helper inside methods. Do not capture it at construction, where it goes stale.\n- Reset any static state you must keep by listening for the `RequestTerminated` event, or list the service in `flush`. Octane already flushes core framework state such as authentication, sessions, and cookies. Your application code is your responsibility.\n\n## Memory (all drivers)\n\nFree what you allocate. Workers are long-lived, so anything left referenced can accumulate until the worker crashes.\n\n- Set a max-requests or max-jobs recycle limit as the last line of defense against leaks.\n- Register event listeners in service providers, never inside request handlers, since the dispatcher keeps every one.\n- Clear static arrays in a lifecycle listener or `flush` the service. Never append to them in request handlers.\n- Watch for singletons that capture large objects (Eloquent models) in closures, since they are held forever.\n\n## Concurrency (Swoole only)\n\nGuard the driver, then run closures in parallel:\n\n```php\n[$users, $orders] = Octane::concurrently([\n    fn () => User::all(),\n    fn () => Order::pending()->get(),\n]);\n```\n\n- Pass scalar IDs and re-fetch models inside the closure. Do not capture `$this` or non-serializable state, because closures are serialized for task workers.\n- Expect results in input order. Catch exceptions inside closures when you need to transform or log the error before Octane rethrows it.\n\n## Swoole Tables and `octane` Cache (Swoole only)\n\n- Pre-size tables at boot (`'name:maxRows'`). You cannot resize them, and exceeding the maximum may fail silently. Treat them as volatile because data is lost on worker restart; do not use them as a Redis or database replacement.\n- Use `incr()` and `decr()` for atomic counters, since there are no transactions.\n- Use the `octane` cache store only for ephemeral, high-frequency data. It uses the same shared memory and is not durable caching.\n\n## Testing (all drivers)\n\n- Test correctness rather than parallelism when exercising `concurrently()`, tables, and ticks without a real server, since closures may run sequentially in tests.\n- Call `$this->refreshApplication()` between assertions to simulate the per-request scoped-binding flush and prove state does not leak.\n- Guard Swoole-specific tests with `extension_loaded('swoole') || extension_loaded('openswoole')` and skip them when neither extension is available.\n\n## Common Pitfalls\n\nThese issues recur when developing applications on Octane. Guard against each one as you write code.\n\n- Avoid resolving `config()`, `app('config')`, or other container services in low-level worker boot code before the application is fully bootstrapped, especially when configuration is not cached. Resolve configuration after the application is booted, and never assume `php artisan config:cache` has run.\n- Never capture `Auth::user()` in a singleton, static property, or custom guard binding. It can leave one user logged in for later requests on the same worker, even after their cookie is cleared. Resolve authentication state per request and add stateful services to the `flush` list. See [State Isolation](#state-isolation-all-drivers).\n- Close per-request Redis, database, and HTTP client connections you open outside the framework's managed pools. Octane does not close them, so they can accumulate until the worker recycles. Reset them in a `RequestTerminated` listener.\n- Do not read PHP superglobals. `$_GET`, `$_POST`, and `$_SERVER` are not reliably populated under workers. Use the `Request` object instead.\n- Do not capture non-serializable values in a `concurrently()` closure. A `PDO` connection, Eloquent model, or `$this` can trigger a serialization error. Pass scalar IDs and re-fetch models inside the closure.\n- Fix PHP warnings emitted during request startup. On FrankenPHP, they can shut down the worker. Resolve the underlying warning rather than suppressing it.\n- Reload workers after changing code, providers, environment variables, or configuration. Workers hold the booted application in memory and pick up changes only after `octane:reload`, a restart, or running with `--watch` in local development.\n\n## References\n\nVerify driver-specific details against the official docs, because versions and configuration keys change:\n\n- Laravel Octane: https:\u002F\u002Flaravel.com\u002Fdocs\u002Foctane\n- FrankenPHP: https:\u002F\u002Ffrankenphp.dev\u002Fdocs\u002F (worker mode: `\u002Fdocs\u002Fworker\u002F`, Laravel: `\u002Fdocs\u002Flaravel\u002F`, config\u002FCaddyfile: `\u002Fdocs\u002Fconfig\u002F`, known issues: `\u002Fdocs\u002Fknown-issues\u002F`)\n- OpenSwoole: https:\u002F\u002Fopenswoole.com\u002Fdocs\n- RoadRunner: https:\u002F\u002Fdocs.roadrunner.dev\u002Fdocs (PHP workers: `\u002Fdocs\u002Fphp-worker\u002Fworker.md`, intro: `\u002Fdocs\u002Fgeneral\u002Fabout.md`)\n\n## Verification\n\n1. Confirm `config('octane.server')` matches the driver assumed by any Swoole-only code.\n2. Confirm no request-derived state lives in a `singleton` or static without `scoped`, `flush`, or a reset.\n3. Confirm a worker recycle limit (`max_requests` or `max_jobs`) is configured.\n",{"data":35,"body":37},{"name":4,"description":6,"license":23,"metadata":36},{"author":8},{"type":38,"children":39},"root",[40,49,55,92,99,156,162,167,225,307,313,318,348,354,359,398,419,432,481,487,529,535,540,699,705,710,809,815,879],{"type":41,"tag":42,"props":43,"children":45},"element","h1",{"id":44},"laravel-octane",[46],{"type":47,"value":48},"text","Laravel Octane",{"type":41,"tag":50,"props":51,"children":52},"p",{},[53],{"type":47,"value":54},"Octane boots the application container once and reuses it across requests in a long-running worker. Follow these rules to avoid Octane-specific bugs caused by PHP-FPM assumptions.",{"type":41,"tag":50,"props":56,"children":57},{},[58,60,67,69,75,77,82,84,90],{"type":47,"value":59},"Always verify against the docs. Octane's APIs, configuration keys, and driver options change between versions. Before giving setup steps, configuration examples, or exact API syntax, call the Laravel Boost ",{"type":41,"tag":61,"props":62,"children":64},"code",{"className":63},[],[65],{"type":47,"value":66},"search-docs",{"type":47,"value":68}," tool scoped to the installed ",{"type":41,"tag":61,"props":70,"children":72},{"className":71},[],[73],{"type":47,"value":74},"laravel\u002Foctane",{"type":47,"value":76}," version. Treat the rules below as durable patterns, and treat ",{"type":41,"tag":61,"props":78,"children":80},{"className":79},[],[81],{"type":47,"value":66},{"type":47,"value":83}," as the source of truth for specifics such as installation commands, Caddyfile and ",{"type":41,"tag":61,"props":85,"children":87},{"className":86},[],[88],{"type":47,"value":89},".rr.yaml",{"type":47,"value":91}," configuration, server flags, and method signatures.",{"type":41,"tag":93,"props":94,"children":96},"h2",{"id":95},"detect-the-driver-first",[97],{"type":47,"value":98},"Detect the Driver First",{"type":41,"tag":50,"props":100,"children":101},{},[102,104,110,112,117,119,124,126,132,134,140,141,147,149,154],{"type":47,"value":103},"Read ",{"type":41,"tag":61,"props":105,"children":107},{"className":106},[],[108],{"type":47,"value":109},"config('octane.server')",{"type":47,"value":111}," to determine the driver: ",{"type":41,"tag":61,"props":113,"children":115},{"className":114},[],[116],{"type":47,"value":28},{"type":47,"value":118},", ",{"type":41,"tag":61,"props":120,"children":122},{"className":121},[],[123],{"type":47,"value":27},{"type":47,"value":125},", or ",{"type":41,"tag":61,"props":127,"children":129},{"className":128},[],[130],{"type":47,"value":131},"frankenphp",{"type":47,"value":133},". Guard ",{"type":41,"tag":61,"props":135,"children":137},{"className":136},[],[138],{"type":47,"value":139},"Octane::concurrently()",{"type":47,"value":118},{"type":41,"tag":61,"props":142,"children":144},{"className":143},[],[145],{"type":47,"value":146},"Octane::table()",{"type":47,"value":148},", the ",{"type":41,"tag":61,"props":150,"children":152},{"className":151},[],[153],{"type":47,"value":26},{"type":47,"value":155}," cache store, and ticks or intervals behind this check, because they run on Swoole only.",{"type":41,"tag":93,"props":157,"children":159},{"id":158},"state-isolation-all-drivers",[160],{"type":47,"value":161},"State Isolation (all drivers)",{"type":41,"tag":50,"props":163,"children":164},{},[165],{"type":47,"value":166},"Avoid storing request-specific state in singletons or static properties. State set during one request can survive into the next, which is the most common source of Octane bugs.",{"type":41,"tag":168,"props":169,"children":173},"pre",{"className":170,"code":171,"language":14,"meta":172,"style":172},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Avoid: holds request 1's user for every later request\n$this->app->singleton(UserContext::class);\n\n\u002F\u002F Prefer: flushed and re-resolved per request\n$this->app->scoped(UserContext::class);\n","",[174],{"type":41,"tag":61,"props":175,"children":176},{"__ignoreMap":172},[177,188,197,207,216],{"type":41,"tag":178,"props":179,"children":182},"span",{"class":180,"line":181},"line",1,[183],{"type":41,"tag":178,"props":184,"children":185},{},[186],{"type":47,"value":187},"\u002F\u002F Avoid: holds request 1's user for every later request\n",{"type":41,"tag":178,"props":189,"children":191},{"class":180,"line":190},2,[192],{"type":41,"tag":178,"props":193,"children":194},{},[195],{"type":47,"value":196},"$this->app->singleton(UserContext::class);\n",{"type":41,"tag":178,"props":198,"children":200},{"class":180,"line":199},3,[201],{"type":41,"tag":178,"props":202,"children":204},{"emptyLinePlaceholder":203},true,[205],{"type":47,"value":206},"\n",{"type":41,"tag":178,"props":208,"children":210},{"class":180,"line":209},4,[211],{"type":41,"tag":178,"props":212,"children":213},{},[214],{"type":47,"value":215},"\u002F\u002F Prefer: flushed and re-resolved per request\n",{"type":41,"tag":178,"props":217,"children":219},{"class":180,"line":218},5,[220],{"type":41,"tag":178,"props":221,"children":222},{},[223],{"type":47,"value":224},"$this->app->scoped(UserContext::class);\n",{"type":41,"tag":226,"props":227,"children":228},"ul",{},[229,266,287],{"type":41,"tag":230,"props":231,"children":232},"li",{},[233,235,241,243,249,251,257,258,264],{"type":47,"value":234},"Scope, lazily resolve, or add to the ",{"type":41,"tag":61,"props":236,"children":238},{"className":237},[],[239],{"type":47,"value":240},"flush",{"type":47,"value":242}," list (",{"type":41,"tag":61,"props":244,"children":246},{"className":245},[],[247],{"type":47,"value":248},"config\u002Foctane.php",{"type":47,"value":250},") any service that holds data derived from ",{"type":41,"tag":61,"props":252,"children":254},{"className":253},[],[255],{"type":47,"value":256},"$request",{"type":47,"value":118},{"type":41,"tag":61,"props":259,"children":261},{"className":260},[],[262],{"type":47,"value":263},"Auth::user()",{"type":47,"value":265},", or another per-request value.",{"type":41,"tag":230,"props":267,"children":268},{},[269,271,277,279,285],{"type":47,"value":270},"Inject ",{"type":41,"tag":61,"props":272,"children":274},{"className":273},[],[275],{"type":47,"value":276},"Request",{"type":47,"value":278}," through method parameters or the ",{"type":41,"tag":61,"props":280,"children":282},{"className":281},[],[283],{"type":47,"value":284},"request()",{"type":47,"value":286}," helper inside methods. Do not capture it at construction, where it goes stale.",{"type":41,"tag":230,"props":288,"children":289},{},[290,292,298,300,305],{"type":47,"value":291},"Reset any static state you must keep by listening for the ",{"type":41,"tag":61,"props":293,"children":295},{"className":294},[],[296],{"type":47,"value":297},"RequestTerminated",{"type":47,"value":299}," event, or list the service in ",{"type":41,"tag":61,"props":301,"children":303},{"className":302},[],[304],{"type":47,"value":240},{"type":47,"value":306},". Octane already flushes core framework state such as authentication, sessions, and cookies. Your application code is your responsibility.",{"type":41,"tag":93,"props":308,"children":310},{"id":309},"memory-all-drivers",[311],{"type":47,"value":312},"Memory (all drivers)",{"type":41,"tag":50,"props":314,"children":315},{},[316],{"type":47,"value":317},"Free what you allocate. Workers are long-lived, so anything left referenced can accumulate until the worker crashes.",{"type":41,"tag":226,"props":319,"children":320},{},[321,326,331,343],{"type":41,"tag":230,"props":322,"children":323},{},[324],{"type":47,"value":325},"Set a max-requests or max-jobs recycle limit as the last line of defense against leaks.",{"type":41,"tag":230,"props":327,"children":328},{},[329],{"type":47,"value":330},"Register event listeners in service providers, never inside request handlers, since the dispatcher keeps every one.",{"type":41,"tag":230,"props":332,"children":333},{},[334,336,341],{"type":47,"value":335},"Clear static arrays in a lifecycle listener or ",{"type":41,"tag":61,"props":337,"children":339},{"className":338},[],[340],{"type":47,"value":240},{"type":47,"value":342}," the service. Never append to them in request handlers.",{"type":41,"tag":230,"props":344,"children":345},{},[346],{"type":47,"value":347},"Watch for singletons that capture large objects (Eloquent models) in closures, since they are held forever.",{"type":41,"tag":93,"props":349,"children":351},{"id":350},"concurrency-swoole-only",[352],{"type":47,"value":353},"Concurrency (Swoole only)",{"type":41,"tag":50,"props":355,"children":356},{},[357],{"type":47,"value":358},"Guard the driver, then run closures in parallel:",{"type":41,"tag":168,"props":360,"children":362},{"className":170,"code":361,"language":14,"meta":172,"style":172},"[$users, $orders] = Octane::concurrently([\n    fn () => User::all(),\n    fn () => Order::pending()->get(),\n]);\n",[363],{"type":41,"tag":61,"props":364,"children":365},{"__ignoreMap":172},[366,374,382,390],{"type":41,"tag":178,"props":367,"children":368},{"class":180,"line":181},[369],{"type":41,"tag":178,"props":370,"children":371},{},[372],{"type":47,"value":373},"[$users, $orders] = Octane::concurrently([\n",{"type":41,"tag":178,"props":375,"children":376},{"class":180,"line":190},[377],{"type":41,"tag":178,"props":378,"children":379},{},[380],{"type":47,"value":381},"    fn () => User::all(),\n",{"type":41,"tag":178,"props":383,"children":384},{"class":180,"line":199},[385],{"type":41,"tag":178,"props":386,"children":387},{},[388],{"type":47,"value":389},"    fn () => Order::pending()->get(),\n",{"type":41,"tag":178,"props":391,"children":392},{"class":180,"line":209},[393],{"type":41,"tag":178,"props":394,"children":395},{},[396],{"type":47,"value":397},"]);\n",{"type":41,"tag":226,"props":399,"children":400},{},[401,414],{"type":41,"tag":230,"props":402,"children":403},{},[404,406,412],{"type":47,"value":405},"Pass scalar IDs and re-fetch models inside the closure. Do not capture ",{"type":41,"tag":61,"props":407,"children":409},{"className":408},[],[410],{"type":47,"value":411},"$this",{"type":47,"value":413}," or non-serializable state, because closures are serialized for task workers.",{"type":41,"tag":230,"props":415,"children":416},{},[417],{"type":47,"value":418},"Expect results in input order. Catch exceptions inside closures when you need to transform or log the error before Octane rethrows it.",{"type":41,"tag":93,"props":420,"children":422},{"id":421},"swoole-tables-and-octane-cache-swoole-only",[423,425,430],{"type":47,"value":424},"Swoole Tables and ",{"type":41,"tag":61,"props":426,"children":428},{"className":427},[],[429],{"type":47,"value":26},{"type":47,"value":431}," Cache (Swoole only)",{"type":41,"tag":226,"props":433,"children":434},{},[435,448,469],{"type":41,"tag":230,"props":436,"children":437},{},[438,440,446],{"type":47,"value":439},"Pre-size tables at boot (",{"type":41,"tag":61,"props":441,"children":443},{"className":442},[],[444],{"type":47,"value":445},"'name:maxRows'",{"type":47,"value":447},"). You cannot resize them, and exceeding the maximum may fail silently. Treat them as volatile because data is lost on worker restart; do not use them as a Redis or database replacement.",{"type":41,"tag":230,"props":449,"children":450},{},[451,453,459,461,467],{"type":47,"value":452},"Use ",{"type":41,"tag":61,"props":454,"children":456},{"className":455},[],[457],{"type":47,"value":458},"incr()",{"type":47,"value":460}," and ",{"type":41,"tag":61,"props":462,"children":464},{"className":463},[],[465],{"type":47,"value":466},"decr()",{"type":47,"value":468}," for atomic counters, since there are no transactions.",{"type":41,"tag":230,"props":470,"children":471},{},[472,474,479],{"type":47,"value":473},"Use the ",{"type":41,"tag":61,"props":475,"children":477},{"className":476},[],[478],{"type":47,"value":26},{"type":47,"value":480}," cache store only for ephemeral, high-frequency data. It uses the same shared memory and is not durable caching.",{"type":41,"tag":93,"props":482,"children":484},{"id":483},"testing-all-drivers",[485],{"type":47,"value":486},"Testing (all drivers)",{"type":41,"tag":226,"props":488,"children":489},{},[490,503,516],{"type":41,"tag":230,"props":491,"children":492},{},[493,495,501],{"type":47,"value":494},"Test correctness rather than parallelism when exercising ",{"type":41,"tag":61,"props":496,"children":498},{"className":497},[],[499],{"type":47,"value":500},"concurrently()",{"type":47,"value":502},", tables, and ticks without a real server, since closures may run sequentially in tests.",{"type":41,"tag":230,"props":504,"children":505},{},[506,508,514],{"type":47,"value":507},"Call ",{"type":41,"tag":61,"props":509,"children":511},{"className":510},[],[512],{"type":47,"value":513},"$this->refreshApplication()",{"type":47,"value":515}," between assertions to simulate the per-request scoped-binding flush and prove state does not leak.",{"type":41,"tag":230,"props":517,"children":518},{},[519,521,527],{"type":47,"value":520},"Guard Swoole-specific tests with ",{"type":41,"tag":61,"props":522,"children":524},{"className":523},[],[525],{"type":47,"value":526},"extension_loaded('swoole') || extension_loaded('openswoole')",{"type":47,"value":528}," and skip them when neither extension is available.",{"type":41,"tag":93,"props":530,"children":532},{"id":531},"common-pitfalls",[533],{"type":47,"value":534},"Common Pitfalls",{"type":41,"tag":50,"props":536,"children":537},{},[538],{"type":47,"value":539},"These issues recur when developing applications on Octane. Guard against each one as you write code.",{"type":41,"tag":226,"props":541,"children":542},{},[543,571,599,611,646,673,678],{"type":41,"tag":230,"props":544,"children":545},{},[546,548,554,555,561,563,569],{"type":47,"value":547},"Avoid resolving ",{"type":41,"tag":61,"props":549,"children":551},{"className":550},[],[552],{"type":47,"value":553},"config()",{"type":47,"value":118},{"type":41,"tag":61,"props":556,"children":558},{"className":557},[],[559],{"type":47,"value":560},"app('config')",{"type":47,"value":562},", or other container services in low-level worker boot code before the application is fully bootstrapped, especially when configuration is not cached. Resolve configuration after the application is booted, and never assume ",{"type":41,"tag":61,"props":564,"children":566},{"className":565},[],[567],{"type":47,"value":568},"php artisan config:cache",{"type":47,"value":570}," has run.",{"type":41,"tag":230,"props":572,"children":573},{},[574,576,581,583,588,590,597],{"type":47,"value":575},"Never capture ",{"type":41,"tag":61,"props":577,"children":579},{"className":578},[],[580],{"type":47,"value":263},{"type":47,"value":582}," in a singleton, static property, or custom guard binding. It can leave one user logged in for later requests on the same worker, even after their cookie is cleared. Resolve authentication state per request and add stateful services to the ",{"type":41,"tag":61,"props":584,"children":586},{"className":585},[],[587],{"type":47,"value":240},{"type":47,"value":589}," list. See ",{"type":41,"tag":591,"props":592,"children":594},"a",{"href":593},"#state-isolation-all-drivers",[595],{"type":47,"value":596},"State Isolation",{"type":47,"value":598},".",{"type":41,"tag":230,"props":600,"children":601},{},[602,604,609],{"type":47,"value":603},"Close per-request Redis, database, and HTTP client connections you open outside the framework's managed pools. Octane does not close them, so they can accumulate until the worker recycles. Reset them in a ",{"type":41,"tag":61,"props":605,"children":607},{"className":606},[],[608],{"type":47,"value":297},{"type":47,"value":610}," listener.",{"type":41,"tag":230,"props":612,"children":613},{},[614,616,622,623,629,631,637,639,644],{"type":47,"value":615},"Do not read PHP superglobals. ",{"type":41,"tag":61,"props":617,"children":619},{"className":618},[],[620],{"type":47,"value":621},"$_GET",{"type":47,"value":118},{"type":41,"tag":61,"props":624,"children":626},{"className":625},[],[627],{"type":47,"value":628},"$_POST",{"type":47,"value":630},", and ",{"type":41,"tag":61,"props":632,"children":634},{"className":633},[],[635],{"type":47,"value":636},"$_SERVER",{"type":47,"value":638}," are not reliably populated under workers. Use the ",{"type":41,"tag":61,"props":640,"children":642},{"className":641},[],[643],{"type":47,"value":276},{"type":47,"value":645}," object instead.",{"type":41,"tag":230,"props":647,"children":648},{},[649,651,656,658,664,666,671],{"type":47,"value":650},"Do not capture non-serializable values in a ",{"type":41,"tag":61,"props":652,"children":654},{"className":653},[],[655],{"type":47,"value":500},{"type":47,"value":657}," closure. A ",{"type":41,"tag":61,"props":659,"children":661},{"className":660},[],[662],{"type":47,"value":663},"PDO",{"type":47,"value":665}," connection, Eloquent model, or ",{"type":41,"tag":61,"props":667,"children":669},{"className":668},[],[670],{"type":47,"value":411},{"type":47,"value":672}," can trigger a serialization error. Pass scalar IDs and re-fetch models inside the closure.",{"type":41,"tag":230,"props":674,"children":675},{},[676],{"type":47,"value":677},"Fix PHP warnings emitted during request startup. On FrankenPHP, they can shut down the worker. Resolve the underlying warning rather than suppressing it.",{"type":41,"tag":230,"props":679,"children":680},{},[681,683,689,691,697],{"type":47,"value":682},"Reload workers after changing code, providers, environment variables, or configuration. Workers hold the booted application in memory and pick up changes only after ",{"type":41,"tag":61,"props":684,"children":686},{"className":685},[],[687],{"type":47,"value":688},"octane:reload",{"type":47,"value":690},", a restart, or running with ",{"type":41,"tag":61,"props":692,"children":694},{"className":693},[],[695],{"type":47,"value":696},"--watch",{"type":47,"value":698}," in local development.",{"type":41,"tag":93,"props":700,"children":702},{"id":701},"references",[703],{"type":47,"value":704},"References",{"type":41,"tag":50,"props":706,"children":707},{},[708],{"type":47,"value":709},"Verify driver-specific details against the official docs, because versions and configuration keys change:",{"type":41,"tag":226,"props":711,"children":712},{},[713,725,770,781],{"type":41,"tag":230,"props":714,"children":715},{},[716,718],{"type":47,"value":717},"Laravel Octane: ",{"type":41,"tag":591,"props":719,"children":723},{"href":720,"rel":721},"https:\u002F\u002Flaravel.com\u002Fdocs\u002Foctane",[722],"nofollow",[724],{"type":47,"value":720},{"type":41,"tag":230,"props":726,"children":727},{},[728,730,736,738,744,746,752,754,760,762,768],{"type":47,"value":729},"FrankenPHP: ",{"type":41,"tag":591,"props":731,"children":734},{"href":732,"rel":733},"https:\u002F\u002Ffrankenphp.dev\u002Fdocs\u002F",[722],[735],{"type":47,"value":732},{"type":47,"value":737}," (worker mode: ",{"type":41,"tag":61,"props":739,"children":741},{"className":740},[],[742],{"type":47,"value":743},"\u002Fdocs\u002Fworker\u002F",{"type":47,"value":745},", Laravel: ",{"type":41,"tag":61,"props":747,"children":749},{"className":748},[],[750],{"type":47,"value":751},"\u002Fdocs\u002Flaravel\u002F",{"type":47,"value":753},", config\u002FCaddyfile: ",{"type":41,"tag":61,"props":755,"children":757},{"className":756},[],[758],{"type":47,"value":759},"\u002Fdocs\u002Fconfig\u002F",{"type":47,"value":761},", known issues: ",{"type":41,"tag":61,"props":763,"children":765},{"className":764},[],[766],{"type":47,"value":767},"\u002Fdocs\u002Fknown-issues\u002F",{"type":47,"value":769},")",{"type":41,"tag":230,"props":771,"children":772},{},[773,775],{"type":47,"value":774},"OpenSwoole: ",{"type":41,"tag":591,"props":776,"children":779},{"href":777,"rel":778},"https:\u002F\u002Fopenswoole.com\u002Fdocs",[722],[780],{"type":47,"value":777},{"type":41,"tag":230,"props":782,"children":783},{},[784,786,792,794,800,802,808],{"type":47,"value":785},"RoadRunner: ",{"type":41,"tag":591,"props":787,"children":790},{"href":788,"rel":789},"https:\u002F\u002Fdocs.roadrunner.dev\u002Fdocs",[722],[791],{"type":47,"value":788},{"type":47,"value":793}," (PHP workers: ",{"type":41,"tag":61,"props":795,"children":797},{"className":796},[],[798],{"type":47,"value":799},"\u002Fdocs\u002Fphp-worker\u002Fworker.md",{"type":47,"value":801},", intro: ",{"type":41,"tag":61,"props":803,"children":805},{"className":804},[],[806],{"type":47,"value":807},"\u002Fdocs\u002Fgeneral\u002Fabout.md",{"type":47,"value":769},{"type":41,"tag":93,"props":810,"children":812},{"id":811},"verification",[813],{"type":47,"value":814},"Verification",{"type":41,"tag":816,"props":817,"children":818},"ol",{},[819,831,858],{"type":41,"tag":230,"props":820,"children":821},{},[822,824,829],{"type":47,"value":823},"Confirm ",{"type":41,"tag":61,"props":825,"children":827},{"className":826},[],[828],{"type":47,"value":109},{"type":47,"value":830}," matches the driver assumed by any Swoole-only code.",{"type":41,"tag":230,"props":832,"children":833},{},[834,836,842,844,850,851,856],{"type":47,"value":835},"Confirm no request-derived state lives in a ",{"type":41,"tag":61,"props":837,"children":839},{"className":838},[],[840],{"type":47,"value":841},"singleton",{"type":47,"value":843}," or static without ",{"type":41,"tag":61,"props":845,"children":847},{"className":846},[],[848],{"type":47,"value":849},"scoped",{"type":47,"value":118},{"type":41,"tag":61,"props":852,"children":854},{"className":853},[],[855],{"type":47,"value":240},{"type":47,"value":857},", or a reset.",{"type":41,"tag":230,"props":859,"children":860},{},[861,863,869,871,877],{"type":47,"value":862},"Confirm a worker recycle limit (",{"type":41,"tag":61,"props":864,"children":866},{"className":865},[],[867],{"type":47,"value":868},"max_requests",{"type":47,"value":870}," or ",{"type":41,"tag":61,"props":872,"children":874},{"className":873},[],[875],{"type":47,"value":876},"max_jobs",{"type":47,"value":878},") is configured.",{"type":41,"tag":880,"props":881,"children":882},"style",{},[883],{"type":47,"value":884},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":886,"total":181},[887],{"slug":4,"name":4,"fn":5,"description":6,"org":888,"tags":889,"stars":20,"repoUrl":21,"updatedAt":22},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[890,891,892],{"name":9,"slug":8,"type":15},{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"items":894,"total":1026},[895,912,918,933,950,967,979,993,1010],{"slug":896,"name":896,"fn":897,"description":898,"org":899,"tags":900,"stars":909,"repoUrl":910,"updatedAt":911},"socialite-development","integrate OAuth social authentication","Manages OAuth social authentication with Laravel Socialite. Activate when adding social login providers; configuring OAuth redirect\u002Fcallback flows; retrieving authenticated user details; customizing scopes or parameters; setting up community providers; testing with Socialite fakes; or when the user mentions social login, OAuth, Socialite, or third-party authentication.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[901,904,905,908],{"name":902,"slug":903,"type":15},"Auth","auth",{"name":9,"slug":8,"type":15},{"name":906,"slug":907,"type":15},"OAuth","oauth",{"name":13,"slug":14,"type":15},5745,"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fsocialite","2026-07-13T06:22:10.648812",{"slug":4,"name":4,"fn":5,"description":6,"org":913,"tags":914,"stars":20,"repoUrl":21,"updatedAt":22},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[915,916,917],{"name":9,"slug":8,"type":15},{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"slug":919,"name":919,"fn":920,"description":921,"org":922,"tags":923,"stars":930,"repoUrl":931,"updatedAt":932},"fortify-development","implement authentication with Laravel Fortify","ACTIVATE when the user works on authentication in Laravel. This includes login, registration, password reset, email verification, two-factor authentication (2FA\u002FTOTP\u002FQR codes\u002Frecovery codes), passkeys, profile updates, password confirmation, or any auth-related routes and controllers. Activate when the user mentions Fortify, auth, authentication, login, register, signup, forgot password, verify email, 2FA, passkeys, WebAuthn, or references app\u002FActions\u002FFortify\u002F, CreateNewUser, UpdateUserProfileInformation, FortifyServiceProvider, config\u002Ffortify.php, or auth guards. Fortify is the frontend-agnostic authentication backend for Laravel that registers all auth routes and controllers. Also activate when building SPA or headless authentication, customizing login redirects, overriding response contracts like LoginResponse, or configuring login throttling. Do NOT activate for Laravel Passport (OAuth2 API tokens), Socialite (OAuth social login), or non-auth Laravel features.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[924,927,928,929],{"name":925,"slug":926,"type":15},"2FA","2fa",{"name":902,"slug":903,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},1746,"https:\u002F\u002Fgithub.com\u002Flaravel\u002Ffortify","2026-07-13T06:22:28.612049",{"slug":934,"name":934,"fn":935,"description":936,"org":937,"tags":938,"stars":947,"repoUrl":948,"updatedAt":949},"ai-sdk-development","build AI agents with Laravel AI SDK","TRIGGER when working with ai-sdk which is Laravel official first-party AI SDK. Activate when building, editing AI agents, chatbots, text generation, image generation, audio\u002FTTS, transcription\u002FSTT, embeddings, RAG, vector stores, reranking, structured output, streaming, conversation memory, tools, queueing, broadcasting, and provider failover across OpenAI, Anthropic, Gemini, Azure, Groq, xAI, DeepSeek, Mistral, Ollama, ElevenLabs, Cohere, Jina, and VoyageAI. Invoke when the user references ai-sdk, the `Laravel\\Ai\\` namespace, or this project's AI features — not for other AI packages used directly.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[939,942,945,946],{"name":940,"slug":941,"type":15},"Agents","agents",{"name":943,"slug":944,"type":15},"AI SDK","ai-sdk",{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},1040,"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fai","2026-07-13T06:22:24.770526",{"slug":951,"name":951,"fn":952,"description":953,"org":954,"tags":955,"stars":964,"repoUrl":965,"updatedAt":966},"deploying-laravel-cloud","deploy Laravel applications to Laravel Cloud","Deploys and manages Laravel applications on Laravel Cloud using the `cloud` CLI. Use when the user wants to deploy an app, ship to cloud, create\u002Fmanage environments, databases, caches, domains, instances, background processes, check billing\u002Fusage\u002Fspend, or any Laravel Cloud infrastructure. Triggers on deploy, ship, cloud management, environment setup, database provisioning, billing\u002Fusage queries, and similar cloud operations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[956,959,962,963],{"name":957,"slug":958,"type":15},"CLI","cli",{"name":960,"slug":961,"type":15},"Deployment","deployment",{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},665,"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fagent-skills","2026-07-13T06:22:18.36234",{"slug":968,"name":968,"fn":969,"description":970,"org":971,"tags":972,"stars":964,"repoUrl":965,"updatedAt":978},"starter-kit-upgrade","upgrade Laravel starter kit projects","Selectively pull upstream improvements from a Laravel starter kit (laravel\u002Fvue-starter-kit, laravel\u002Freact-starter-kit, laravel\u002Fsvelte-starter-kit, laravel\u002Flivewire-starter-kit) into a project bootstrapped from one. Use when the user wants to update, sync, or migrate features from their starter kit. Applies one feature at a time on a dedicated branch; never auto-merges customized files.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[973,974,977],{"name":9,"slug":8,"type":15},{"name":975,"slug":976,"type":15},"Maintenance","maintenance",{"name":13,"slug":14,"type":15},"2026-07-13T06:22:11.972952",{"slug":980,"name":980,"fn":981,"description":982,"org":983,"tags":984,"stars":990,"repoUrl":991,"updatedAt":992},"pennant-development","manage feature flags with Laravel Pennant","Use when working with Laravel Pennant the official Laravel feature flag package. Trigger whenever the query mentions Pennant by name or involves feature flags or feature toggles in a Laravel project. Tasks include defining feature flags checking whether features are active creating class based features in `app\u002FFeatures` using Blade `@feature` directives scoping flags to users or teams building custom Pennant storage drivers protecting routes with feature flags testing feature flags with Pest or PHPUnit and implementing A B testing or gradual rollouts with feature flags. Do not trigger for generic Laravel configuration authorization policies authentication or non Pennant feature management systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[985,988,989],{"name":986,"slug":987,"type":15},"Feature Flags","feature-flags",{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},585,"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fpennant","2026-07-13T06:22:26.043758",{"slug":994,"name":994,"fn":995,"description":996,"org":997,"tags":998,"stars":1007,"repoUrl":1008,"updatedAt":1009},"configure-nightwatch","configure Laravel Nightwatch data collection","Configures Laravel Nightwatch data collection, sampling rates, filtering rules, and redaction policies. Use when setting up Nightwatch, managing data volume, protecting sensitive data (PII), or optimizing event collection for production workloads.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[999,1002,1003,1006],{"name":1000,"slug":1001,"type":15},"Configuration","configuration",{"name":9,"slug":8,"type":15},{"name":1004,"slug":1005,"type":15},"Observability","observability",{"name":13,"slug":14,"type":15},368,"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fnightwatch","2026-07-13T06:22:29.945491",{"slug":1011,"name":1011,"fn":995,"description":1012,"org":1013,"tags":1014,"stars":1023,"repoUrl":1024,"updatedAt":1025},"nightwatch-configure","Configure Laravel Nightwatch data collection, sampling rates, filtering rules, and redaction policies. Use this when setting up Nightwatch, managing data volume, protecting sensitive data (PII), or optimizing event collection for production workloads.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1015,1016,1017,1020],{"name":1000,"slug":1001,"type":15},{"name":9,"slug":8,"type":15},{"name":1018,"slug":1019,"type":15},"Monitoring","monitoring",{"name":1021,"slug":1022,"type":15},"Privacy","privacy",0,"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fnightwatch-cursor-plugin","2026-07-16T06:02:16.946147",9]