Laravel Bluesky supports two authentication methods. All API calls after authentication share the same interface regardless of which method you use.
Item
App Password
OAuth
Internal classes
LegacyAgent / LegacySession
OAuthAgent / OAuthSession
Entry point
Bluesky::login()
Bluesky::withToken(OAuthSession)
Private key required
No
Yes (BLUESKY_OAUTH_PRIVATE_KEY)
User authorization step
Not required
Required (browser approval)
Background execution
✅ Simple
✅ Possible (save refresh_token)
Session keys
accessJwt / refreshJwt
access_token / refresh_token
Deprecated
No
—
Primary use cases
Automated posts, notifications, batch
User-delegated actions, Socialite login
LegacyAgent is named for the “pre-OAuth” authentication style, but App Password itself is not deprecated. For scenarios that do not involve user interaction — such as notifications and automated posting — App Password is simpler and often preferable.
BlueskyManager is the implementation behind the Bluesky facade. You set an agent via login() or withToken(), and all subsequent API calls work identically regardless of which agent is active.
Calling login() on every request makes an API call each time. Cache the session data to avoid this.
use Revolution\Bluesky\Facades\Bluesky;use Revolution\Bluesky\Session\LegacySession;// Log in and persist the sessionBluesky::login( identifier: config('bluesky.identifier'), password: config('bluesky.password'),);cache()->put('bluesky_session', Bluesky::agent()->session()->toArray(), now()->addDay());// Restore from cache on subsequent calls$session = LegacySession::create(cache('bluesky_session', []));Bluesky::withToken($session);// Refresh if the access token has expiredif (! Bluesky::check()) { Bluesky::refreshSession();}$response = Bluesky::post('Hello from cached session');
The OAuth refresh_token can only be used once. Use the OAuthSessionUpdated event to save the new token to your database after each refresh. See Socialite for details.
After authenticating with either method, you call the same API methods on the Bluesky facade.
use Revolution\Bluesky\Facades\Bluesky;use Revolution\Bluesky\Session\LegacySession;use Revolution\Bluesky\Session\OAuthSession;// App PasswordBluesky::login(config('bluesky.identifier'), config('bluesky.password'));// OR OAuth$session = OAuthSession::create(session('bluesky_session'));Bluesky::withToken($session);// ↓ All API calls below are identical regardless of method ↓Bluesky::post('Hello Bluesky');Bluesky::getTimeline();Bluesky::getProfile();Bluesky::searchPosts(q: '#laravel');
BlueskyManager switches between LegacyAgent and OAuthAgent internally, but the calling code is unaffected.
You can use both methods together. A common pattern is to use App Password for notifications and scheduled tasks while using OAuth for user-facing login. There is no conflict between the two.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Knowledge of Laravel","colors":{"primary":"#16A34A","light":"#07C983","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/logo/light.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=df0b7397202a6aa1c1f321620c5aa146","dark":"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/logo/dark.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=a8a0340d86ff8aa90e9adfc98a0362d7","href":"/"},"favicon":"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/favicon.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=8f5a03a681c95d31803fc237b5811065","api":{"playground":{"display":"simple"}},"navbar":{},"footer":{"socials":{"github":"https://github.com/invokable"}},"seo":{"metatags":{"canonical":"https://kawax.biz"},"indexing":"all"},"styling":{"eyebrows":"breadcrumbs","latex":true},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"interaction":{"drilldown":false},"metadata":{"timestamp":true},"navigation":{"languages":[{"language":"jp","default":true,"href":"jp/packages/laravel-boost-copilot-cli"},{"language":"en","href":"en/packages/laravel-boost-copilot-cli"},{"language":"de","href":"de/packages/laravel-boost-copilot-cli"},{"language":"es","href":"es/packages/laravel-boost-copilot-cli"},{"language":"fr","href":"fr/packages/laravel-boost-copilot-cli"},{"language":"it","href":"it/packages/laravel-boost-copilot-cli"},{"language":"ko","href":"ko/packages/laravel-boost-copilot-cli"},{"language":"nl","href":"nl/packages/laravel-boost-copilot-cli"},{"language":"zh-Hans","href":"zh-CN/packages/laravel-boost-copilot-cli"},{"language":"zh-Hant","href":"zh-TW/packages/laravel-boost-copilot-cli"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"invokable","hasAudioNarration":true,"actualSubdomain":"invokable","customDomains":["kawax.biz"],"gitSource":{"type":"github","owner":"kawax","repo":"mintlify-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adfbdcfdb56f9a377f1e691","collectionId":"183ced92-09c4-4050-a37a-01235158db9e","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adfbdcfdb56f9a377f1e691"},"feedback":{"thumbs":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6adfbdcfdb56f9a377f1e691","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"en","tag":"My Packages","count":144},{"language":"jp","tag":"マイパッケージ","count":144},{"language":"de","tag":"Meine Pakete","count":100},{"language":"es","tag":"Mis paquetes","count":100},{"language":"fr","tag":"Mes packages","count":100},{"language":"it","tag":"I miei pacchetti","count":100},{"language":"ko","tag":"My 패키지","count":100},{"language":"nl","tag":"Mijn packages","count":100},{"language":"zh-Hans","tag":"我的包","count":100},{"language":"zh-Hant","tag":"我的套件","count":100},{"language":"de","tag":"Fortgeschrittene Themen","count":67},{"language":"en","tag":"Advanced Topics","count":67},{"language":"es","tag":"Temas avanzados","count":67},{"language":"fr","tag":"Sujets avancés","count":67},{"language":"it","tag":"Argomenti avanzati","count":67},{"language":"jp","tag":"応用トピック","count":67},{"language":"ko","tag":"심화 주제","count":67},{"language":"nl","tag":"Geavanceerde onderwerpen","count":67},{"language":"zh-Hans","tag":"进阶主题","count":67},{"language":"zh-Hant","tag":"進階主題","count":67},{"language":"en","tag":"VOICEVOX","count":66},{"language":"jp","tag":"VOICEVOX","count":66},{"language":"de","tag":"Leitfaden","count":61},{"language":"en","tag":"Guide","count":61},{"language":"es","tag":"Guía","count":61},{"language":"fr","tag":"Guide","count":61},{"language":"it","tag":"Guida","count":61},{"language":"jp","tag":"ガイド","count":61},{"language":"ko","tag":"가이드","count":61},{"language":"nl","tag":"Gids","count":61},{"language":"zh-Hans","tag":"指南","count":61},{"language":"zh-Hant","tag":"指南","count":61},{"language":"de","tag":"Blog","count":46},{"language":"en","tag":"Blog","count":46},{"language":"es","tag":"Blog","count":46},{"language":"fr","tag":"Blog","count":46},{"language":"it","tag":"Blog","count":46},{"language":"jp","tag":"ブログ","count":46},{"language":"ko","tag":"블로그","count":46},{"language":"nl","tag":"Blog","count":46},{"language":"zh-Hans","tag":"博客","count":46},{"language":"zh-Hant","tag":"部落格","count":46},{"language":"en","tag":"VOICEVOX Engine API Reference","count":44},{"language":"jp","tag":"VOICEVOXエンジンAPIリファレンス","count":44},{"language":"de","tag":"GitHub Copilot","count":43},{"language":"en","tag":"GitHub Copilot","count":43},{"language":"es","tag":"GitHub Copilot","count":43},{"language":"fr","tag":"GitHub Copilot","count":43},{"language":"it","tag":"GitHub Copilot","count":43},{"language":"jp","tag":"GitHub Copilot","count":43},{"language":"ko","tag":"GitHub Copilot","count":43},{"language":"nl","tag":"GitHub Copilot","count":43},{"language":"zh-Hans","tag":"GitHub Copilot","count":43},{"language":"zh-Hant","tag":"GitHub Copilot","count":43},{"language":"de","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"en","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"es","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"fr","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"it","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"jp","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"ko","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"nl","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"zh-Hans","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"zh-Hant","tag":"GitHub Copilot SDK for Laravel","count":41},{"language":"de","tag":"Tutorial","count":35},{"language":"en","tag":"Tutorial","count":35},{"language":"es","tag":"Tutorial","count":35},{"language":"fr","tag":"Tutoriel","count":35},{"language":"it","tag":"Tutorial","count":35},{"language":"jp","tag":"チュートリアル","count":35},{"language":"ko","tag":"튜토리얼","count":35},{"language":"nl","tag":"Tutorial","count":35},{"language":"zh-Hans","tag":"教程","count":35},{"language":"zh-Hant","tag":"教學","count":35},{"language":"de","tag":"Paketentwicklung","count":29},{"language":"en","tag":"Package Development","count":29},{"language":"es","tag":"Desarrollo de paquetes","count":29},{"language":"fr","tag":"Développement de packages","count":29},{"language":"it","tag":"Sviluppo di pacchetti","count":29},{"language":"jp","tag":"パッケージ開発","count":29},{"language":"ko","tag":"패키지 개발","count":29},{"language":"nl","tag":"Package-ontwikkeling","count":29},{"language":"zh-Hans","tag":"包开发","count":29},{"language":"zh-Hant","tag":"套件開發","count":29},{"language":"de","tag":"SDK","count":27},{"language":"es","tag":"SDK","count":27},{"language":"fr","tag":"SDK","count":27},{"language":"it","tag":"SDK","count":27},{"language":"ko","tag":"SDK","count":27},{"language":"nl","tag":"SDK","count":27},{"language":"zh-Hans","tag":"SDK","count":27},{"language":"zh-Hant","tag":"SDK","count":27},{"language":"de","tag":"VOICEVOX","count":22},{"language":"es","tag":"VOICEVOX","count":22},{"language":"fr","tag":"VOICEVOX","count":22},{"language":"it","tag":"VOICEVOX","count":22},{"language":"ko","tag":"VOICEVOX","count":22},{"language":"nl","tag":"VOICEVOX","count":22},{"language":"zh-Hans","tag":"VOICEVOX","count":22},{"language":"zh-Hant","tag":"VOICEVOX","count":22}],"searchSettings":{"isFiltersEnabled":false,"showContentSnippets":true}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"privacy":{"consentBanner":{"enabled":true}},"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"en/packages/laravel-bluesky/authentication","slug":"/en/packages/laravel-bluesky/authentication","pageMetadata":{"title":"Authentication methods - Laravel Bluesky","description":"Compare App Password (LegacyAgent) and OAuth (OAuthAgent) in Laravel Bluesky: architecture, implementation, and when to use each.","sidebarTitle":"Authentication methods","href":"/en/packages/laravel-bluesky/authentication"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Compare App Password (LegacyAgent) and OAuth (OAuthAgent) in Laravel Bluesky: architecture, implementation, and when to use each.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Info,Mermaid,Table,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`overview`,children:`Overview`}),`\n`,_jsx(_components.p,{children:`Laravel Bluesky supports two authentication methods. All API calls after authentication share the same interface regardless of which method you use.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Item`}),_jsx(_components.th,{children:`App Password`}),_jsx(_components.th,{children:`OAuth`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Internal classes`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`LegacyAgent`}),` / `,_jsx(_components.code,{children:`LegacySession`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`OAuthAgent`}),` / `,_jsx(_components.code,{children:`OAuthSession`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Entry point`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Bluesky::login()`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`Bluesky::withToken(OAuthSession)`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Private key required`}),_jsx(_components.td,{children:`No`}),_jsxs(_components.td,{children:[`Yes (`,_jsx(_components.code,{children:`BLUESKY_OAUTH_PRIVATE_KEY`}),`)`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`User authorization step`}),_jsx(_components.td,{children:`Not required`}),_jsx(_components.td,{children:`Required (browser approval)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Background execution`}),_jsx(_components.td,{children:`✅ Simple`}),_jsx(_components.td,{children:`✅ Possible (save refresh_token)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Session keys`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`accessJwt`}),` / `,_jsx(_components.code,{children:`refreshJwt`})]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`access_token`}),` / `,_jsx(_components.code,{children:`refresh_token`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Deprecated`}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`No`})}),_jsx(_components.td,{children:`—`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Primary use cases`}),_jsx(_components.td,{children:`Automated posts, notifications, batch`}),_jsx(_components.td,{children:`User-delegated actions, Socialite login`})]})]})]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`LegacyAgent`}),` is named for the “pre-OAuth” authentication style, but App Password itself is not deprecated. For scenarios that do not involve user interaction — such as notifications and automated posting — App Password is simpler and often preferable.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`architecture`,children:`Architecture`}),`\n`,_jsx(Mermaid,{chart:`classDiagram\n class BlueskyManager {\n +login(identifier, password) Factory\n +withToken(session) Factory\n +agent() Agent\n +check() bool\n +refreshSession() Factory\n }\n class LegacyAgent {\n +session LegacySession\n +http() PendingRequest\n +refreshSession() self\n }\n class OAuthAgent {\n +session OAuthSession\n +http() PendingRequest\n +refreshSession() self\n }\n class LegacySession {\n +accessJwt\n +refreshJwt\n +did\n +handle\n +token() string\n +refresh() string\n }\n class OAuthSession {\n +access_token\n +refresh_token\n +did\n +iss\n +token() string\n +refresh() string\n +issuer() string\n }\n\n BlueskyManager --> LegacyAgent : login()\n BlueskyManager --> OAuthAgent : withToken(OAuthSession)\n BlueskyManager --> LegacyAgent : withToken(LegacySession)\n LegacyAgent --> LegacySession : holds\n OAuthAgent --> OAuthSession : holds`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`BlueskyManager`}),` is the implementation behind the `,_jsx(_components.code,{children:`Bluesky`}),` facade. You set an agent via `,_jsx(_components.code,{children:`login()`}),` or `,_jsx(_components.code,{children:`withToken()`}),`, and all subsequent API calls work identically regardless of which agent is active.`]}),`\n`,_jsx(Heading,{level:`2`,id:`app-password-legacyagent`,children:`App Password (LegacyAgent)`}),`\n`,_jsx(Heading,{level:`3`,id:`authentication-flow`,children:`Authentication flow`}),`\n`,_jsx(Mermaid,{chart:`sequenceDiagram\n participant App as Laravel app\n participant Bluesky as Bluesky server\n\n App->>Bluesky: createSession(identifier, password)\n Bluesky-->>App: LegacySession (accessJwt + refreshJwt)\n App->>App: LegacyAgent::create(session)\n App->>Bluesky: API call (Bearer accessJwt)\n Bluesky-->>App: Response\n Note over App: When accessJwt expires\n App->>Bluesky: refreshSession (refreshJwt)\n Bluesky-->>App: New accessJwt + refreshJwt`}),`\n`,_jsx(Heading,{level:`3`,id:`blueskylogin`,children:`Bluesky::login()`}),`\n`,_jsxs(_components.p,{children:[`Set your App Password in `,_jsx(_components.code,{children:`.env`}),` and call `,_jsx(_components.code,{children:`login()`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`dotenv`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`dotenv`,children:_jsxs(_components.code,{language:`dotenv`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`BLUESKY_IDENTIFIER`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`your-handle.bsky.social`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`BLUESKY_APP_PASSWORD`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`xxxx-xxxx-xxxx-xxxx`})]}),`\n`]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$response`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`login`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` identifier`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky.identifier'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` password`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky.password'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`post`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Hello Bluesky'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`resuming-a-legacysession`,children:`Resuming a LegacySession`}),`\n`,_jsxs(_components.p,{children:[`Calling `,_jsx(_components.code,{children:`login()`}),` on every request makes an API call each time. Cache the session data to avoid this.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`20`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`20`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Session\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`LegacySession`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Log in and persist the session`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`login`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` identifier`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky.identifier'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` password`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky.password'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`cache`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`put`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky_session'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`agent`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`session`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toArray`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(), `}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`addDay`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`());`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Restore from cache on subsequent calls`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$session`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` LegacySession`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`create`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`cache`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky_session'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, []));`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`withToken`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$session`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Refresh if the access token has expired`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`!`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`check`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`refreshSession`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$response`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`post`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Hello from cached session'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`legacysession-keys`,children:`LegacySession keys`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Key`}),_jsx(_components.th,{children:`Content`}),_jsx(_components.th,{children:`Method`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`accessJwt`})}),_jsx(_components.td,{children:`Access token`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`token()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`refreshJwt`})}),_jsx(_components.td,{children:`Refresh token`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`refresh()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`did`})}),_jsx(_components.td,{children:`Bluesky DID`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`did()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`handle`})}),_jsx(_components.td,{children:`Handle`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`handle()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`email`})}),_jsx(_components.td,{children:`Email address`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`email()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`active`})}),_jsx(_components.td,{children:`Whether the account is active`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`active()`})})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`when-to-use-app-password`,children:`When to use App Password`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Background jobs and queue workers for automated posting`}),`\n`,_jsx(_components.li,{children:`Laravel Notification channel`}),`\n`,_jsx(_components.li,{children:`Scheduled tasks and batch processing`}),`\n`,_jsx(_components.li,{children:`When posting from the application’s own account`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`oauth-oauthagent`,children:`OAuth (OAuthAgent)`}),`\n`,_jsx(Heading,{level:`3`,id:`authentication-flow-2`,children:`Authentication flow`}),`\n`,_jsx(Mermaid,{chart:`sequenceDiagram\n participant User as User\n participant App as Laravel app\n participant Bluesky as Bluesky server\n\n User->>App: Submit login form (handle input)\n App->>Bluesky: PAR request (with login_hint)\n Bluesky-->>App: request_uri\n App->>Bluesky: Redirect to authorization endpoint\n User->>Bluesky: Approve authorization on Bluesky\n Bluesky-->>App: Callback (code + iss)\n App->>Bluesky: Token exchange with DPoP\n Bluesky-->>App: OAuthSession (access_token + refresh_token)\n App->>User: Login complete\n App->>Bluesky: API call (DPoP access_token)\n Bluesky-->>App: Response`}),`\n`,_jsx(Heading,{level:`3`,id:`blueskywithtoken`,children:`Bluesky::withToken()`}),`\n`,_jsxs(_components.p,{children:[`Pass the `,_jsx(_components.code,{children:`OAuthSession`}),` obtained from Socialite to `,_jsx(_components.code,{children:`withToken()`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Session\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`OAuthSession`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Restore from Laravel session (web request)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$session`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` OAuthSession`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`create`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`session`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky_session'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$timeline`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`withToken`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$session`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getTimeline`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`In background jobs or console commands where Laravel sessions are unavailable, build an `,_jsx(_components.code,{children:`OAuthSession`}),` from database values.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`13`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`13`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Session\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`OAuthSession`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$session`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` OAuthSession`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`create`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`([`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'did'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $user`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`did`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'refresh_token'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` $user`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`->`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`refresh_token`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Include iss for accounts outside bsky.social`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // 'iss' => $user->iss,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]);`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$response`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`withToken`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$session`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`refreshSession`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ->`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`post`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Hello from OAuth'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`oauthsession-keys`,children:`OAuthSession keys`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Key`}),_jsx(_components.th,{children:`Content`}),_jsx(_components.th,{children:`Method`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`access_token`})}),_jsx(_components.td,{children:`Access token`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`token()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`refresh_token`})}),_jsx(_components.td,{children:`Refresh token (single use)`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`refresh()`})})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`did`}),` / `,_jsx(_components.code,{children:`sub`})]}),_jsx(_components.td,{children:`Bluesky DID`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`did()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`iss`})}),_jsx(_components.td,{children:`Authorization server URL`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`issuer()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`profile.handle`})}),_jsx(_components.td,{children:`Handle`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`handle()`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`profile.displayName`})}),_jsx(_components.td,{children:`Display name`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`displayName()`})})]})]})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`The OAuth `,_jsx(_components.code,{children:`refresh_token`}),` can only be used once. Use the `,_jsx(_components.code,{children:`OAuthSessionUpdated`}),` event to save the new token to your database after each refresh. See `,_jsx(_components.a,{href:`/en/packages/laravel-bluesky/socialite`,children:`Socialite`}),` for details.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`when-to-use-oauth`,children:`When to use OAuth`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`User login via Socialite`}),`\n`,_jsx(_components.li,{children:`Performing actions on behalf of a user`}),`\n`,_jsx(_components.li,{children:`When different users need to act from their own accounts`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`api-calls-are-identical-after-authentication`,children:`API calls are identical after authentication`}),`\n`,_jsxs(_components.p,{children:[`After authenticating with either method, you call the same API methods on the `,_jsx(_components.code,{children:`Bluesky`}),` facade.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`17`,language:`php`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`php`,children:_jsxs(_components.code,{language:`php`,numberOfLines:`17`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Facades\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Session\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`LegacySession`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`use`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` Revolution\\\\Bluesky\\\\Session\\\\`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`OAuthSession`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// App Password`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`login`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky.identifier'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`), `}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`config`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky.password'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// OR OAuth`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$session`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` OAuthSession`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`create`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`session`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'bluesky_session'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`withToken`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$session`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// ↓ All API calls below are identical regardless of method ↓`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`post`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Hello Bluesky'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getTimeline`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`getProfile`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`Bluesky`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`::`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`searchPosts`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`q`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'#laravel'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`BlueskyManager`}),` switches between `,_jsx(_components.code,{children:`LegacyAgent`}),` and `,_jsx(_components.code,{children:`OAuthAgent`}),` internally, but the calling code is unaffected.`]}),`\n`,_jsx(Heading,{level:`2`,id:`choosing-between-the-two`,children:`Choosing between the two`}),`\n`,_jsx(Mermaid,{chart:`flowchart TD\n A[\"Which authentication method?\"] --> B{\"Does a user need to log in\u003cbr>with their Bluesky account?\"}\n B -->|\"Yes\"| C[\"OAuth (OAuthAgent)\u003cbr>Socialite integration\"]\n B -->|\"No\"| D{\"Does the app act from\u003cbr>its own account?\"}\n D -->|\"Yes\"| E[\"App Password (LegacyAgent)\u003cbr>Simple and easy to operate\"]\n D -->|\"Act on behalf of multiple users\"| C`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Situation`}),_jsx(_components.th,{children:`Recommendation`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Automated posts, notifications, batch`}),_jsx(_components.td,{children:`App Password`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`User login feature`}),_jsx(_components.td,{children:`OAuth`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Background jobs only`}),_jsx(_components.td,{children:`App Password`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`User-delegated operations`}),_jsx(_components.td,{children:`OAuth`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Simplicity preferred`}),_jsx(_components.td,{children:`App Password`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Fine-grained permission control`}),_jsx(_components.td,{children:`OAuth`})]})]})]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`You can use both methods together. A common pattern is to use App Password for notifications and scheduled tasks while using OAuth for user-facing login. There is no conflict between the two.`})}),`\n`,_jsx(Heading,{level:`2`,id:`related-pages`,children:`Related pages`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/en/packages/laravel-bluesky/basic-client`,children:`Basic client`}),` — API operations after authentication`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/en/packages/laravel-bluesky/socialite`,children:`Socialite`}),` — full OAuth flow details`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/en/packages/laravel-bluesky/notification`,children:`Notification channel`}),` — notifications with App Password / OAuth`]}),`\n`,_jsxs(_components.li,{children:[`Source: `,_jsx(_components.a,{href:`https://github.com/invokable/laravel-bluesky`,children:`invokable/laravel-bluesky`})]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Authentication methods - Laravel Bluesky","description":"Compare App Password (LegacyAgent) and OAuth (OAuthAgent) in Laravel Bluesky: architecture, implementation, and when to use each.","sidebarTitle":"Authentication methods","href":"/en/packages/laravel-bluesky/authentication"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Overview","slug":"overview","depth":2,"children":[]},{"title":"Architecture","slug":"architecture","depth":2,"children":[]},{"title":"App Password (LegacyAgent)","slug":"app-password-legacyagent","depth":2,"children":[{"title":"Authentication flow","slug":"authentication-flow","depth":3,"children":[]},{"title":"Bluesky::login()","slug":"blueskylogin","depth":3,"children":[]},{"title":"Resuming a LegacySession","slug":"resuming-a-legacysession","depth":3,"children":[]},{"title":"LegacySession keys","slug":"legacysession-keys","depth":3,"children":[]},{"title":"When to use App Password","slug":"when-to-use-app-password","depth":3,"children":[]}]},{"title":"OAuth (OAuthAgent)","slug":"oauth-oauthagent","depth":2,"children":[{"title":"Authentication flow","slug":"authentication-flow-2","depth":3,"children":[]},{"title":"Bluesky::withToken()","slug":"blueskywithtoken","depth":3,"children":[]},{"title":"OAuthSession keys","slug":"oauthsession-keys","depth":3,"children":[]},{"title":"When to use OAuth","slug":"when-to-use-oauth","depth":3,"children":[]}]},{"title":"API calls are identical after authentication","slug":"api-calls-are-identical-after-authentication","depth":2,"children":[]},{"title":"Choosing between the two","slug":"choosing-between-the-two","depth":2,"children":[]},{"title":"Related pages","slug":"related-pages","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"narration":{"path":"en/packages/laravel-bluesky/authentication","locale":"en","estimatedDurationSec":136},"subdomain":"invokable","siteName":"Knowledge of Laravel","title":"Authentication methods - Laravel Bluesky - Knowledge of Laravel","relatedPagesConfig":{"enabled":true,"limit":5,"mode":"automatic"},"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"jp":{"href":"/jp/packages/laravel-bluesky/authentication","matchLevel":1},"en":{"href":"/en/packages/laravel-bluesky/authentication","matchLevel":0},"de":{"href":"/de/packages/laravel-bluesky/authentication","matchLevel":1},"es":{"href":"/es/packages/laravel-bluesky/authentication","matchLevel":1},"fr":{"href":"/fr/packages/laravel-bluesky/authentication","matchLevel":1},"it":{"href":"/it/packages/laravel-bluesky/authentication","matchLevel":1},"ko":{"href":"/ko/packages/laravel-bluesky/authentication","matchLevel":1},"nl":{"href":"/nl/packages/laravel-bluesky/authentication","matchLevel":1},"zh-Hans":{"href":"/zh-CN/packages/laravel-bluesky/authentication","matchLevel":1},"zh-Hant":{"href":"/zh-TW/packages/laravel-bluesky/authentication","matchLevel":1}}},"lastModified":"2026-04-29T05:05:21.311Z","gitLastModified":"2026-04-29T05:05:05.000Z","originalFileLocation":"en/packages/laravel-bluesky/authentication.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Compare App Password (LegacyAgent) and OAuth (OAuthAgent) in Laravel Bluesky: architecture, implementation, and when to use each.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Knowledge of Laravel\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Authentication methods - Laravel Bluesky - Knowledge of Laravel\">\u003cmeta data-mint-head property=\"og:description\" content=\"Compare App Password (LegacyAgent) and OAuth (OAuthAgent) in Laravel Bluesky: architecture, implementation, and when to use each.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Knowledge of Laravel\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://kawax.biz/en/packages/laravel-bluesky/authentication\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://invokable.mintlify.app/_mintlify/api/og/v2?division=Laravel+Bluesky\u0026amp;title=Authentication+methods+-+Laravel+Bluesky\u0026amp;description=Compare+App+Password+%28LegacyAgent%29+and+OAuth+%28OAuthAgent%29+in+Laravel+Bluesky%3A+architecture%2C+implementation%2C+and+when+to+use+each.\u0026amp;theme=e73cb59538246989d21d6ff5\u0026amp;signature=7f9b37077a564554c5bb24735fb025779ecee5bad6ee63b485dfe502851ffac6\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Authentication methods - Laravel Bluesky - Knowledge of Laravel\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Compare App Password (LegacyAgent) and OAuth (OAuthAgent) in Laravel Bluesky: architecture, implementation, and when to use each.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://invokable.mintlify.app/_mintlify/api/og/v2?division=Laravel+Bluesky\u0026amp;title=Authentication+methods+-+Laravel+Bluesky\u0026amp;description=Compare+App+Password+%28LegacyAgent%29+and+OAuth+%28OAuthAgent%29+in+Laravel+Bluesky%3A+architecture%2C+implementation%2C+and+when+to+use+each.\u0026amp;theme=e73cb59538246989d21d6ff5\u0026amp;signature=7f9b37077a564554c5bb24735fb025779ecee5bad6ee63b485dfe502851ffac6\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/invokable/pboFjibLpJPX3oCo/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Knowledge of Laravel\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#16A34A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://kawax.biz/en/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/en/packages/laravel-bluesky/authentication.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://kawax.biz/en/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://kawax.biz/jp/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"de\" href=\"https://kawax.biz/de/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://kawax.biz/es/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"fr\" href=\"https://kawax.biz/fr/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"it\" href=\"https://kawax.biz/it/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://kawax.biz/ko/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"nl\" href=\"https://kawax.biz/nl/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh-Hans\" href=\"https://kawax.biz/zh-CN/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh-Hant\" href=\"https://kawax.biz/zh-TW/packages/laravel-bluesky/authentication\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://kawax.biz/jp/packages/laravel-bluesky/authentication\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://kawax.biz/#organization\",\"name\":\"Knowledge of Laravel\",\"url\":\"https://kawax.biz\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/invokable/AuZ0xql2mAbUyZ99/logo/light.svg?fit=max\u0026auto=format\u0026n=AuZ0xql2mAbUyZ99\u0026q=85\u0026s=df0b7397202a6aa1c1f321620c5aa146\"}},{\"@type\":\"WebSite\",\"@id\":\"https://kawax.biz#website\",\"name\":\"Knowledge of Laravel\",\"url\":\"https://kawax.biz\",\"publisher\":{\"@id\":\"https://kawax.biz/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://kawax.biz/en/packages/laravel-bluesky/authentication#webpage\",\"url\":\"https://kawax.biz/en/packages/laravel-bluesky/authentication\",\"name\":\"Authentication methods - Laravel Bluesky\",\"description\":\"Compare App Password (LegacyAgent) and OAuth (OAuthAgent) in Laravel Bluesky: architecture, implementation, and when to use each.\",\"dateModified\":\"2026-04-29T05:05:05.000Z\",\"isPartOf\":{\"@id\":\"https://kawax.biz#website\"},\"breadcrumb\":{\"@id\":\"https://kawax.biz/en/packages/laravel-bluesky/authentication#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://kawax.biz/en/packages/laravel-bluesky/authentication#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"SDK\",\"item\":\"https://kawax.biz/en/packages/laravel-bluesky/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Laravel Bluesky\",\"item\":\"https://kawax.biz/en/packages/laravel-bluesky/index\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Authentication methods - Laravel Bluesky\",\"item\":\"https://kawax.biz/en/packages/laravel-bluesky/authentication\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://kawax.biz/en/packages/laravel-bluesky/authentication#article\",\"headline\":\"Authentication methods - Laravel Bluesky\",\"name\":\"Authentication methods - Laravel Bluesky\",\"description\":\"Compare App Password (LegacyAgent) and OAuth (OAuthAgent) in Laravel Bluesky: architecture, implementation, and when to use each.\",\"url\":\"https://kawax.biz/en/packages/laravel-bluesky/authentication\",\"mainEntityOfPage\":{\"@id\":\"https://kawax.biz/en/packages/laravel-bluesky/authentication#webpage\"},\"dateModified\":\"2026-04-29T05:05:05.000Z\",\"publisher\":{\"@id\":\"https://kawax.biz/#organization\"},\"isPartOf\":{\"@id\":\"https://kawax.biz#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Knowledge of Laravel\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Knowledge of Laravel","nav":{"global":null,"languages":[{"language":"jp","default":true,"pages":[{"title":"jp","href":"/jp/packages/laravel-bluesky/authentication"}]},{"language":"en","tabs":[{"tab":"My Packages","groups":[{"group":"GitHub Copilot","pages":[{"title":"Laravel Boost custom agent for GitHub Copilot CLI","href":"/en/packages/laravel-boost-copilot-cli"},{"title":"Laravel Boost Custom Agent for PhpStorm with GitHub Copilot","href":"/en/packages/laravel-boost-phpstorm-copilot"},{"group":"GitHub Copilot SDK for Laravel","expanded":false,"pages":[{"title":"GitHub Copilot SDK for Laravel","href":"/en/packages/laravel-copilot-sdk/index"},{"title":"Getting started - GitHub Copilot SDK for Laravel","sidebarTitle":"Getting started","href":"/en/packages/laravel-copilot-sdk/getting-started"},{"title":"Authentication - GitHub Copilot SDK for Laravel","sidebarTitle":"Authentication","href":"/en/packages/laravel-copilot-sdk/auth"},{"title":"SessionConfig","href":"/en/packages/laravel-copilot-sdk/session-config"},{"title":"Permission requests","href":"/en/packages/laravel-copilot-sdk/permission-request"},{"title":"SessionEvent","href":"/en/packages/laravel-copilot-sdk/session-event"},{"title":"RPC (Remote Procedure Call)","href":"/en/packages/laravel-copilot-sdk/rpc"},{"title":"Models","href":"/en/packages/laravel-copilot-sdk/models"},{"title":"Resume session","href":"/en/packages/laravel-copilot-sdk/resume"},{"title":"Session AI credit limits","href":"/en/packages/laravel-copilot-sdk/session-limits"},{"title":"Tools","href":"/en/packages/laravel-copilot-sdk/tools"},{"title":"Ask user","href":"/en/packages/laravel-copilot-sdk/ask-user"},{"title":"MCP","href":"/en/packages/laravel-copilot-sdk/mcp"},{"title":"Session hooks","href":"/en/packages/laravel-copilot-sdk/hooks"},{"title":"Skills","href":"/en/packages/laravel-copilot-sdk/skills"},{"title":"Plugin Directories","href":"/en/packages/laravel-copilot-sdk/plugin-directories"},{"title":"Custom agents","href":"/en/packages/laravel-copilot-sdk/custom-agents"},{"title":"Fleet Mode","href":"/en/packages/laravel-copilot-sdk/fleet-mode"},{"title":"Agent loop","href":"/en/packages/laravel-copilot-sdk/agent-loop"},{"title":"Events","href":"/en/packages/laravel-copilot-sdk/events"},{"title":"send() and on()","href":"/en/packages/laravel-copilot-sdk/send-on"},{"title":"Streaming","href":"/en/packages/laravel-copilot-sdk/streaming"},{"title":"Streaming events","href":"/en/packages/laravel-copilot-sdk/streaming-events"},{"title":"Attachments","href":"/en/packages/laravel-copilot-sdk/attachments"},{"title":"Testing - GitHub Copilot SDK for Laravel","sidebarTitle":"Testing","href":"/en/packages/laravel-copilot-sdk/fake"},{"title":"Laravel Cloud - GitHub Copilot SDK for Laravel","sidebarTitle":"Laravel Cloud","href":"/en/packages/laravel-copilot-sdk/laravel-cloud"},{"title":"GitHub Actions - GitHub Copilot SDK for Laravel","sidebarTitle":"GitHub Actions","href":"/en/packages/laravel-copilot-sdk/github-actions"},{"title":"GitHub token","href":"/en/packages/laravel-copilot-sdk/github-token"},{"title":"Laravel AI SDK integration","href":"/en/packages/laravel-copilot-sdk/ai-sdk"},{"title":"Bundle Copilot CLI","href":"/en/packages/laravel-copilot-sdk/bundle-cli"},{"title":"TCP mode","href":"/en/packages/laravel-copilot-sdk/tcp-mode"},{"title":"Remote Sessions","href":"/en/packages/laravel-copilot-sdk/remote-sessions"},{"title":"Cloud Sessions","href":"/en/packages/laravel-copilot-sdk/cloud-sessions"},{"title":"AHP Host","href":"/en/packages/laravel-copilot-sdk/ahp"},{"title":"Session context and filtering","href":"/en/packages/laravel-copilot-sdk/session-context"},{"title":"Session lifecycle events","href":"/en/packages/laravel-copilot-sdk/session-lifecycle-event"},{"title":"Telemetry","href":"/en/packages/laravel-copilot-sdk/telemetry"},{"title":"Custom providers","href":"/en/packages/laravel-copilot-sdk/custom-providers"},{"title":"Concurrency","href":"/en/packages/laravel-copilot-sdk/concurrency"},{"title":"Steering and queueing","href":"/en/packages/laravel-copilot-sdk/steering"},{"title":"Official SDK-compatible layer","href":"/en/packages/laravel-copilot-sdk/bare-usage"}]}]},{"group":"SDK","pages":[{"group":"Laravel Bluesky","expanded":false,"pages":[{"title":"Laravel Bluesky","href":"/en/packages/laravel-bluesky/index"},{"title":"Basic client - Laravel Bluesky","sidebarTitle":"Basic client","href":"/en/packages/laravel-bluesky/basic-client"},{"title":"Bot tutorial - Laravel Bluesky","sidebarTitle":"Bot tutorial","href":"/en/packages/laravel-bluesky/bot-tutorial"},{"title":"TextBuilder","description":"Detailed guide for TextBuilder, the class that constructs Bluesky rich text (facets) in PHP.","href":"/en/packages/laravel-bluesky/text-builder"},{"title":"Authentication methods - Laravel Bluesky","sidebarTitle":"Authentication methods","href":"/en/packages/laravel-bluesky/authentication"},{"title":"Socialite - Laravel Bluesky","description":"Bluesky OAuth authentication with Laravel Socialite. AT Protocol-specific DPoP and PAR endpoint setup and usage.","sidebarTitle":"Socialite","href":"/en/packages/laravel-bluesky/socialite"},{"title":"Notification channel - Laravel Bluesky","sidebarTitle":"Notification channel","href":"/en/packages/laravel-bluesky/notification"},{"title":"Testing","href":"/en/packages/laravel-bluesky/testing"},{"title":"Identity","href":"/en/packages/laravel-bluesky/identity"},{"title":"Routes","href":"/en/packages/laravel-bluesky/route"},{"title":"Verify","href":"/en/packages/laravel-bluesky/verify"},{"title":"Feed Generator","href":"/en/packages/laravel-bluesky/feed-generator"},{"title":"Labeler","href":"/en/packages/laravel-bluesky/labeler"},{"title":"BlueskyManager and HasShortHand","href":"/en/packages/laravel-bluesky/bluesky-manager"},{"title":"WebSocket (Jetstream / Firehose)","href":"/en/packages/laravel-bluesky/websocket"},{"title":"Crypto — AT Protocol Cryptography","href":"/en/packages/laravel-bluesky/crypto"},{"title":"Core — AT Protocol Core Operations","href":"/en/packages/laravel-bluesky/core"}]},{"title":"Laravel Nostr","href":"/en/packages/laravel-nostr"},{"title":"Laravel Notification for Discord(Webhook)","href":"/en/packages/laravel-notification-discord-webhook"},{"title":"Socialite for Discord","href":"/en/packages/socialite-discord"},{"group":"LINE SDK for Laravel","expanded":false,"pages":[{"title":"LINE SDK for Laravel","sidebarTitle":"Overview","href":"/en/packages/laravel-line-sdk/index"},{"title":"Webhook / Bot - LINE SDK for Laravel","sidebarTitle":"Webhook / Bot","href":"/en/packages/laravel-line-sdk/bot"},{"title":"Notifications - LINE SDK for Laravel","sidebarTitle":"Notifications","href":"/en/packages/laravel-line-sdk/notification"},{"title":"Socialite (LINE Login) - LINE SDK for Laravel","sidebarTitle":"Socialite (LINE Login)","href":"/en/packages/laravel-line-sdk/socialite"}]},{"group":"Google Sheets API for Laravel","expanded":false,"pages":[{"title":"Google Sheets API for Laravel","sidebarTitle":"Google Sheets","href":"/en/packages/laravel-google-sheets/index"},{"title":"Service Account Authentication - Google Sheets API for Laravel","sidebarTitle":"Service Account","href":"/en/packages/laravel-google-sheets/service-account"},{"title":"OAuth 2.0 Authentication - Google Sheets API for Laravel","sidebarTitle":"OAuth 2.0","href":"/en/packages/laravel-google-sheets/oauth"}]}]},{"group":"AI SDK","pages":[{"title":"Amazon Bedrock driver for Laravel AI SDK","href":"/en/packages/laravel-amazon-bedrock"}]},{"group":"VOICEVOX","pages":[{"group":"VOICEVOX Core for PHP","expanded":false,"pages":[{"title":"VOICEVOX Core for PHP","sidebarTitle":"Overview","href":"/en/packages/voicevox-core-php/index"},{"title":"Usage - VOICEVOX Core for PHP","sidebarTitle":"Usage","href":"/en/packages/voicevox-core-php/usage"},{"title":"API Reference - VOICEVOX Core for PHP","sidebarTitle":"API Reference","href":"/en/packages/voicevox-core-php/api"}]},{"group":"VOICEVOX for Laravel","expanded":false,"pages":[{"title":"VOICEVOX for Laravel","sidebarTitle":"Overview","href":"/en/packages/laravel-voicevox/index"},{"title":"Installation and setup - VOICEVOX for Laravel","sidebarTitle":"Installation","href":"/en/packages/laravel-voicevox/installation"},{"title":"Getting started - VOICEVOX for Laravel","sidebarTitle":"Getting started","href":"/en/packages/laravel-voicevox/getting-started"},{"title":"Configuration reference - VOICEVOX for Laravel","sidebarTitle":"Configuration","href":"/en/packages/laravel-voicevox/configuration"},{"title":"Client Mode: Talk (Text-to-Speech) - VOICEVOX for Laravel","sidebarTitle":"Client: Talk","href":"/en/packages/laravel-voicevox/client-talk"},{"title":"Client Mode: Song (Singing Synthesis) - VOICEVOX for Laravel","sidebarTitle":"Client: Song","href":"/en/packages/laravel-voicevox/client-song"},{"title":"Client mode - User Dictionary - VOICEVOX for Laravel","sidebarTitle":"Client mode - User Dictionary","href":"/en/packages/laravel-voicevox/client-user-dict"},{"title":"Client mode - Presets - VOICEVOX for Laravel","sidebarTitle":"Client mode - Presets","href":"/en/packages/laravel-voicevox/client-presets"},{"title":"Native mode: Talk (text-to-speech) - VOICEVOX for Laravel","sidebarTitle":"Native: Talk","href":"/en/packages/laravel-voicevox/native-talk"},{"title":"Native Mode: Song (Singing Synthesis) - VOICEVOX for Laravel","sidebarTitle":"Native: Song","href":"/en/packages/laravel-voicevox/native-song"},{"title":"Native mode - User Dictionary - VOICEVOX for Laravel","sidebarTitle":"Native mode - User Dictionary","href":"/en/packages/laravel-voicevox/native-user-dict"},{"title":"Native mode - Presets - VOICEVOX for Laravel","sidebarTitle":"Native mode - Presets","href":"/en/packages/laravel-voicevox/native-presets"},{"title":"Engine API Mode: Talk (Text-to-Speech) - VOICEVOX for Laravel","sidebarTitle":"Engine API: Talk","href":"/en/packages/laravel-voicevox/engine-talk"},{"title":"Engine API Mode: Song (Singing Synthesis) - VOICEVOX for Laravel","sidebarTitle":"Engine API: Song","href":"/en/packages/laravel-voicevox/engine-song"},{"title":"Score and Note Deep Dive - VOICEVOX for Laravel","sidebarTitle":"Score and Note","href":"/en/packages/laravel-voicevox/song-score-note"},{"title":"VoicevoxResponse - VOICEVOX for Laravel","sidebarTitle":"VoicevoxResponse","href":"/en/packages/laravel-voicevox/response"},{"title":".vvproj File Format - VOICEVOX for Laravel","sidebarTitle":".vvproj","href":"/en/packages/laravel-voicevox/vvproj"},{"title":"Guide to Building Apps with VOICEVOX Engine API","sidebarTitle":"App Development Guide","href":"/en/packages/laravel-voicevox/app-guide"},{"title":"Laravel AI SDK Integration - VOICEVOX for Laravel","sidebarTitle":"AI SDK","href":"/en/packages/laravel-voicevox/ai-sdk"}]},{"group":"VOICEVOX Engine API Reference","pages":[{"group":"Query Creation","pages":[{"title":"Create query for speech synthesis","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /audio_query","href":"/en/packages/laravel-voicevox/engine-api/query-creation/create-query-for-speech-synthesis"},{"title":"Create query for speech synthesis using preset","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /audio_query_from_preset","href":"/en/packages/laravel-voicevox/engine-api/query-creation/create-query-for-speech-synthesis-using-preset"},{"title":"Create query for singing voice synthesis","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /sing_frame_audio_query","href":"/en/packages/laravel-voicevox/engine-api/query-creation/create-query-for-singing-voice-synthesis"}]},{"group":"Query Editing","pages":[{"title":"Get accent phrases from text","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /accent_phrases","href":"/en/packages/laravel-voicevox/engine-api/query-editing/get-accent-phrases-from-text"},{"title":"Get phoneme lengths and pitch from accent phrases","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /mora_data","href":"/en/packages/laravel-voicevox/engine-api/query-editing/get-phoneme-lengths-and-pitch-from-accent-phrases"},{"title":"Get phoneme lengths from accent phrases","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /mora_length","href":"/en/packages/laravel-voicevox/engine-api/query-editing/get-phoneme-lengths-from-accent-phrases"},{"title":"Get pitch from accent phrases","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /mora_pitch","href":"/en/packages/laravel-voicevox/engine-api/query-editing/get-pitch-from-accent-phrases"},{"title":"Get frame-by-frame fundamental frequency from a score / singing voice synthesis query","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /sing_frame_f0","href":"/en/packages/laravel-voicevox/engine-api/query-editing/get-frame-by-frame-fundamental-frequency-from-a-score-singing-voice-synthesis-query"},{"title":"Get frame-by-frame volume from a score / singing voice synthesis query","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /sing_frame_volume","href":"/en/packages/laravel-voicevox/engine-api/query-editing/get-frame-by-frame-volume-from-a-score-singing-voice-synthesis-query"}]},{"group":"Speech Synthesis","pages":[{"title":"Perform speech synthesis","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /synthesis","href":"/en/packages/laravel-voicevox/engine-api/speech-synthesis/perform-speech-synthesis"},{"title":"Perform speech synthesis (cancellable)","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /cancellable_synthesis","href":"/en/packages/laravel-voicevox/engine-api/speech-synthesis/perform-speech-synthesis-cancellable"},{"title":"Synthesize multiple speeches at once","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /multi_synthesis","href":"/en/packages/laravel-voicevox/engine-api/speech-synthesis/synthesize-multiple-speeches-at-once"},{"title":"Frame Synthesis","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /frame_synthesis","href":"/en/packages/laravel-voicevox/engine-api/speech-synthesis/frame-synthesis"},{"title":"Check if morphing is possible for specified style","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /morphable_targets","href":"/en/packages/laravel-voicevox/engine-api/speech-synthesis/check-if-morphing-is-possible-for-specified-style"},{"title":"Synthesize speech morphed with two styles","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /synthesis_morphing","href":"/en/packages/laravel-voicevox/engine-api/speech-synthesis/synthesize-speech-morphed-with-two-styles"}]},{"group":"OpenAI Compatible","pages":[{"title":"Create speech with an OpenAI-compatible API","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /v1/audio/speech","href":"/en/packages/laravel-voicevox/engine-api/openai-compatible/create-speech-with-an-openai-compatible-api"}]},{"group":"Other","pages":[{"title":"Combine multiple base64-encoded wav data into one","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /connect_waves","href":"/en/packages/laravel-voicevox/engine-api/other/combine-multiple-base64-encoded-wav-data-into-one"},{"title":"Validate AquesTalk-style notation","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /validate_kana","href":"/en/packages/laravel-voicevox/engine-api/other/validate-aquestalk-style-notation"},{"title":"Initialize Speaker","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /initialize_speaker","href":"/en/packages/laravel-voicevox/engine-api/other/initialize-speaker"},{"title":"Is Initialized Speaker","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /is_initialized_speaker","href":"/en/packages/laravel-voicevox/engine-api/other/is-initialized-speaker"},{"title":"Supported Devices","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /supported_devices","href":"/en/packages/laravel-voicevox/engine-api/other/supported-devices"},{"title":"Get Presets","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /presets","href":"/en/packages/laravel-voicevox/engine-api/other/get-presets"},{"title":"Add Preset","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /add_preset","href":"/en/packages/laravel-voicevox/engine-api/other/add-preset"},{"title":"Update Preset","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /update_preset","href":"/en/packages/laravel-voicevox/engine-api/other/update-preset"},{"title":"Delete Preset","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /delete_preset","href":"/en/packages/laravel-voicevox/engine-api/other/delete-preset"},{"title":"Speakers","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /speakers","href":"/en/packages/laravel-voicevox/engine-api/other/speakers"},{"title":"Speaker Info","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /speaker_info","href":"/en/packages/laravel-voicevox/engine-api/other/speaker-info"},{"title":"Singers","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /singers","href":"/en/packages/laravel-voicevox/engine-api/other/singers"},{"title":"Singer Info","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /singer_info","href":"/en/packages/laravel-voicevox/engine-api/other/singer-info"},{"title":"Version","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /version","href":"/en/packages/laravel-voicevox/engine-api/other/version"},{"title":"Core Versions","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /core_versions","href":"/en/packages/laravel-voicevox/engine-api/other/core-versions"},{"title":"Engine Manifest","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /engine_manifest","href":"/en/packages/laravel-voicevox/engine-api/other/engine-manifest"},{"title":"Get Portal Page","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /","href":"/en/packages/laravel-voicevox/engine-api/other/get-portal-page"}]},{"group":"Voice Library Management","pages":[{"title":"Downloadable Libraries","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /downloadable_libraries","href":"/en/packages/laravel-voicevox/engine-api/voice-library-management/downloadable-libraries"},{"title":"Installed Libraries","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /installed_libraries","href":"/en/packages/laravel-voicevox/engine-api/voice-library-management/installed-libraries"},{"title":"Install Library","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /install_library/{library_uuid}","href":"/en/packages/laravel-voicevox/engine-api/voice-library-management/install-library"},{"title":"Uninstall Library","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /uninstall_library/{library_uuid}","href":"/en/packages/laravel-voicevox/engine-api/voice-library-management/uninstall-library"}]},{"group":"User Dictionary","pages":[{"title":"Get User Dict Words","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /user_dict","href":"/en/packages/laravel-voicevox/engine-api/user-dictionary/get-user-dict-words"},{"title":"Add User Dict Word","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /user_dict_word","href":"/en/packages/laravel-voicevox/engine-api/user-dictionary/add-user-dict-word"},{"title":"Rewrite User Dict Word","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json put /user_dict_word/{word_uuid}","href":"/en/packages/laravel-voicevox/engine-api/user-dictionary/rewrite-user-dict-word"},{"title":"Delete User Dict Word","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json delete /user_dict_word/{word_uuid}","href":"/en/packages/laravel-voicevox/engine-api/user-dictionary/delete-user-dict-word"},{"title":"Import User Dict Words","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /import_user_dict","href":"/en/packages/laravel-voicevox/engine-api/user-dictionary/import-user-dict-words"}]},{"group":"Settings","pages":[{"title":"Setting Get","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json get /setting","href":"/en/packages/laravel-voicevox/engine-api/settings/setting-get"},{"title":"Setting Post","deprecated":null,"version":null,"openapi":"https://raw.githubusercontent.com/invokable/laravel-voicevox/refs/heads/main/docs/en/laravel-openapi.json post /setting","href":"/en/packages/laravel-voicevox/engine-api/settings/setting-post"}]}]}]},{"group":"Starter Kits","pages":[{"group":"Laravel Console Starter","pages":[{"title":"Laravel Console Starter","href":"/en/packages/laravel-console-starter/index"},{"title":"Tutorial - Laravel Console Starter","sidebarTitle":"Tutorial","href":"/en/packages/laravel-console-starter/tutorial"}]}]},{"group":"Feeds and RSS","pages":[{"title":"Laravel FullFeed","href":"/en/packages/laravel-fullfeed"},{"group":"Feedable","expanded":false,"pages":[{"title":"Feedable","href":"/en/packages/feedable/index"},{"title":"Core package and custom drivers - Feedable","sidebarTitle":"Core \u0026 custom drivers","href":"/en/packages/feedable/core"},{"title":"Supported sites - Feedable","sidebarTitle":"Supported sites","href":"/en/packages/feedable/drivers"}]}]},{"group":"Middleware","pages":[{"title":"Laravel Fetch Metadata","href":"/en/packages/laravel-fetch-metadata"}]}]},{"tab":"Tutorial","pages":[{"title":"Tutorial","href":"/en/introduction"}]},{"tab":"Guide","pages":[{"title":"Guide","href":"/en/lifecycle"}]},{"tab":"Advanced Topics","pages":[{"title":"Advanced Topics","href":"/en/advanced/mcp-server"}]},{"tab":"Blog","pages":[{"title":"Blog","href":"/en/blog/changelog/202609"}]}]},{"language":"de","pages":[{"title":"de","href":"/de/packages/laravel-bluesky/authentication"}]},{"language":"es","pages":[{"title":"es","href":"/es/packages/laravel-bluesky/authentication"}]},{"language":"fr","pages":[{"title":"fr","href":"/fr/packages/laravel-bluesky/authentication"}]},{"language":"it","pages":[{"title":"it","href":"/it/packages/laravel-bluesky/authentication"}]},{"language":"ko","pages":[{"title":"ko","href":"/ko/packages/laravel-bluesky/authentication"}]},{"language":"nl","pages":[{"title":"nl","href":"/nl/packages/laravel-bluesky/authentication"}]},{"language":"zh-Hans","pages":[{"title":"zh-Hans","href":"/zh-CN/packages/laravel-bluesky/authentication"}]},{"language":"zh-Hant","pages":[{"title":"zh-Hant","href":"/zh-TW/packages/laravel-bluesky/authentication"}]}]},"title":"Authentication methods - Laravel Bluesky - Knowledge of Laravel","buildId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","deploymentId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","dynamics":["2bfc744e19"],"chunks":["NarrationPlayer-CXk9raVM.js","types-CiTgMxws.js","shallow-BCs8SgM7.js"]}