How Offline Protocol fits together: application, Rust protocol core, platform transport bridges, identity and storage, and upstream backend integration.
Application: workflow, permissions, durable business records |SDK: identity, messaging, replicated documents, services |Platform bridges: Bluetooth, peer streams, relay / gateway paths | Nearby devices and remote peers
The application defines the work, enrolls devices and decides what constitutes acceptance. It can use messages, documents and service calls together. A backend adapter maps locally completed work into the existing system of record.
The Rust core manages protocol state, MLS, routing, reliability and replication. It queues frames for platform I/O. It does not turn an unsupported radio into a transport.
React Native supplies native bridges for mobile platforms. Python supplies desktop transport managers. Rust and constrained firmware integrations provide the relevant I/O and storage implementations. See platforms.
A stable application/profile namespace selects local identity and persisted state. The derived device address identifies the peer on the network. User accounts are an application concern; the hosted OfflineID SDK is an optional separate integration.
A local workflow can coexist with direct cloud communication. A collector or gateway is added where the topology requires it. Retained events reach a backend through an explicit adapter and acceptance contract, described in backend delivery.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Offline Protocol","description":"Offline Protocol developer documentation: the offline mesh networking SDK for React Native, Python and Rust, BLE messaging, OfflineID, CLI, MCP server and APIs.","colors":{"primary":"#264a82","light":"#8fb6f2","dark":"#1a3a6e"},"logo":{"light":"https://mintcdn.com/offlineprotocol/YyeFdR-brjMBY-La/logo/light.png?fit=max\u0026auto=format\u0026n=YyeFdR-brjMBY-La\u0026q=85\u0026s=4f7832ee21c4f4f352d18b64550d9b77","dark":"https://mintcdn.com/offlineprotocol/YyeFdR-brjMBY-La/logo/dark.png?fit=max\u0026auto=format\u0026n=YyeFdR-brjMBY-La\u0026q=85\u0026s=58db71158e2ae1ec639c6c8c96575316"},"favicon":{"light":"https://mintcdn.com/offlineprotocol/VMldQlbkvDhV1TSC/favicon.png?fit=max\u0026auto=format\u0026n=VMldQlbkvDhV1TSC\u0026q=85\u0026s=14651d53ad7683a3f917535260caac5d","dark":"https://mintcdn.com/offlineprotocol/VMldQlbkvDhV1TSC/favicon-white.png?fit=max\u0026auto=format\u0026n=VMldQlbkvDhV1TSC\u0026q=85\u0026s=850d8841e91475ed1f4fe5239a2c773f"},"api":{"openapi":"api-reference/openapi.json"},"navbar":{"links":[{"href":"mailto:support@offlineprotocol.com","label":"Support"}],"primary":{"type":"button","label":"Developer portal","href":"https://dev.offlineprotocol.com"}},"footer":{"socials":{"x":"https://x.com/offlineprotocol","github":"https://github.com/offline-protocol","linkedin":"https://linkedin.com/company/offlineprotocol"},"links":[{"header":"Legal","items":[{"label":"Privacy policy","href":"https://www.offlineprotocol.com/privacy"},{"label":"Developer terms","href":"https://www.offlineprotocol.com/legal/developer-terms"},{"label":"Acceptable use","href":"https://www.offlineprotocol.com/legal/acceptable-use"}]},{"header":"Data processing","items":[{"label":"Addendum (DPA)","href":"https://www.offlineprotocol.com/legal/dpa"},{"label":"Handling by service","href":"https://www.offlineprotocol.com/docs/legal/data-handling"}]},{"header":"Policies","items":[{"label":"Policies and licensing","href":"https://www.offlineprotocol.com/docs/legal"},{"label":"Report a vulnerability","href":"https://www.offlineprotocol.com/legal/security"}]}]},"search":{"prompt":"Search workflows, methods and errors…"},"seo":{"metatags":{"canonical":"https://www.offlineprotocol.com/docs","og:image":"https://www.offlineprotocol.com/docs/images/og/docs.8a97016a43.png","og:image:alt":"Offline Protocol developer documentation","twitter:image":"https://www.offlineprotocol.com/docs/images/og/docs.8a97016a43.png","twitter:site":"@offlineprotocol","og:site_name":"Offline Protocol"},"organization":{"id":"https://www.offlineprotocol.com/#organization","name":"Offline Protocol","url":"https://www.offlineprotocol.com","sameAs":["https://x.com/offlineprotocol","https://github.com/Offline-Protocol","https://www.linkedin.com/company/offlineprotocol","https://www.npmjs.com/org/offline-protocol"]},"indexing":"navigable"},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"markdown":{"instructions":["These docs target Mesh SDK v0.31.0. Match the installed package and binding before generating code. Start at /getting-started/agents for task-specific reading paths. Apps that call enableTelemetry on 0.26.0 to 0.29.0 should update to 0.30.0 or later: the telemetry uploader trusts only the telemetry endpoint's issuing roots from 0.30.0.","Call the company and product Offline Protocol, never Offline alone. Current packages: @offline-protocol/mesh-sdk 0.31.0 (React Native), offline-protocol-sdk 0.31.0 on PyPI (Python 3.10 to 3.13; wheels for macOS 14+ arm64, Linux x86_64 and aarch64 with glibc 2.34+, Windows x86_64; other hosts build from source; extras lan and http add LAN discovery, the HTTP front and offline-protocol-verify), the offline-protocol crates 0.31.0 on crates.io, the OfflineProtocolSDK Swift package 0.31.0 (preview, iOS 13+ only), the Android library com.offlineprotocol:offline-protocol-sdk 0.31.0 on Maven Central (preview, minSdk 24), the Java binding com.offlineprotocol:offline-protocol-java 0.31.0 on Maven Central (JDK 22+, native library from the GitHub release's desktop archives), the C header offline_protocol.h with the native library in the GitHub release's desktop archives, the Ruby binding offline_protocol 0.31.0 on RubyGems (Ruby 3.3+, native library from the GitHub release's desktop archives), the browser binding (experimental; the offline-protocol-web crate 0.31.0 on crates.io, with the JavaScript in bindings/web built from the SDK repository, not on npm), the offline_protocol Flutter plugin (preview, not on pub.dev; a path dependency on the SDK repository at tag v0.31.0; MeshSdk carries the React Native module's native surface), the service container image ghcr.io/offline-protocol/offline-protocol-service 0.31.0 (linux/amd64 and linux/arm64), @offline-protocol/id-react 0.2.0, @offline-protocol/id-react-native 0.3.3, @offline-protocol/pol 0.1.2 and @offline-protocol/cli 0.2.9. Canonical docs URLs start with https://www.offlineprotocol.com/docs.","The Mesh SDK runs in a native app or gateway, and from 0.31.0 in a browser through the experimental browser binding (a full node in a Web Worker; see /mesh-sdk/web). The OfflineID SDK for React does not provide browser mesh transport. Local mesh operation does not require a portal account or API key. The Mesh SDK appId is a mesh app identifier the developer chooses, not the portal App ID (app_...) that OfflineID and Proof of Location require.","In v0.31.0 service RPC bodies are sealed in the 1:1 MLS session once the recipient runs 0.29 or later and the session is confirmed; discovery, the first request to a provider never met, and requests to older peers are signed plaintext, so keep secrets out of service bodies unless the event says encrypted: true. The HTTP front (offline-protocol-service --http) always carries calls inside encrypted direct messages but does not authorize callers. Message delivery, durable local acceptance and backend commit are distinct outcomes. Use the workflow guide for the required application logic.","Offline Protocol CLI 0.2.9 is on npm (@offline-protocol/cli, command offline). Its local MCP server, named offline-protocol, runs with npx -y @offline-protocol/cli@0.2.9 mcp serve and requires no login or key. Hosted MCP is at https://mcp.offlineprotocol.com/mcp with an app API key in Authorization: Bearer and the matching App ID in x-app-id; organization keys are rejected, and Claude Desktop and Claude.ai cannot send these headers; there, use the public read-only endpoint https://mcp.offlineprotocol.com/public/mcp as a custom connector, or local MCP to scaffold or edit projects. Follow /tools/overview for setup and do not invent commands beyond it. MCP provides integration context and planning, not mesh execution; file-writing tools are local only.","In v0.31.0 phone Wi-Fi peer streams carry data: Android over Wi-Fi Direct (the SDK forms the group with autoAccept on Android 10+) and over the Wi-Fi network it is on (DNS-SD), iOS over Network framework (LAN or AWDL). Android and iOS meet over that slot only on a shared Wi-Fi network that allows multicast; iOS 0.28 and later does not see iOS 0.27 or earlier over it. Otherwise use BLE or a provisioned relay across platforms. The Swift and Android packages are previews; the Android library is on Maven Central from 0.29.0 only, so never give a Gradle line for an earlier version. The receiver core ACKs before application persistence; use application acceptance for durable workflows.","Proof of Location is Sepolia testnet witness evidence, not zero-knowledge proof or proof of presence. The geohash is public onchain. Read /proof-of-location/security before integration."]},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/Offline-Protocol/offline-protocol-sdk"},{"anchor":"Website","icon":"globe","href":"https://www.offlineprotocol.com"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"offlineprotocol","hasAudioNarration":false,"actualSubdomain":"offlineprotocol","customDomains":["www.offlineprotocol.com"],"gitSource":{"type":"github","owner":"offline-protocol","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae0fe3aab7f7e6e9a9f2cd1","collectionId":"c66f6069-5cfb-42ec-9605-4e9eba8e8512","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae0fe3aab7f7e6e9a9f2cd1"},"entitlements":{},"buildId":"6ae0fe3aab7f7e6e9a9f2cd1","clientVersion":"0.0.4006","searchFilterCounts":[{"language":"default","tag":"SDK reference","count":42},{"language":"default","tag":"Identity and hosted APIs","count":32},{"language":"default","tag":"Build","count":24},{"language":"default","tag":"SDK setup","count":16},{"language":"default","tag":"Profiles","count":11},{"language":"default","tag":"API by task","count":11},{"language":"default","tag":"Architecture","count":8},{"language":"default","tag":"Start here","count":7},{"language":"default","tag":"Types and events","count":7},{"language":"default","tag":"OfflineID SDK","count":6}]},"assistantConfig":{},"basePath":"/docs","hasChatPermissions":false,"hasWebMcpPermissions":false,"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}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"body,html{background-color:#fff}html.dark,html.dark body{background-color:#0a0b0e}#footer a[href*=\"mintlify.com\"]{color:#59616e}.dark #footer a,.dark #footer a[href*=\"mintlify.com\"],.dark [data-component-part=field-info-pill] .text-stone-400{color:#a9b0bc}html:not(.dark) #footer a,html:not(.dark) .text-gray-500{color:#59616e}html:not(.dark) .method-nav-pill .text-green-700{color:#166534}html:not(.dark) .method-nav-pill .text-orange-700{color:#9a3412}html:not(.dark) .text-red-600{color:#b91c1c}html:not(.dark) .text-yellow-700{color:#854d0e}html:not(.dark) .method-pill.text-green-700{color:#166534}[class~=\"bg-[#C28C30]\"]{background-color:#854d0e}[class~=\"bg-[#2AB673]\"]{background-color:#166534}html:not(.dark) [data-component-part=field-info-pill] .text-stone-400{color:#59616e}"}],"page":{"pagePath":"tech/architecture","slug":"/tech/architecture","pageMetadata":{"title":"Offline Protocol architecture","sidebarTitle":"Architecture","description":"How Offline Protocol fits together: application, Rust protocol core, platform transport bridges, identity and storage, and upstream backend integration.","keywords":["architecture","Rust core","platform bridge"],"og:image":"https://www.offlineprotocol.com/docs/images/og/tech-architecture.930aed2acb.png","twitter:image":"https://www.offlineprotocol.com/docs/images/og/tech-architecture.930aed2acb.png","href":"/tech/architecture"},"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: \"How Offline Protocol fits together: application, Rust protocol core, platform transport bridges, identity and storage, and upstream backend integration.\"\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`,p:`p`,pre:`pre`,span:`span`,..._provideComponents(),...props.components},{CodeBlock,Heading}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);return _jsxs(_Fragment,{children:[_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`text`,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:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Application: workflow, permissions, durable business records`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`SDK: identity, messaging, replicated documents, services`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Platform bridges: Bluetooth, peer streams, relay / gateway paths`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` |`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` Nearby devices and remote peers`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`2`,id:`application-layer`,children:`Application layer`}),`\n`,_jsx(_components.p,{children:`The application defines the work, enrolls devices and decides what constitutes acceptance. It can use messages, documents and service calls together. A backend adapter maps locally completed work into the existing system of record.`}),`\n`,_jsx(Heading,{level:`2`,id:`protocol-layer`,children:`Protocol layer`}),`\n`,_jsx(_components.p,{children:`The Rust core manages protocol state, MLS, routing, reliability and replication. It queues frames for platform I/O. It does not turn an unsupported radio into a transport.`}),`\n`,_jsx(Heading,{level:`2`,id:`platform-layer`,children:`Platform layer`}),`\n`,_jsxs(_components.p,{children:[`React Native supplies native bridges for mobile platforms. Python supplies desktop transport managers. Rust and constrained firmware integrations provide the relevant I/O and storage implementations. See `,_jsx(_components.a,{href:`/getting-started/platforms`,children:`platforms`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`identity-and-storage`,children:`Identity and storage`}),`\n`,_jsx(_components.p,{children:`A stable application/profile namespace selects local identity and persisted state. The derived device address identifies the peer on the network. User accounts are an application concern; the hosted OfflineID SDK is an optional separate integration.`}),`\n`,_jsx(Heading,{level:`2`,id:`upstream-integration`,children:`Upstream integration`}),`\n`,_jsxs(_components.p,{children:[`A local workflow can coexist with direct cloud communication. A collector or gateway is added where the topology requires it. Retained events reach a backend through an explicit adapter and acceptance contract, described in `,_jsx(_components.a,{href:`/guides/backend-delivery`,children:`backend delivery`}),`.`]})]})}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":"Offline Protocol architecture","sidebarTitle":"Architecture","description":"How Offline Protocol fits together: application, Rust protocol core, platform transport bridges, identity and storage, and upstream backend integration.","keywords":["architecture","Rust core","platform bridge"],"og:image":"https://www.offlineprotocol.com/docs/images/og/tech-architecture.930aed2acb.png","twitter:image":"https://www.offlineprotocol.com/docs/images/og/tech-architecture.930aed2acb.png","href":"/tech/architecture"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Application layer","slug":"application-layer","depth":2,"children":[]},{"title":"Protocol layer","slug":"protocol-layer","depth":2,"children":[]},{"title":"Platform layer","slug":"platform-layer","depth":2,"children":[]},{"title":"Identity and storage","slug":"identity-and-storage","depth":2,"children":[]},{"title":"Upstream integration","slug":"upstream-integration","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"offlineprotocol","siteName":"Offline Protocol","title":"Offline Protocol architecture - Offline Protocol","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-30T01:12:03.809Z","originalFileLocation":"tech/architecture.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=\"How Offline Protocol fits together: application, Rust protocol core, platform transport bridges, identity and storage, and upstream backend integration.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Offline Protocol\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/offlineprotocol/4muaMRT17GBaPY7a/_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=\"/docs/mintlify-assets/_mintlify/favicons/offlineprotocol/4muaMRT17GBaPY7a/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/offlineprotocol/4muaMRT17GBaPY7a/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/offlineprotocol/4muaMRT17GBaPY7a/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/offlineprotocol/4muaMRT17GBaPY7a/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/offlineprotocol/4muaMRT17GBaPY7a/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/offlineprotocol/4muaMRT17GBaPY7a/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/offlineprotocol/4muaMRT17GBaPY7a/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/offlineprotocol/4muaMRT17GBaPY7a/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Offline Protocol architecture - Offline Protocol\">\u003cmeta data-mint-head property=\"og:description\" content=\"How Offline Protocol fits together: application, Rust protocol core, platform transport bridges, identity and storage, and upstream backend integration.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Offline Protocol\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://www.offlineprotocol.com/docs/tech/architecture\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://www.offlineprotocol.com/docs/images/og/tech-architecture.930aed2acb.png\">\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=\"Offline Protocol architecture - Offline Protocol\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How Offline Protocol fits together: application, Rust protocol core, platform transport bridges, identity and storage, and upstream backend integration.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://www.offlineprotocol.com/docs/images/og/tech-architecture.930aed2acb.png\">\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=\"/docs/mintlify-assets/_mintlify/favicons/offlineprotocol/4muaMRT17GBaPY7a/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Offline Protocol\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#264a82\">\u003cmeta data-mint-head name=\"og:image:alt\" content=\"Offline Protocol developer documentation\">\u003clink data-mint-head rel=\"canonical\" href=\"https://www.offlineprotocol.com/docs/tech/architecture\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/tech/architecture.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://www.offlineprotocol.com/#organization\",\"name\":\"Offline Protocol\",\"url\":\"https://www.offlineprotocol.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/offlineprotocol/YyeFdR-brjMBY-La/logo/light.png?fit=max\u0026auto=format\u0026n=YyeFdR-brjMBY-La\u0026q=85\u0026s=4f7832ee21c4f4f352d18b64550d9b77\"},\"sameAs\":[\"https://x.com/offlineprotocol\",\"https://github.com/Offline-Protocol\",\"https://www.linkedin.com/company/offlineprotocol\",\"https://www.npmjs.com/org/offline-protocol\"]},{\"@type\":\"WebSite\",\"@id\":\"https://www.offlineprotocol.com/docs#website\",\"name\":\"Offline Protocol\",\"url\":\"https://www.offlineprotocol.com/docs\",\"publisher\":{\"@id\":\"https://www.offlineprotocol.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://www.offlineprotocol.com/docs/tech/architecture#webpage\",\"url\":\"https://www.offlineprotocol.com/docs/tech/architecture\",\"name\":\"Offline Protocol architecture\",\"description\":\"How Offline Protocol fits together: application, Rust protocol core, platform transport bridges, identity and storage, and upstream backend integration.\",\"dateModified\":\"2026-09-30T01:12:03.809Z\",\"isPartOf\":{\"@id\":\"https://www.offlineprotocol.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://www.offlineprotocol.com/docs/tech/architecture#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://www.offlineprotocol.com/docs/tech/architecture#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Architecture\",\"item\":\"https://www.offlineprotocol.com/docs/tech/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Offline Protocol architecture\",\"item\":\"https://www.offlineprotocol.com/docs/tech/architecture\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://www.offlineprotocol.com/docs/tech/architecture#article\",\"headline\":\"Offline Protocol architecture\",\"name\":\"Offline Protocol architecture\",\"description\":\"How Offline Protocol fits together: application, Rust protocol core, platform transport bridges, identity and storage, and upstream backend integration.\",\"url\":\"https://www.offlineprotocol.com/docs/tech/architecture\",\"mainEntityOfPage\":{\"@id\":\"https://www.offlineprotocol.com/docs/tech/architecture#webpage\"},\"image\":\"https://www.offlineprotocol.com/docs/images/og/tech-architecture.930aed2acb.png\",\"dateModified\":\"2026-09-30T01:12:03.809Z\",\"keywords\":\"architecture, Rust core, platform bridge\",\"publisher\":{\"@id\":\"https://www.offlineprotocol.com/#organization\"},\"isPartOf\":{\"@id\":\"https://www.offlineprotocol.com/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Offline Protocol\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Offline Protocol","nav":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/Offline-Protocol/offline-protocol-sdk"},{"anchor":"Website","icon":"globe","href":"https://www.offlineprotocol.com"}]},"tabs":[{"tab":"Build","pages":[{"title":"Build","href":""}]},{"tab":"SDK reference","groups":[{"group":"SDK setup","pages":[{"title":"Mesh SDK overview","sidebarTitle":"Mesh SDK","href":"/mesh-sdk/overview"},{"title":"Install the Mesh SDK in React Native","sidebarTitle":"React Native","icon":"cube","href":"/mesh-sdk/installation-rn"},{"title":"React Native lifecycle","href":"/mesh-sdk/setup-rn"},{"title":"Python and Linux gateways","href":"/mesh-sdk/python"},{"title":"Local API service","sidebarTitle":"Local API service","href":"/mesh-sdk/local-api"},{"title":"HTTP front","sidebarTitle":"HTTP front","href":"/mesh-sdk/http-front"},{"title":"Native Swift and Android packages","sidebarTitle":"Swift and Android (preview)","href":"/mesh-sdk/native"},{"title":"Flutter plugin (preview)","sidebarTitle":"Flutter (preview)","href":"/mesh-sdk/flutter"},{"title":"Java binding","sidebarTitle":"Java","href":"/mesh-sdk/java"},{"title":"C binding","sidebarTitle":"C","href":"/mesh-sdk/c"},{"title":"Ruby binding","sidebarTitle":"Ruby","href":"/mesh-sdk/ruby"},{"title":"Browser binding (experimental)","sidebarTitle":"Browser (experimental)","href":"/mesh-sdk/web"},{"title":"Rust and constrained devices","href":"/mesh-sdk/embedded"},{"title":"Device identity and addressing","href":"/mesh-sdk/identity"},{"title":"Mesh SDK configuration","sidebarTitle":"Configuration","href":"/mesh-sdk/configuration"},{"title":"Reticulum and Nostr","href":"/mesh-sdk/reticulum-nostr"}]},{"group":"API by task","pages":[{"title":"Find an SDK API","href":"/mesh-sdk/reference"},{"title":"Mesh SDK methods","sidebarTitle":"All methods","href":"/mesh-sdk/methods"},{"title":"Lifecycle and listeners","href":"/mesh-sdk/api/lifecycle"},{"title":"Messaging and receipts","href":"/mesh-sdk/api/messaging"},{"title":"Device identity and sessions","href":"/mesh-sdk/api/identity"},{"title":"Groups and membership","href":"/mesh-sdk/api/groups"},{"title":"Files and media","href":"/mesh-sdk/api/files"},{"title":"Transports and routing","href":"/mesh-sdk/api/networking"},{"title":"Telemetry controls","href":"/mesh-sdk/api/telemetry"},{"title":"DataStore methods","href":"/mesh-sdk/api/data"},{"title":"MeshServices methods","href":"/mesh-sdk/api/services"}]},{"group":"Types and events","pages":[{"title":"Configuration types","href":"/mesh-sdk/configuration-types"},{"title":"Mesh SDK events","sidebarTitle":"Events","href":"/mesh-sdk/events"},{"title":"DataStore reference","href":"/mesh-sdk/data"},{"title":"Custody for replicated documents","sidebarTitle":"Custody","href":"/mesh-sdk/custody"},{"title":"Types and protocol boundaries","href":"/mesh-sdk/types-and-internals"},{"title":"Public types","href":"/mesh-sdk/public-types"},{"title":"Mesh SDK error codes","sidebarTitle":"Error codes","href":"/mesh-sdk/errors"}]},{"group":"Architecture","pages":[{"title":"Technical overview","description":"Technical overview of Offline Protocol: a coordination layer inside your apps and devices for Connect, Sync and Invoke, and what platform bridges supply.","href":"/tech/overview"},{"title":"Offline Protocol architecture","sidebarTitle":"Architecture","href":"/tech/architecture"},{"title":"Transport and routing","description":"How the Mesh SDK routes over BLE, phone Wi-Fi peer streams, local IP, internet relay, Reticulum and Nostr, with multi-hop forwarding and gateways in v0.31.0.","href":"/tech/networking"},{"title":"Security and authorization","href":"/tech/security"},{"title":"Application state and receipts","href":"/tech/ux"},{"title":"Limits and capacity","href":"/tech/rate-limits"},{"title":"Products and services","href":"/tech/ecosystem"},{"title":"Offline Protocol glossary","sidebarTitle":"Glossary","href":"/tech/terminology"}]}]},{"tab":"Identity and hosted APIs","pages":[{"title":"Identity and hosted APIs","href":"/id-sdk/overview"}]},{"tab":"Additional products","pages":[{"title":"Additional products","href":"/proof-of-location/intro"}]}]},"title":"Offline Protocol architecture - Offline Protocol","buildId":"dpl_AUojGTPodKNPTVaxVPcxnNvkSVqo","deploymentId":"dpl_AUojGTPodKNPTVaxVPcxnNvkSVqo","dynamics":[],"chunks":[]}