Keep campaign notes encrypted with a separate passkey-derived key, sync ciphertext and preserve conflicting copies.
Your Spoke passkey does two independent jobs: it authorizes account actions and derives a separate key for private campaign notes. Use the notebook for outreach plans, partnership terms or follow-up notes you do not want to share with the merchant.Only encrypted note envelopes sync to Spoke. The server can see the account, campaign, credential identifier, revision and timestamps, but the notes API never receives the plaintext or encryption key. This is encrypted content, not anonymous metadata.
Create or open a notebook
Sign in with your original Spoke passkey. Email and external-wallet sign-ins use different account methods.
Open Earn → Private workspace or a campaign’s private notebook.
Confirm the same passkey to unlock. PRF support must be available from the browser and passkey provider.
Write your note and choose Encrypt & sync. The browser encrypts first, saves a local copy, then sends the encrypted envelope to the API.
The notebook locks after saving. Reopening requires the original passkey. It also locks on navigation, sign-out or after five minutes.
There can be up to 100 synced notebooks per account. If synchronization fails, the local encrypted copy is retained and the UI tells you it has not synced. A local copy alone does not survive clearing that browser’s storage.
Preserve existing notes
Earlier notebooks use the same namespace and encryption format. Open them from their original browser with the original passkey, then explicitly sync. Spoke does not silently replace old local notes with a server copy.When local and server revisions differ, choose which copy to open. Export an encrypted backup before replacing a conflicting copy. Opening a local copy does not overwrite the server until you choose to sync. The API rejects stale revisions instead of silently discarding someone else’s edits.
Encrypted backups and recovery
Use Download encrypted backup to save the envelope. Restoring a backup validates its account, chain, campaign and encryption format, then requires the same passkey to decrypt it before replacing the local copy. A restored local copy is not automatically uploaded.An encrypted backup is useful only while you still have the original passkey with PRF support. A wallet recovery phrase, a newly created passkey or a second independent passkey cannot derive the original note key.
Cross-device restoration is conditional, not guaranteed. The same passkey must
be available through your provider on the second device, with compatible PRF
support. Physical cross-device restoration has not yet been verified for this
release. Do not delete your only working passkey or local copy based on an
assumption that your provider syncs it.
Cryptographic and API boundaries
The notes namespace is spoke.campaign-notes.v1. Mera evaluates its SHA-256 digest as a separate WebAuthn PRF salt. HKDF-SHA-256 derives a non-extractable AES-256-GCM key bound to address, chain, campaign and credential. Every save uses a fresh nonce and authenticated scope. Existing account-key derivation is unchanged.workspace.list, workspace.get and workspace.save require a passkey session. The server validates the strict envelope, registered credential, ownership, current chain and existing campaign; applies CSRF and write limits; and atomically compares revisions. It cannot decrypt or merge the text.Automated tests use actual WebCrypto encryption with a controlled PRF to verify round trips, scope binding, tamper rejection, serialized backup restoration and conflicts. These tests do not substitute for a physical passkey/device demonstration. See the verification procedure.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Spoke","description":"Understand Spoke, run your first testnet sale, and build on the open distribution graph.","colors":{"primary":"#43600D","light":"#C7F35F","dark":"#587B12"},"logo":{"light":"https://mintcdn.com/spoke/5wMf0uXWKeHHpSEJ/logo/light.svg?fit=max\u0026auto=format\u0026n=5wMf0uXWKeHHpSEJ\u0026q=85\u0026s=4ba8c6aa5df17e0e54ebefa7af9ddd93","dark":"https://mintcdn.com/spoke/5wMf0uXWKeHHpSEJ/logo/dark.svg?fit=max\u0026auto=format\u0026n=5wMf0uXWKeHHpSEJ\u0026q=85\u0026s=413e445e910bd9cfdf393f4e6288fd01","href":"/"},"favicon":"https://mintcdn.com/spoke/5wMf0uXWKeHHpSEJ/images/brand/spoke-icon.png?fit=max\u0026auto=format\u0026n=5wMf0uXWKeHHpSEJ\u0026q=85\u0026s=f2bbee8f3749b123bf97260a86839233","navbar":{"links":[{"href":"https://github.com/Enoch208/spoke","label":"GitHub"}],"primary":{"type":"button","label":"Open Spoke","href":"https://usespoke.xyz/explore"}},"footer":{"socials":{"github":"https://github.com/Enoch208/spoke"}},"contextual":{"options":["copy","view","chatgpt","claude","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"spoke","hasAudioNarration":false,"actualSubdomain":"spoke","customDomains":["docs.usespoke.xyz"],"gitSource":{"type":"github","owner":"enoch208","repo":"docs-madonna","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"entitlements":{},"buildId":"6ad0ed696876b3f850a8f537","clientVersion":"0.0.4143","searchFilterCounts":[{"language":"default","tag":"Developers","count":15},{"language":"default","tag":"Use Spoke","count":14},{"language":"default","tag":"Start here","count":8},{"language":"default","tag":"API reference","count":8},{"language":"default","tag":"Read the contract","count":8},{"language":"default","tag":"Build an integration","count":7},{"language":"default","tag":"How Spoke works","count":5},{"language":"default","tag":"Project","count":5},{"language":"default","tag":"Understand the system","count":4},{"language":"default","tag":"Operate and verify","count":4}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","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":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","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":"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":"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":"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":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","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":"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":"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":"turbopuffer-dual-write","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},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","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}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"guides/private-workspace","slug":"/guides/private-workspace","pageMetadata":{"title":"Private partnership workspace","description":"Keep campaign notes encrypted with a separate passkey-derived key, sync ciphertext and preserve conflicting copies.","href":"/guides/private-workspace"},"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: \"Keep campaign notes encrypted with a separate passkey-derived key, sync ciphertext and preserve conflicting copies.\"\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`,ol:`ol`,p:`p`,strong:`strong`,..._provideComponents(),...props.components},{Heading,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Your Spoke passkey does two independent jobs: it authorizes account actions and derives a separate key for private campaign notes. Use the notebook for outreach plans, partnership terms or follow-up notes you do not want to share with the merchant.`}),`\n`,_jsx(_components.p,{children:`Only encrypted note envelopes sync to Spoke. The server can see the account, campaign, credential identifier, revision and timestamps, but the notes API never receives the plaintext or encryption key. This is encrypted content, not anonymous metadata.`}),`\n`,_jsx(Heading,{level:`2`,id:`create-or-open-a-notebook`,children:`Create or open a notebook`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Sign in with your original Spoke passkey. Email and external-wallet sign-ins use different account methods.`}),`\n`,_jsxs(_components.li,{children:[`Open `,_jsx(_components.strong,{children:`Earn → Private workspace`}),` or a campaign’s private notebook.`]}),`\n`,_jsx(_components.li,{children:`Confirm the same passkey to unlock. PRF support must be available from the browser and passkey provider.`}),`\n`,_jsxs(_components.li,{children:[`Write your note and choose `,_jsx(_components.strong,{children:`Encrypt \u0026 sync`}),`. The browser encrypts first, saves a local copy, then sends the encrypted envelope to the API.`]}),`\n`,_jsx(_components.li,{children:`The notebook locks after saving. Reopening requires the original passkey. It also locks on navigation, sign-out or after five minutes.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`There can be up to 100 synced notebooks per account. If synchronization fails, the local encrypted copy is retained and the UI tells you it has not synced. A local copy alone does not survive clearing that browser’s storage.`}),`\n`,_jsx(Heading,{level:`2`,id:`preserve-existing-notes`,children:`Preserve existing notes`}),`\n`,_jsx(_components.p,{children:`Earlier notebooks use the same namespace and encryption format. Open them from their original browser with the original passkey, then explicitly sync. Spoke does not silently replace old local notes with a server copy.`}),`\n`,_jsx(_components.p,{children:`When local and server revisions differ, choose which copy to open. Export an encrypted backup before replacing a conflicting copy. Opening a local copy does not overwrite the server until you choose to sync. The API rejects stale revisions instead of silently discarding someone else’s edits.`}),`\n`,_jsx(Heading,{level:`2`,id:`encrypted-backups-and-recovery`,children:`Encrypted backups and recovery`}),`\n`,_jsxs(_components.p,{children:[`Use `,_jsx(_components.strong,{children:`Download encrypted backup`}),` to save the envelope. Restoring a backup validates its account, chain, campaign and encryption format, then requires the same passkey to decrypt it before replacing the local copy. A restored local copy is not automatically uploaded.`]}),`\n`,_jsx(_components.p,{children:`An encrypted backup is useful only while you still have the original passkey with PRF support. A wallet recovery phrase, a newly created passkey or a second independent passkey cannot derive the original note key.`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Cross-device restoration is conditional, not guaranteed. The same passkey must\nbe available through your provider on the second device, with compatible PRF\nsupport. Physical cross-device restoration has not yet been verified for this\nrelease. Do not delete your only working passkey or local copy based on an\nassumption that your provider syncs it.`})}),`\n`,_jsx(Heading,{level:`2`,id:`cryptographic-and-api-boundaries`,children:`Cryptographic and API boundaries`}),`\n`,_jsxs(_components.p,{children:[`The notes namespace is `,_jsx(_components.code,{children:`spoke.campaign-notes.v1`}),`. Mera evaluates its SHA-256 digest as a separate WebAuthn PRF salt. HKDF-SHA-256 derives a non-extractable AES-256-GCM key bound to address, chain, campaign and credential. Every save uses a fresh nonce and authenticated scope. Existing account-key derivation is unchanged.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`workspace.list`}),`, `,_jsx(_components.code,{children:`workspace.get`}),` and `,_jsx(_components.code,{children:`workspace.save`}),` require a passkey session. The server validates the strict envelope, registered credential, ownership, current chain and existing campaign; applies CSRF and write limits; and atomically compares revisions. It cannot decrypt or merge the text.`]}),`\n`,_jsxs(_components.p,{children:[`Automated tests use actual WebCrypto encryption with a controlled PRF to verify round trips, scope binding, tamper rejection, serialized backup restoration and conflicts. These tests do not substitute for a physical passkey/device demonstration. See the `,_jsx(_components.a,{href:`/project/evidence`,children:`verification procedure`}),`.`]})]})}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":"Private partnership workspace","description":"Keep campaign notes encrypted with a separate passkey-derived key, sync ciphertext and preserve conflicting copies.","href":"/guides/private-workspace"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Create or open a notebook","slug":"create-or-open-a-notebook","depth":2,"children":[]},{"title":"Preserve existing notes","slug":"preserve-existing-notes","depth":2,"children":[]},{"title":"Encrypted backups and recovery","slug":"encrypted-backups-and-recovery","depth":2,"children":[]},{"title":"Cryptographic and API boundaries","slug":"cryptographic-and-api-boundaries","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"spoke","siteName":"Spoke","title":"Private partnership workspace - Spoke","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-15T14:04:20.036Z","originalFileLocation":"guides/private-workspace.mdx"},"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=\"Keep campaign notes encrypted with a separate passkey-derived key, sync ciphertext and preserve conflicting copies.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Spoke\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/spoke/49cAWNRqKaH33mg2/_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/spoke/49cAWNRqKaH33mg2/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/spoke/49cAWNRqKaH33mg2/_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/spoke/49cAWNRqKaH33mg2/_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/spoke/49cAWNRqKaH33mg2/_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/spoke/49cAWNRqKaH33mg2/_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/spoke/49cAWNRqKaH33mg2/_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/spoke/49cAWNRqKaH33mg2/_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/spoke/49cAWNRqKaH33mg2/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Private partnership workspace - Spoke\">\u003cmeta data-mint-head property=\"og:description\" content=\"Keep campaign notes encrypted with a separate passkey-derived key, sync ciphertext and preserve conflicting copies.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Spoke\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.usespoke.xyz/guides/private-workspace\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://spoke.mintlify.site/_mintlify/api/og/v2?division=Partnerships+and+privacy\u0026amp;title=Private+partnership+workspace\u0026amp;description=Keep+campaign+notes+encrypted+with+a+separate+passkey-derived+key%2C+sync+ciphertext+and+preserve+conflicting+copies.\u0026amp;theme=9058e6bebdf49baef60975eb\u0026amp;signature=8d46cb761a97959aae00c2648f6b00727b766358e464583763c1fe04120b1c17\">\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=\"Private partnership workspace - Spoke\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Keep campaign notes encrypted with a separate passkey-derived key, sync ciphertext and preserve conflicting copies.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://spoke.mintlify.site/_mintlify/api/og/v2?division=Partnerships+and+privacy\u0026amp;title=Private+partnership+workspace\u0026amp;description=Keep+campaign+notes+encrypted+with+a+separate+passkey-derived+key%2C+sync+ciphertext+and+preserve+conflicting+copies.\u0026amp;theme=9058e6bebdf49baef60975eb\u0026amp;signature=8d46cb761a97959aae00c2648f6b00727b766358e464583763c1fe04120b1c17\">\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/spoke/49cAWNRqKaH33mg2/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Spoke\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#43600D\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.usespoke.xyz/guides/private-workspace\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/private-workspace.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.usespoke.xyz/#organization\",\"name\":\"Spoke\",\"url\":\"https://docs.usespoke.xyz\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/spoke/5wMf0uXWKeHHpSEJ/logo/light.svg?fit=max\u0026auto=format\u0026n=5wMf0uXWKeHHpSEJ\u0026q=85\u0026s=4ba8c6aa5df17e0e54ebefa7af9ddd93\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.usespoke.xyz#website\",\"name\":\"Spoke\",\"url\":\"https://docs.usespoke.xyz\",\"publisher\":{\"@id\":\"https://docs.usespoke.xyz/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.usespoke.xyz/guides/private-workspace#webpage\",\"url\":\"https://docs.usespoke.xyz/guides/private-workspace\",\"name\":\"Private partnership workspace\",\"description\":\"Keep campaign notes encrypted with a separate passkey-derived key, sync ciphertext and preserve conflicting copies.\",\"dateModified\":\"2026-10-15T14:04:20.036Z\",\"isPartOf\":{\"@id\":\"https://docs.usespoke.xyz#website\"},\"breadcrumb\":{\"@id\":\"https://docs.usespoke.xyz/guides/private-workspace#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.usespoke.xyz/guides/private-workspace#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Partnerships and privacy\",\"item\":\"https://docs.usespoke.xyz/guides/partner-passport\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Private partnership workspace\",\"item\":\"https://docs.usespoke.xyz/guides/private-workspace\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.usespoke.xyz/guides/private-workspace#article\",\"headline\":\"Private partnership workspace\",\"name\":\"Private partnership workspace\",\"description\":\"Keep campaign notes encrypted with a separate passkey-derived key, sync ciphertext and preserve conflicting copies.\",\"url\":\"https://docs.usespoke.xyz/guides/private-workspace\",\"mainEntityOfPage\":{\"@id\":\"https://docs.usespoke.xyz/guides/private-workspace#webpage\"},\"dateModified\":\"2026-10-15T14:04:20.036Z\",\"publisher\":{\"@id\":\"https://docs.usespoke.xyz/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.usespoke.xyz#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Spoke\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Spoke\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/guides/private-workspace.md","siteName":"Spoke","nav":{"global":null,"tabs":[{"tab":"Start here","pages":[{"title":"Start here","href":""}]},{"tab":"Use Spoke","groups":[{"group":"Your journey","pages":[{"title":"For merchants","href":"/guides/merchants"},{"title":"For distributors","href":"/guides/distributors"},{"title":"For buyers","href":"/guides/buyers"}]},{"group":"Partnerships and privacy","pages":[{"title":"Partner Passport and live network","href":"/guides/partner-passport"},{"title":"Partner Intelligence","description":"Use sourced wallet context alongside verified Spoke performance when choosing a distribution partner.","href":"/guides/partner-intelligence"},{"title":"Private partnership workspace","href":"/guides/private-workspace"}]},{"group":"Campaigns and purchases","pages":[{"title":"Launch a campaign","description":"Plan the product, policy, budget, and settlement checks for a complete testnet campaign launch.","href":"/guides/campaign-launch"},{"title":"Products and delivery","href":"/guides/product-delivery"},{"title":"Refunds, finalization, and claims","href":"/guides/refunds-and-claims"},{"title":"Read and verify a receipt","href":"/guides/reading-receipts"}]},{"group":"Your account and help","pages":[{"title":"Accounts and navigation","href":"/guides/accounts"},{"title":"Aurora wallet funding","href":"/guides/wallet-funding"},{"title":"Troubleshooting","href":"/guides/troubleshooting"},{"title":"Frequently asked questions","href":"/guides/faq"}]}]},{"tab":"Developers","pages":[{"title":"Developers","href":"/developers/architecture"}]},{"tab":"API reference","pages":[{"title":"API reference","href":"/reference/overview"}]},{"tab":"Project","pages":[{"title":"Project","href":"/project/status"}]}]},"basePath":"","title":"Private partnership workspace - Spoke","buildId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","deploymentId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","dynamics":[],"chunks":[]}