[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-laravel-socialite-development":3,"mdc-23j1w5-key":34,"related-org-laravel-socialite-development":903,"related-repo-laravel-socialite-development":1035},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"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},"laravel","Laravel","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Flaravel.png",[12,16,19,20],{"name":13,"slug":14,"type":15},"PHP","php","tag",{"name":17,"slug":18,"type":15},"Auth","auth",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"OAuth","oauth",5745,"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fsocialite","2026-07-13T06:22:10.648812","MIT",956,[8,22],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[8,22],"Laravel wrapper around OAuth 1 & OAuth 2 libraries.","https:\u002F\u002Fgithub.com\u002Flaravel\u002Fsocialite\u002Ftree\u002FHEAD\u002Fresources\u002Fboost\u002Fskills\u002Fsocialite-development","---\nname: socialite-development\ndescription: \"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.\"\nlicense: MIT\nmetadata:\n  author: laravel\n---\n\n# Socialite Authentication\n\n## Documentation\n\nUse `search-docs` for detailed Socialite patterns and documentation (installation, configuration, routing, callbacks, testing, scopes, stateless auth).\n\n## Available Providers\n\nBuilt-in: `facebook`, `twitter`, `twitter-oauth-2`, `linkedin`, `linkedin-openid`, `google`, `github`, `gitlab`, `bitbucket`, `slack`, `slack-openid`, `twitch`\n\nCommunity: 150+ additional providers at [socialiteproviders.com](https:\u002F\u002Fsocialiteproviders.com). For provider-specific setup, use `WebFetch` on `https:\u002F\u002Fsocialiteproviders.com\u002F{provider-name}`.\n\nConfiguration key in `config\u002Fservices.php` must match the driver name exactly — note the hyphenated keys: `twitter-oauth-2`, `linkedin-openid`, `slack-openid`.\n\nTwitter\u002FX: Use `twitter-oauth-2` (OAuth 2.0) for new projects. The legacy `twitter` driver is OAuth 1.0. Driver names remain unchanged despite the platform rebrand.\n\nCommunity providers differ from built-in providers in the following ways:\n- Installed via `composer require socialiteproviders\u002F{name}`\n- Must register via event listener — NOT auto-discovered like built-in providers\n- Use `search-docs` for the registration pattern\n\n## Adding a Provider\n\n### 1. Configure the provider\n\nAdd the provider's `client_id`, `client_secret`, and `redirect` to `config\u002Fservices.php`. The config key must match the driver name exactly.\n\n### 2. Create redirect and callback routes\n\nTwo routes are needed: one that calls `Socialite::driver('provider')->redirect()` to send the user to the OAuth provider, and one that calls `Socialite::driver('provider')->user()` to receive the callback and retrieve user details.\n\n### 3. Authenticate and store the user\n\nIn the callback, use `updateOrCreate` to find or create a user record from the provider's response (`id`, `name`, `email`, `token`, `refreshToken`), then call `Auth::login()`.\n\n### 4. Customize the redirect (optional)\n\n- `scopes()` — merge additional scopes with the provider's defaults\n- `setScopes()` — replace all scopes entirely\n- `with()` — pass optional parameters (e.g., `['hd' => 'example.com']` for Google)\n- `asBotUser()` — Slack only; generates a bot token (`xoxb-`) instead of a user token (`xoxp-`). Must be called before both `redirect()` and `user()`. Only the `token` property will be hydrated on the user object.\n- `stateless()` — for API\u002FSPA contexts where session state is not maintained\n\n### 5. Verify\n\n1. Config key matches driver name exactly (check the list above for hyphenated names)\n2. `client_id`, `client_secret`, and `redirect` are all present\n3. Redirect URL matches what is registered in the provider's OAuth dashboard\n4. Callback route handles denied grants (when user declines authorization)\n\nUse `search-docs` for complete code examples of each step.\n\n## Additional Features\n\nUse `search-docs` for usage details on: `enablePKCE()`, `userFromToken($token)`, `userFromTokenAndSecret($token, $secret)` (OAuth 1.0), retrieving user details.\n\nUser object: `getId()`, `getName()`, `getEmail()`, `getAvatar()`, `getNickname()`, `token`, `refreshToken`, `expiresIn`, `approvedScopes`\n\n## Testing\n\nSocialite provides `Socialite::fake()` for testing redirects and callbacks. Use `search-docs` for faking redirects, callback user data, custom token properties, and assertion methods.\n\n## Common Pitfalls\n\n- Config key must match driver name exactly — hyphenated drivers need hyphenated keys (`linkedin-openid`, `slack-openid`, `twitter-oauth-2`). Mismatch silently fails.\n- Every provider needs `client_id`, `client_secret`, and `redirect` in `config\u002Fservices.php`. Missing any one causes cryptic errors.\n- `scopes()` merges with defaults; `setScopes()` replaces all scopes entirely.\n- Missing `stateless()` in API\u002FSPA contexts causes `InvalidStateException`.\n- Redirect URL in `config\u002Fservices.php` must exactly match the provider's OAuth dashboard (including trailing slashes and protocol).\n- Do not pass `state`, `response_type`, `client_id`, `redirect_uri`, or `scope` via `with()` — these are reserved.\n- Community providers require event listener registration via `SocialiteWasCalled`.\n- `user()` throws when the user declines authorization. Always handle denied grants.\n",{"data":35,"body":37},{"name":4,"description":6,"license":26,"metadata":36},{"author":8},{"type":38,"children":39},"root",[40,49,56,71,77,166,198,229,248,253,285,291,298,333,339,360,366,422,428,533,539,580,591,597,630,695,701,721,727],{"type":41,"tag":42,"props":43,"children":45},"element","h1",{"id":44},"socialite-authentication",[46],{"type":47,"value":48},"text","Socialite Authentication",{"type":41,"tag":50,"props":51,"children":53},"h2",{"id":52},"documentation",[54],{"type":47,"value":55},"Documentation",{"type":41,"tag":57,"props":58,"children":59},"p",{},[60,62,69],{"type":47,"value":61},"Use ",{"type":41,"tag":63,"props":64,"children":66},"code",{"className":65},[],[67],{"type":47,"value":68},"search-docs",{"type":47,"value":70}," for detailed Socialite patterns and documentation (installation, configuration, routing, callbacks, testing, scopes, stateless auth).",{"type":41,"tag":50,"props":72,"children":74},{"id":73},"available-providers",[75],{"type":47,"value":76},"Available Providers",{"type":41,"tag":57,"props":78,"children":79},{},[80,82,88,90,96,97,103,104,110,111,117,118,124,125,131,132,138,139,145,146,152,153,159,160],{"type":47,"value":81},"Built-in: ",{"type":41,"tag":63,"props":83,"children":85},{"className":84},[],[86],{"type":47,"value":87},"facebook",{"type":47,"value":89},", ",{"type":41,"tag":63,"props":91,"children":93},{"className":92},[],[94],{"type":47,"value":95},"twitter",{"type":47,"value":89},{"type":41,"tag":63,"props":98,"children":100},{"className":99},[],[101],{"type":47,"value":102},"twitter-oauth-2",{"type":47,"value":89},{"type":41,"tag":63,"props":105,"children":107},{"className":106},[],[108],{"type":47,"value":109},"linkedin",{"type":47,"value":89},{"type":41,"tag":63,"props":112,"children":114},{"className":113},[],[115],{"type":47,"value":116},"linkedin-openid",{"type":47,"value":89},{"type":41,"tag":63,"props":119,"children":121},{"className":120},[],[122],{"type":47,"value":123},"google",{"type":47,"value":89},{"type":41,"tag":63,"props":126,"children":128},{"className":127},[],[129],{"type":47,"value":130},"github",{"type":47,"value":89},{"type":41,"tag":63,"props":133,"children":135},{"className":134},[],[136],{"type":47,"value":137},"gitlab",{"type":47,"value":89},{"type":41,"tag":63,"props":140,"children":142},{"className":141},[],[143],{"type":47,"value":144},"bitbucket",{"type":47,"value":89},{"type":41,"tag":63,"props":147,"children":149},{"className":148},[],[150],{"type":47,"value":151},"slack",{"type":47,"value":89},{"type":41,"tag":63,"props":154,"children":156},{"className":155},[],[157],{"type":47,"value":158},"slack-openid",{"type":47,"value":89},{"type":41,"tag":63,"props":161,"children":163},{"className":162},[],[164],{"type":47,"value":165},"twitch",{"type":41,"tag":57,"props":167,"children":168},{},[169,171,180,182,188,190,196],{"type":47,"value":170},"Community: 150+ additional providers at ",{"type":41,"tag":172,"props":173,"children":177},"a",{"href":174,"rel":175},"https:\u002F\u002Fsocialiteproviders.com",[176],"nofollow",[178],{"type":47,"value":179},"socialiteproviders.com",{"type":47,"value":181},". For provider-specific setup, use ",{"type":41,"tag":63,"props":183,"children":185},{"className":184},[],[186],{"type":47,"value":187},"WebFetch",{"type":47,"value":189}," on ",{"type":41,"tag":63,"props":191,"children":193},{"className":192},[],[194],{"type":47,"value":195},"https:\u002F\u002Fsocialiteproviders.com\u002F{provider-name}",{"type":47,"value":197},".",{"type":41,"tag":57,"props":199,"children":200},{},[201,203,209,211,216,217,222,223,228],{"type":47,"value":202},"Configuration key in ",{"type":41,"tag":63,"props":204,"children":206},{"className":205},[],[207],{"type":47,"value":208},"config\u002Fservices.php",{"type":47,"value":210}," must match the driver name exactly — note the hyphenated keys: ",{"type":41,"tag":63,"props":212,"children":214},{"className":213},[],[215],{"type":47,"value":102},{"type":47,"value":89},{"type":41,"tag":63,"props":218,"children":220},{"className":219},[],[221],{"type":47,"value":116},{"type":47,"value":89},{"type":41,"tag":63,"props":224,"children":226},{"className":225},[],[227],{"type":47,"value":158},{"type":47,"value":197},{"type":41,"tag":57,"props":230,"children":231},{},[232,234,239,241,246],{"type":47,"value":233},"Twitter\u002FX: Use ",{"type":41,"tag":63,"props":235,"children":237},{"className":236},[],[238],{"type":47,"value":102},{"type":47,"value":240}," (OAuth 2.0) for new projects. The legacy ",{"type":41,"tag":63,"props":242,"children":244},{"className":243},[],[245],{"type":47,"value":95},{"type":47,"value":247}," driver is OAuth 1.0. Driver names remain unchanged despite the platform rebrand.",{"type":41,"tag":57,"props":249,"children":250},{},[251],{"type":47,"value":252},"Community providers differ from built-in providers in the following ways:",{"type":41,"tag":254,"props":255,"children":256},"ul",{},[257,269,274],{"type":41,"tag":258,"props":259,"children":260},"li",{},[261,263],{"type":47,"value":262},"Installed via ",{"type":41,"tag":63,"props":264,"children":266},{"className":265},[],[267],{"type":47,"value":268},"composer require socialiteproviders\u002F{name}",{"type":41,"tag":258,"props":270,"children":271},{},[272],{"type":47,"value":273},"Must register via event listener — NOT auto-discovered like built-in providers",{"type":41,"tag":258,"props":275,"children":276},{},[277,278,283],{"type":47,"value":61},{"type":41,"tag":63,"props":279,"children":281},{"className":280},[],[282],{"type":47,"value":68},{"type":47,"value":284}," for the registration pattern",{"type":41,"tag":50,"props":286,"children":288},{"id":287},"adding-a-provider",[289],{"type":47,"value":290},"Adding a Provider",{"type":41,"tag":292,"props":293,"children":295},"h3",{"id":294},"_1-configure-the-provider",[296],{"type":47,"value":297},"1. Configure the provider",{"type":41,"tag":57,"props":299,"children":300},{},[301,303,309,310,316,318,324,326,331],{"type":47,"value":302},"Add the provider's ",{"type":41,"tag":63,"props":304,"children":306},{"className":305},[],[307],{"type":47,"value":308},"client_id",{"type":47,"value":89},{"type":41,"tag":63,"props":311,"children":313},{"className":312},[],[314],{"type":47,"value":315},"client_secret",{"type":47,"value":317},", and ",{"type":41,"tag":63,"props":319,"children":321},{"className":320},[],[322],{"type":47,"value":323},"redirect",{"type":47,"value":325}," to ",{"type":41,"tag":63,"props":327,"children":329},{"className":328},[],[330],{"type":47,"value":208},{"type":47,"value":332},". The config key must match the driver name exactly.",{"type":41,"tag":292,"props":334,"children":336},{"id":335},"_2-create-redirect-and-callback-routes",[337],{"type":47,"value":338},"2. Create redirect and callback routes",{"type":41,"tag":57,"props":340,"children":341},{},[342,344,350,352,358],{"type":47,"value":343},"Two routes are needed: one that calls ",{"type":41,"tag":63,"props":345,"children":347},{"className":346},[],[348],{"type":47,"value":349},"Socialite::driver('provider')->redirect()",{"type":47,"value":351}," to send the user to the OAuth provider, and one that calls ",{"type":41,"tag":63,"props":353,"children":355},{"className":354},[],[356],{"type":47,"value":357},"Socialite::driver('provider')->user()",{"type":47,"value":359}," to receive the callback and retrieve user details.",{"type":41,"tag":292,"props":361,"children":363},{"id":362},"_3-authenticate-and-store-the-user",[364],{"type":47,"value":365},"3. Authenticate and store the user",{"type":41,"tag":57,"props":367,"children":368},{},[369,371,377,379,385,386,392,393,399,400,406,407,413,415,421],{"type":47,"value":370},"In the callback, use ",{"type":41,"tag":63,"props":372,"children":374},{"className":373},[],[375],{"type":47,"value":376},"updateOrCreate",{"type":47,"value":378}," to find or create a user record from the provider's response (",{"type":41,"tag":63,"props":380,"children":382},{"className":381},[],[383],{"type":47,"value":384},"id",{"type":47,"value":89},{"type":41,"tag":63,"props":387,"children":389},{"className":388},[],[390],{"type":47,"value":391},"name",{"type":47,"value":89},{"type":41,"tag":63,"props":394,"children":396},{"className":395},[],[397],{"type":47,"value":398},"email",{"type":47,"value":89},{"type":41,"tag":63,"props":401,"children":403},{"className":402},[],[404],{"type":47,"value":405},"token",{"type":47,"value":89},{"type":41,"tag":63,"props":408,"children":410},{"className":409},[],[411],{"type":47,"value":412},"refreshToken",{"type":47,"value":414},"), then call ",{"type":41,"tag":63,"props":416,"children":418},{"className":417},[],[419],{"type":47,"value":420},"Auth::login()",{"type":47,"value":197},{"type":41,"tag":292,"props":423,"children":425},{"id":424},"_4-customize-the-redirect-optional",[426],{"type":47,"value":427},"4. Customize the redirect (optional)",{"type":41,"tag":254,"props":429,"children":430},{},[431,442,453,472,522],{"type":41,"tag":258,"props":432,"children":433},{},[434,440],{"type":41,"tag":63,"props":435,"children":437},{"className":436},[],[438],{"type":47,"value":439},"scopes()",{"type":47,"value":441}," — merge additional scopes with the provider's defaults",{"type":41,"tag":258,"props":443,"children":444},{},[445,451],{"type":41,"tag":63,"props":446,"children":448},{"className":447},[],[449],{"type":47,"value":450},"setScopes()",{"type":47,"value":452}," — replace all scopes entirely",{"type":41,"tag":258,"props":454,"children":455},{},[456,462,464,470],{"type":41,"tag":63,"props":457,"children":459},{"className":458},[],[460],{"type":47,"value":461},"with()",{"type":47,"value":463}," — pass optional parameters (e.g., ",{"type":41,"tag":63,"props":465,"children":467},{"className":466},[],[468],{"type":47,"value":469},"['hd' => 'example.com']",{"type":47,"value":471}," for Google)",{"type":41,"tag":258,"props":473,"children":474},{},[475,481,483,489,491,497,499,505,507,513,515,520],{"type":41,"tag":63,"props":476,"children":478},{"className":477},[],[479],{"type":47,"value":480},"asBotUser()",{"type":47,"value":482}," — Slack only; generates a bot token (",{"type":41,"tag":63,"props":484,"children":486},{"className":485},[],[487],{"type":47,"value":488},"xoxb-",{"type":47,"value":490},") instead of a user token (",{"type":41,"tag":63,"props":492,"children":494},{"className":493},[],[495],{"type":47,"value":496},"xoxp-",{"type":47,"value":498},"). Must be called before both ",{"type":41,"tag":63,"props":500,"children":502},{"className":501},[],[503],{"type":47,"value":504},"redirect()",{"type":47,"value":506}," and ",{"type":41,"tag":63,"props":508,"children":510},{"className":509},[],[511],{"type":47,"value":512},"user()",{"type":47,"value":514},". Only the ",{"type":41,"tag":63,"props":516,"children":518},{"className":517},[],[519],{"type":47,"value":405},{"type":47,"value":521}," property will be hydrated on the user object.",{"type":41,"tag":258,"props":523,"children":524},{},[525,531],{"type":41,"tag":63,"props":526,"children":528},{"className":527},[],[529],{"type":47,"value":530},"stateless()",{"type":47,"value":532}," — for API\u002FSPA contexts where session state is not maintained",{"type":41,"tag":292,"props":534,"children":536},{"id":535},"_5-verify",[537],{"type":47,"value":538},"5. Verify",{"type":41,"tag":540,"props":541,"children":542},"ol",{},[543,548,570,575],{"type":41,"tag":258,"props":544,"children":545},{},[546],{"type":47,"value":547},"Config key matches driver name exactly (check the list above for hyphenated names)",{"type":41,"tag":258,"props":549,"children":550},{},[551,556,557,562,563,568],{"type":41,"tag":63,"props":552,"children":554},{"className":553},[],[555],{"type":47,"value":308},{"type":47,"value":89},{"type":41,"tag":63,"props":558,"children":560},{"className":559},[],[561],{"type":47,"value":315},{"type":47,"value":317},{"type":41,"tag":63,"props":564,"children":566},{"className":565},[],[567],{"type":47,"value":323},{"type":47,"value":569}," are all present",{"type":41,"tag":258,"props":571,"children":572},{},[573],{"type":47,"value":574},"Redirect URL matches what is registered in the provider's OAuth dashboard",{"type":41,"tag":258,"props":576,"children":577},{},[578],{"type":47,"value":579},"Callback route handles denied grants (when user declines authorization)",{"type":41,"tag":57,"props":581,"children":582},{},[583,584,589],{"type":47,"value":61},{"type":41,"tag":63,"props":585,"children":587},{"className":586},[],[588],{"type":47,"value":68},{"type":47,"value":590}," for complete code examples of each step.",{"type":41,"tag":50,"props":592,"children":594},{"id":593},"additional-features",[595],{"type":47,"value":596},"Additional Features",{"type":41,"tag":57,"props":598,"children":599},{},[600,601,606,608,614,615,621,622,628],{"type":47,"value":61},{"type":41,"tag":63,"props":602,"children":604},{"className":603},[],[605],{"type":47,"value":68},{"type":47,"value":607}," for usage details on: ",{"type":41,"tag":63,"props":609,"children":611},{"className":610},[],[612],{"type":47,"value":613},"enablePKCE()",{"type":47,"value":89},{"type":41,"tag":63,"props":616,"children":618},{"className":617},[],[619],{"type":47,"value":620},"userFromToken($token)",{"type":47,"value":89},{"type":41,"tag":63,"props":623,"children":625},{"className":624},[],[626],{"type":47,"value":627},"userFromTokenAndSecret($token, $secret)",{"type":47,"value":629}," (OAuth 1.0), retrieving user details.",{"type":41,"tag":57,"props":631,"children":632},{},[633,635,641,642,648,649,655,656,662,663,669,670,675,676,681,682,688,689],{"type":47,"value":634},"User object: ",{"type":41,"tag":63,"props":636,"children":638},{"className":637},[],[639],{"type":47,"value":640},"getId()",{"type":47,"value":89},{"type":41,"tag":63,"props":643,"children":645},{"className":644},[],[646],{"type":47,"value":647},"getName()",{"type":47,"value":89},{"type":41,"tag":63,"props":650,"children":652},{"className":651},[],[653],{"type":47,"value":654},"getEmail()",{"type":47,"value":89},{"type":41,"tag":63,"props":657,"children":659},{"className":658},[],[660],{"type":47,"value":661},"getAvatar()",{"type":47,"value":89},{"type":41,"tag":63,"props":664,"children":666},{"className":665},[],[667],{"type":47,"value":668},"getNickname()",{"type":47,"value":89},{"type":41,"tag":63,"props":671,"children":673},{"className":672},[],[674],{"type":47,"value":405},{"type":47,"value":89},{"type":41,"tag":63,"props":677,"children":679},{"className":678},[],[680],{"type":47,"value":412},{"type":47,"value":89},{"type":41,"tag":63,"props":683,"children":685},{"className":684},[],[686],{"type":47,"value":687},"expiresIn",{"type":47,"value":89},{"type":41,"tag":63,"props":690,"children":692},{"className":691},[],[693],{"type":47,"value":694},"approvedScopes",{"type":41,"tag":50,"props":696,"children":698},{"id":697},"testing",[699],{"type":47,"value":700},"Testing",{"type":41,"tag":57,"props":702,"children":703},{},[704,706,712,714,719],{"type":47,"value":705},"Socialite provides ",{"type":41,"tag":63,"props":707,"children":709},{"className":708},[],[710],{"type":47,"value":711},"Socialite::fake()",{"type":47,"value":713}," for testing redirects and callbacks. Use ",{"type":41,"tag":63,"props":715,"children":717},{"className":716},[],[718],{"type":47,"value":68},{"type":47,"value":720}," for faking redirects, callback user data, custom token properties, and assertion methods.",{"type":41,"tag":50,"props":722,"children":724},{"id":723},"common-pitfalls",[725],{"type":47,"value":726},"Common Pitfalls",{"type":41,"tag":254,"props":728,"children":729},{},[730,754,785,802,821,833,881,893],{"type":41,"tag":258,"props":731,"children":732},{},[733,735,740,741,746,747,752],{"type":47,"value":734},"Config key must match driver name exactly — hyphenated drivers need hyphenated keys (",{"type":41,"tag":63,"props":736,"children":738},{"className":737},[],[739],{"type":47,"value":116},{"type":47,"value":89},{"type":41,"tag":63,"props":742,"children":744},{"className":743},[],[745],{"type":47,"value":158},{"type":47,"value":89},{"type":41,"tag":63,"props":748,"children":750},{"className":749},[],[751],{"type":47,"value":102},{"type":47,"value":753},"). Mismatch silently fails.",{"type":41,"tag":258,"props":755,"children":756},{},[757,759,764,765,770,771,776,778,783],{"type":47,"value":758},"Every provider needs ",{"type":41,"tag":63,"props":760,"children":762},{"className":761},[],[763],{"type":47,"value":308},{"type":47,"value":89},{"type":41,"tag":63,"props":766,"children":768},{"className":767},[],[769],{"type":47,"value":315},{"type":47,"value":317},{"type":41,"tag":63,"props":772,"children":774},{"className":773},[],[775],{"type":47,"value":323},{"type":47,"value":777}," in ",{"type":41,"tag":63,"props":779,"children":781},{"className":780},[],[782],{"type":47,"value":208},{"type":47,"value":784},". Missing any one causes cryptic errors.",{"type":41,"tag":258,"props":786,"children":787},{},[788,793,795,800],{"type":41,"tag":63,"props":789,"children":791},{"className":790},[],[792],{"type":47,"value":439},{"type":47,"value":794}," merges with defaults; ",{"type":41,"tag":63,"props":796,"children":798},{"className":797},[],[799],{"type":47,"value":450},{"type":47,"value":801}," replaces all scopes entirely.",{"type":41,"tag":258,"props":803,"children":804},{},[805,807,812,814,820],{"type":47,"value":806},"Missing ",{"type":41,"tag":63,"props":808,"children":810},{"className":809},[],[811],{"type":47,"value":530},{"type":47,"value":813}," in API\u002FSPA contexts causes ",{"type":41,"tag":63,"props":815,"children":817},{"className":816},[],[818],{"type":47,"value":819},"InvalidStateException",{"type":47,"value":197},{"type":41,"tag":258,"props":822,"children":823},{},[824,826,831],{"type":47,"value":825},"Redirect URL in ",{"type":41,"tag":63,"props":827,"children":829},{"className":828},[],[830],{"type":47,"value":208},{"type":47,"value":832}," must exactly match the provider's OAuth dashboard (including trailing slashes and protocol).",{"type":41,"tag":258,"props":834,"children":835},{},[836,838,844,845,851,852,857,858,864,866,872,874,879],{"type":47,"value":837},"Do not pass ",{"type":41,"tag":63,"props":839,"children":841},{"className":840},[],[842],{"type":47,"value":843},"state",{"type":47,"value":89},{"type":41,"tag":63,"props":846,"children":848},{"className":847},[],[849],{"type":47,"value":850},"response_type",{"type":47,"value":89},{"type":41,"tag":63,"props":853,"children":855},{"className":854},[],[856],{"type":47,"value":308},{"type":47,"value":89},{"type":41,"tag":63,"props":859,"children":861},{"className":860},[],[862],{"type":47,"value":863},"redirect_uri",{"type":47,"value":865},", or ",{"type":41,"tag":63,"props":867,"children":869},{"className":868},[],[870],{"type":47,"value":871},"scope",{"type":47,"value":873}," via ",{"type":41,"tag":63,"props":875,"children":877},{"className":876},[],[878],{"type":47,"value":461},{"type":47,"value":880}," — these are reserved.",{"type":41,"tag":258,"props":882,"children":883},{},[884,886,892],{"type":47,"value":885},"Community providers require event listener registration via ",{"type":41,"tag":63,"props":887,"children":889},{"className":888},[],[890],{"type":47,"value":891},"SocialiteWasCalled",{"type":47,"value":197},{"type":41,"tag":258,"props":894,"children":895},{},[896,901],{"type":41,"tag":63,"props":897,"children":899},{"className":898},[],[900],{"type":47,"value":512},{"type":47,"value":902}," throws when the user declines authorization. Always handle denied grants.",{"items":904,"total":1034},[905,912,926,941,958,975,987,1001,1018],{"slug":4,"name":4,"fn":5,"description":6,"org":906,"tags":907,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[908,909,910,911],{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15},{"slug":913,"name":913,"fn":914,"description":915,"org":916,"tags":917,"stars":923,"repoUrl":924,"updatedAt":925},"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},[918,919,922],{"name":9,"slug":8,"type":15},{"name":920,"slug":921,"type":15},"Performance","performance",{"name":13,"slug":14,"type":15},4021,"https:\u002F\u002Fgithub.com\u002Flaravel\u002Foctane","2026-07-16T06:02:20.284131",{"slug":927,"name":927,"fn":928,"description":929,"org":930,"tags":931,"stars":938,"repoUrl":939,"updatedAt":940},"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},[932,935,936,937],{"name":933,"slug":934,"type":15},"2FA","2fa",{"name":17,"slug":18,"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":942,"name":942,"fn":943,"description":944,"org":945,"tags":946,"stars":955,"repoUrl":956,"updatedAt":957},"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},[947,950,953,954],{"name":948,"slug":949,"type":15},"Agents","agents",{"name":951,"slug":952,"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":959,"name":959,"fn":960,"description":961,"org":962,"tags":963,"stars":972,"repoUrl":973,"updatedAt":974},"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},[964,967,970,971],{"name":965,"slug":966,"type":15},"CLI","cli",{"name":968,"slug":969,"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":976,"name":976,"fn":977,"description":978,"org":979,"tags":980,"stars":972,"repoUrl":973,"updatedAt":986},"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},[981,982,985],{"name":9,"slug":8,"type":15},{"name":983,"slug":984,"type":15},"Maintenance","maintenance",{"name":13,"slug":14,"type":15},"2026-07-13T06:22:11.972952",{"slug":988,"name":988,"fn":989,"description":990,"org":991,"tags":992,"stars":998,"repoUrl":999,"updatedAt":1000},"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},[993,996,997],{"name":994,"slug":995,"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":1002,"name":1002,"fn":1003,"description":1004,"org":1005,"tags":1006,"stars":1015,"repoUrl":1016,"updatedAt":1017},"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},[1007,1010,1011,1014],{"name":1008,"slug":1009,"type":15},"Configuration","configuration",{"name":9,"slug":8,"type":15},{"name":1012,"slug":1013,"type":15},"Observability","observability",{"name":13,"slug":14,"type":15},368,"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fnightwatch","2026-07-13T06:22:29.945491",{"slug":1019,"name":1019,"fn":1003,"description":1020,"org":1021,"tags":1022,"stars":1031,"repoUrl":1032,"updatedAt":1033},"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},[1023,1024,1025,1028],{"name":1008,"slug":1009,"type":15},{"name":9,"slug":8,"type":15},{"name":1026,"slug":1027,"type":15},"Monitoring","monitoring",{"name":1029,"slug":1030,"type":15},"Privacy","privacy",0,"https:\u002F\u002Fgithub.com\u002Flaravel\u002Fnightwatch-cursor-plugin","2026-07-16T06:02:16.946147",9,{"items":1036,"total":1044},[1037],{"slug":4,"name":4,"fn":5,"description":6,"org":1038,"tags":1039,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1040,1041,1042,1043],{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15},1]