Technical details for how Tuck seals and unwraps vault data.
Tuck uses a random 256-bit data-encryption key (DEK) for the vault.
Vault data
Titles, bodies, tag names, attachment bytes, and todo titles are encrypted with AES-256-GCM.
Passphrase wrap
The vault passphrase is stretched with PBKDF2-HMAC-SHA256 using 600,000 iterations and a 16-byte salt, then used to wrap the DEK.
Recovery wrap
The Recovery Kit independently wraps the same DEK so recovery does not require the normal passphrase.
Client compatibility
The web and native Apple clients must use the same wrap format and snapshot shape. The iOS implementation intentionally follows the web vault contract instead of inventing a second crypto format.
Changes to the vault format are cross-platform compatibility changes. Treat them like a protocol migration, not a local implementation detail.
Explicit publishing
Hosted MCP does not unwrap the DEK or decrypt vault records on the server. An unlocked web client publishes selected personal-brain content to separate plaintext storage. MCP read tools serve that copy using a bearer token. Optional write tools queue plaintext commands; an unlocked device applies and encrypts them into the vault. The server does not receive the vault key or directly rewrite encrypted vault records. See MCP tools.Each personal brain is published as Off, Summary, or Full text. Summary includes readable thought titles, snippets, tag/person names, dates, and linked todo and Await details. Full text adds thought text. Event times, off by default per brain, adds the start and end times of events an Await waits on, never their titles. Token secrets are shown once and stored server-side as SHA-256 hashes. Publishing fingerprints are outside the sealed vault snapshot.
⌘I
{"docsConfig":{"theme":"almond","$schema":"https://mintlify.com/docs.json","name":"tuck-docs","colors":{"primary":"#173E32","light":"#E66B43","dark":"#D45A35"},"logo":{"light":"https://mintcdn.com/tuck/Wfzsn_KIOcSQ9EUI/images/tuck-logo-light.svg?fit=max\u0026auto=format\u0026n=Wfzsn_KIOcSQ9EUI\u0026q=85\u0026s=e3bf32f321f6da3b4911896fe5304f62","dark":"https://mintcdn.com/tuck/Wfzsn_KIOcSQ9EUI/images/tuck-logo-dark.svg?fit=max\u0026auto=format\u0026n=Wfzsn_KIOcSQ9EUI\u0026q=85\u0026s=78cb7c2ab773c7db04cd60cf8895d1f3"},"favicon":"https://mintcdn.com/tuck/Wfzsn_KIOcSQ9EUI/favicon.svg?fit=max\u0026auto=format\u0026n=Wfzsn_KIOcSQ9EUI\u0026q=85\u0026s=b6e27e966bef9e790b757959bcd405c9","background":{"color":{"light":"#FDF9F2","dark":"#171614"}},"navbar":{"links":[{"href":"https://tuckthis.app/site","label":"Website"}],"primary":{"type":"button","label":"Open Tuck","href":"https://tuckthis.app"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"tuck","hasAudioNarration":false,"actualSubdomain":"tuck","customDomains":["support.tuckthis.app"],"gitSource":{"type":"github","owner":"coderhoades","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6af7b308ee9b54c2ecce63a8","clientVersion":"0.0.4142","searchFilterCounts":[{"language":"default","tag":"Use Tuck","count":12},{"language":"default","tag":"Apps \u0026 Capture","count":10},{"language":"default","tag":"Reference","count":9},{"language":"default","tag":"Tuck apps","count":5},{"language":"default","tag":"Bring things into Tuck","count":5},{"language":"default","tag":"For developers","count":5},{"language":"default","tag":"Get Started","count":5},{"language":"default","tag":"Security \u0026 Privacy","count":5},{"language":"default","tag":"Capture and organize","count":4},{"language":"default","tag":"Plan and remember","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":true},"customCss":[{"filePath":"style.css","content":"/* vietnamese */\n@font-face {\n font-family: 'Fraunces';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/fraunces/v38/6NUu8FyLNQOQZAnv9bYEvDiIdE9Ea92usiIk_WBq8U_9v0c2WS017iN7iQcIfJD58njt0oc0qv86Rg.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Fraunces';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/fraunces/v38/6NUu8FyLNQOQZAnv9bYEvDiIdE9Ea92usiIk_WBq8U_9v0c2WS017iN7iQcIfJD58njt0oc1qv86Rg.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Fraunces';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/fraunces/v38/6NUu8FyLNQOQZAnv9bYEvDiIdE9Ea92usiIk_WBq8U_9v0c2WS017iN7iQcIfJD58njt0oc7qv8.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggqxSuXd.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggOxSuXd.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggSxSuXd.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggixSuXd.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggmxSuXd.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggexSg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggqxSuXd.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggOxSuXd.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggSxSuXd.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggixSuXd.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggmxSuXd.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggexSg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggqxSuXd.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggOxSuXd.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggSxSuXd.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggixSuXd.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggmxSuXd.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggexSg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 700;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggqxSuXd.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 700;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggOxSuXd.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* greek */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 700;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggSxSuXd.woff2) format('woff2');\n unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 700;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggixSuXd.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 700;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggmxSuXd.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Manrope';\n font-style: normal;\n font-weight: 700;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/manrope/v23/xn7gYHE41ni1AdIRggexSg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\nhtml,body{font-family:\"Manrope\", -apple-system, system-ui, sans-serif!important}h1,h2,h3,#page-title{font-family:\"Fraunces\", Georgia, serif!important;font-weight:600!important}toc-item>a{position:relative;padding-left:1rem!important}toc-item[data-active-deepest]>a::before{content:\"\";position:absolute;left:0;top:50%;width:0.75rem;height:0.75rem;transform:translateY(-50%);background-color:currentColor;-webkit-mask:url(\"data:image/svg+xml;utf8,\u003csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'>\u003cpolyline points='9 18 15 12 9 6'/>\u003c/svg>\") no-repeat center / contain;mask:url(\"data:image/svg+xml;utf8,\u003csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'>\u003cpolyline points='9 18 15 12 9 6'/>\u003c/svg>\") no-repeat center / contain;pointer-events:none}#navbar a[href=\"/\"] img,#navbar a[href=\"/\"] svg,#sidebar a[href=\"/\"] img,#sidebar a[href=\"/\"] svg,img.nav-logo{max-width:9rem;height:2.25rem!important;width:auto}h1,h2,h3,#page-title{font-variation-settings:\"SOFT\" 100, \"WONK\" 1;letter-spacing:-0.02em}html.light:root{background:#F5EEDF!important}html.dark:root{background:#0E0D0C!important}html:not(.dark) h1,html:not(.dark) h2,html:not(.dark) h3,html:not(.dark) #page-title{color:#173E32}html.dark h1,html.dark h2,html.dark h3,html.dark #page-title{color:#FFF8EA}.callout[data-callout-type=\"note\"],.callout[data-callout-type=\"info\"]{background:#F3E9D2!important;border-color:#E4D3AE!important}.callout[data-callout-type=\"note\"] svg,.callout[data-callout-type=\"info\"] svg{color:#B04420!important}.callout[data-callout-type=\"note\"] .prose,.callout[data-callout-type=\"info\"] .prose{color:#18231E!important}html.dark .callout[data-callout-type=\"note\"],html.dark .callout[data-callout-type=\"info\"]{background:rgba(230, 107, 67, 0.1)!important;border-color:rgba(230, 107, 67, 0.35)!important}html.dark .callout[data-callout-type=\"note\"] svg,html.dark .callout[data-callout-type=\"info\"] svg{color:#E66B43!important}html.dark .callout[data-callout-type=\"note\"] .prose,html.dark .callout[data-callout-type=\"info\"] .prose{color:#FFF8EA!important}#topbar-cta-button a,#topbar-cta-button>span{background-image:linear-gradient(125deg, #D45A35, #E66540);color:#FFFAF2;border-radius:16px}a.card,.card{border-radius:24px}html:not(.dark) a.card,html:not(.dark) .card{background-color:#FFFDF7;border-color:#E6E2D5;box-shadow:0 15px 35px #725c3010}a[nav-tabs-item]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.kb-feature-card{background-color:rgb(var(--foreground-light, 17 24 39))}.kb-feature-card::before{content:\"\";position:absolute;inset:0;background-image:url('/images/texture.png');background-position:center;background-size:cover;opacity:0.875}"}],"page":{"pagePath":"developers/encryption-model","slug":"/developers/encryption-model","pageMetadata":{"title":"Encryption model","sidebarTitle":"Encryption model","description":"Technical details for how Tuck seals and unwraps vault data.","href":"/developers/encryption-model"},"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: \"Technical details for how Tuck seals and unwraps vault data.\"\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`,p:`p`,..._provideComponents(),...props.components},{Heading,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Tuck uses a random 256-bit data-encryption key (DEK) for the vault.`}),`\n`,_jsx(Heading,{level:`2`,id:`vault-data`,children:`Vault data`}),`\n`,_jsx(_components.p,{children:`Titles, bodies, tag names, attachment bytes, and todo titles are encrypted with AES-256-GCM.`}),`\n`,_jsx(Heading,{level:`2`,id:`passphrase-wrap`,children:`Passphrase wrap`}),`\n`,_jsx(_components.p,{children:`The vault passphrase is stretched with PBKDF2-HMAC-SHA256 using 600,000 iterations and a 16-byte salt, then used to wrap the DEK.`}),`\n`,_jsx(Heading,{level:`2`,id:`recovery-wrap`,children:`Recovery wrap`}),`\n`,_jsx(_components.p,{children:`The Recovery Kit independently wraps the same DEK so recovery does not require the normal passphrase.`}),`\n`,_jsx(Heading,{level:`2`,id:`client-compatibility`,children:`Client compatibility`}),`\n`,_jsx(_components.p,{children:`The web and native Apple clients must use the same wrap format and snapshot shape. The iOS implementation intentionally follows the web vault contract instead of inventing a second crypto format.`}),`\n`,_jsx(Warning,{children:`Changes to the vault format are cross-platform compatibility changes. Treat them like a protocol migration, not a local implementation detail.`}),`\n`,_jsx(Heading,{level:`2`,id:`explicit-publishing`,children:`Explicit publishing`}),`\n`,_jsxs(_components.p,{children:[`Hosted MCP does not unwrap the DEK or decrypt vault records on the server. An unlocked web client publishes selected personal-brain content to separate plaintext storage. MCP read tools serve that copy using a bearer token. Optional write tools queue plaintext commands; an unlocked device applies and encrypts them into the vault. The server does not receive the vault key or directly rewrite encrypted vault records. See `,_jsx(_components.a,{href:`/developers/hosted-mcp-tools`,children:`MCP tools`}),`.`]}),`\n`,_jsx(_components.p,{children:`Each personal brain is published as Off, Summary, or Full text. Summary includes readable thought titles, snippets, tag/person names, dates, and linked todo and Await details. Full text adds thought text. Event times, off by default per brain, adds the start and end times of events an Await waits on, never their titles. Token secrets are shown once and stored server-side as SHA-256 hashes. Publishing fingerprints are outside the sealed vault snapshot.`})]})}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":"Encryption model","sidebarTitle":"Encryption model","description":"Technical details for how Tuck seals and unwraps vault data.","href":"/developers/encryption-model"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Vault data","slug":"vault-data","depth":2,"children":[]},{"title":"Passphrase wrap","slug":"passphrase-wrap","depth":2,"children":[]},{"title":"Recovery wrap","slug":"recovery-wrap","depth":2,"children":[]},{"title":"Client compatibility","slug":"client-compatibility","depth":2,"children":[]},{"title":"Explicit publishing","slug":"explicit-publishing","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"tuck","siteName":"tuck-docs","title":"Encryption model - tuck-docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-04T02:26:26.647Z","originalFileLocation":"developers/encryption-model.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=\"Technical details for how Tuck seals and unwraps vault data.\">\u003cmeta data-mint-head name=\"application-name\" content=\"tuck-docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/tuck/2HXK05xtvGA-brvB/_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/tuck/2HXK05xtvGA-brvB/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/tuck/2HXK05xtvGA-brvB/_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/tuck/2HXK05xtvGA-brvB/_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/tuck/2HXK05xtvGA-brvB/_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/tuck/2HXK05xtvGA-brvB/_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/tuck/2HXK05xtvGA-brvB/_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/tuck/2HXK05xtvGA-brvB/_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/tuck/2HXK05xtvGA-brvB/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Encryption model - tuck-docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Technical details for how Tuck seals and unwraps vault data.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"tuck-docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://support.tuckthis.app/developers/encryption-model\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://tuck.mintlify.site/_mintlify/api/og/v2?division=For+developers\u0026amp;title=Encryption+model\u0026amp;description=Technical+details+for+how+Tuck+seals+and+unwraps+vault+data.\u0026amp;theme=d6f39b62bb84efc1389c2cc9\u0026amp;signature=e6f00c27fd475e28308e12dca5aebddac2a1c1f096303a15ad9e2af50242e73c\">\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=\"Encryption model - tuck-docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Technical details for how Tuck seals and unwraps vault data.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://tuck.mintlify.site/_mintlify/api/og/v2?division=For+developers\u0026amp;title=Encryption+model\u0026amp;description=Technical+details+for+how+Tuck+seals+and+unwraps+vault+data.\u0026amp;theme=d6f39b62bb84efc1389c2cc9\u0026amp;signature=e6f00c27fd475e28308e12dca5aebddac2a1c1f096303a15ad9e2af50242e73c\">\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/tuck/2HXK05xtvGA-brvB/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"tuck-docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#173E32\">\u003clink data-mint-head rel=\"canonical\" href=\"https://support.tuckthis.app/developers/encryption-model\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/developers/encryption-model.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://support.tuckthis.app/#organization\",\"name\":\"tuck-docs\",\"url\":\"https://support.tuckthis.app\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/tuck/Wfzsn_KIOcSQ9EUI/images/tuck-logo-light.svg?fit=max\u0026auto=format\u0026n=Wfzsn_KIOcSQ9EUI\u0026q=85\u0026s=e3bf32f321f6da3b4911896fe5304f62\"}},{\"@type\":\"WebSite\",\"@id\":\"https://support.tuckthis.app#website\",\"name\":\"tuck-docs\",\"url\":\"https://support.tuckthis.app\",\"publisher\":{\"@id\":\"https://support.tuckthis.app/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://support.tuckthis.app/developers/encryption-model#webpage\",\"url\":\"https://support.tuckthis.app/developers/encryption-model\",\"name\":\"Encryption model\",\"description\":\"Technical details for how Tuck seals and unwraps vault data.\",\"dateModified\":\"2026-11-04T02:26:26.647Z\",\"isPartOf\":{\"@id\":\"https://support.tuckthis.app#website\"},\"breadcrumb\":{\"@id\":\"https://support.tuckthis.app/developers/encryption-model#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://support.tuckthis.app/developers/encryption-model#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"For developers\",\"item\":\"https://support.tuckthis.app/developers/ingest-api\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Encryption model\",\"item\":\"https://support.tuckthis.app/developers/encryption-model\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://support.tuckthis.app/developers/encryption-model#article\",\"headline\":\"Encryption model\",\"name\":\"Encryption model\",\"description\":\"Technical details for how Tuck seals and unwraps vault data.\",\"url\":\"https://support.tuckthis.app/developers/encryption-model\",\"mainEntityOfPage\":{\"@id\":\"https://support.tuckthis.app/developers/encryption-model#webpage\"},\"dateModified\":\"2026-11-04T02:26:26.647Z\",\"publisher\":{\"@id\":\"https://support.tuckthis.app/#organization\"},\"isPartOf\":{\"@id\":\"https://support.tuckthis.app#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"tuck-docs\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"tuck-docs\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/developers/encryption-model.md","siteName":"tuck-docs","nav":{"global":null,"tabs":[{"tab":"Get Started","pages":[{"title":"Get Started","href":"/get-started/welcome"}]},{"tab":"Use Tuck","pages":[{"title":"Use Tuck","href":"/use/capture"}]},{"tab":"Apps \u0026 Capture","pages":[{"title":"Apps \u0026 Capture","href":"/apps/web"}]},{"tab":"Security \u0026 Privacy","pages":[{"title":"Security \u0026 Privacy","href":"/security/overview"}]},{"tab":"Reference","groups":[{"group":"Product reference","pages":[{"title":"Plans and feature access","sidebarTitle":"Plans","href":"/reference/plans"},{"title":"Capture syntax and keyboard shortcuts","sidebarTitle":"Capture syntax","href":"/reference/capture-syntax"},{"title":"Why a thought looks actionable","sidebarTitle":"Actionable detection","href":"/reference/actionable-detection"}]},{"group":"For developers","pages":[{"title":"Send captures with the ingest API","sidebarTitle":"Ingest API","href":"/developers/ingest-api"},{"title":"Tuck architecture","sidebarTitle":"Architecture","description":"Understand the separation between the encrypted client and hosted services.","href":"/developers/architecture"},{"title":"Encryption model","sidebarTitle":"Encryption model","href":"/developers/encryption-model"},{"title":"Hosted MCP tools and capture","sidebarTitle":"MCP tools","description":"Read published information and queue changes safely.","href":"/developers/hosted-mcp-tools"},{"title":"Hosted MCP webhooks","sidebarTitle":"MCP webhooks","href":"/developers/hosted-mcp-webhooks"}]},{"group":"Writing Tuck docs","pages":[{"title":"Tuck documentation and terminology style guide","sidebarTitle":"Style guide","href":"/reference/style-guide"}]}]},{"tab":"Release Notes","pages":[{"title":"Release Notes","href":"/release-notes"}]},{"tab":"Get Support","pages":[{"title":"Get Support","href":"/support"}]}]},"basePath":"","title":"Encryption model - tuck-docs","buildId":"dpl_G2Qd45vZZ7MkBiGF9yYx8ZsbbKXX","deploymentId":"dpl_G2Qd45vZZ7MkBiGF9yYx8ZsbbKXX","dynamics":[],"chunks":[]}