[{"data":1,"prerenderedAt":1478},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":365,"navigation-nuxt-cookie-consent-en":507,"\u002Fdocs\u002Fnuxt-protokit\u002Foffline-first\u002Fencryption-en":549,"\u002Fdocs\u002Fnuxt-protokit\u002Foffline-first\u002Fencryption-surround-en":1473},[4,8,13,28,41,51,64,77,94,110,134,150,157,172],{"title":5,"path":6,"stem":7},"Overview","\u002Fdocs\u002Flanding","0.docs\u002F1.landing\u002F001.index",{"title":9,"path":10,"stem":11,"badge":12},"Built-in Features","\u002Fdocs\u002Flanding\u002Fbuilt-in-features","0.docs\u002F1.landing\u002F002.built-in-features","New",{"title":14,"path":15,"stem":16,"children":17,"icon":27},"Content Foundation","\u002Fdocs\u002Flanding\u002Fcontent","0.docs\u002F1.landing\u002F02.content\u002F1.index",[18,19,23],{"title":5,"path":15,"stem":16},{"title":20,"path":21,"stem":22},"Details","\u002Fdocs\u002Flanding\u002Fcontent\u002Fdetails","0.docs\u002F1.landing\u002F02.content\u002F2.details",{"title":24,"path":25,"stem":26},"Technical","\u002Fdocs\u002Flanding\u002Fcontent\u002Ftechnical","0.docs\u002F1.landing\u002F02.content\u002F4.technical","i-heroicons-document-text",{"title":29,"path":30,"stem":31,"children":32,"icon":40},"Regional Content","\u002Fdocs\u002Flanding\u002Fregional","0.docs\u002F1.landing\u002F03.regional\u002F1.index",[33,34,37],{"title":5,"path":30,"stem":31},{"title":20,"path":35,"stem":36},"\u002Fdocs\u002Flanding\u002Fregional\u002Fdetails","0.docs\u002F1.landing\u002F03.regional\u002F2.details",{"title":24,"path":38,"stem":39},"\u002Fdocs\u002Flanding\u002Fregional\u002Ftechnical","0.docs\u002F1.landing\u002F03.regional\u002F4.technical","i-heroicons-globe-alt",{"title":42,"path":43,"stem":44,"children":45,"icon":50},"Multi-language","\u002Fdocs\u002Flanding\u002Fmultilang","0.docs\u002F1.landing\u002F04.multilang\u002F1.index",[46,47],{"title":5,"path":43,"stem":44},{"title":20,"path":48,"stem":49},"\u002Fdocs\u002Flanding\u002Fmultilang\u002Fdetails","0.docs\u002F1.landing\u002F04.multilang\u002F2.details","i-heroicons-language",{"title":52,"path":53,"stem":54,"children":55,"icon":63},"Blog","\u002Fdocs\u002Flanding\u002Fblog","0.docs\u002F1.landing\u002F05.blog\u002F1.index",[56,57,60],{"title":5,"path":53,"stem":54},{"title":20,"path":58,"stem":59},"\u002Fdocs\u002Flanding\u002Fblog\u002Fdetails","0.docs\u002F1.landing\u002F05.blog\u002F2.details",{"title":24,"path":61,"stem":62},"\u002Fdocs\u002Flanding\u002Fblog\u002Ftechnical","0.docs\u002F1.landing\u002F05.blog\u002F4.technical","i-heroicons-pencil-square",{"title":65,"path":66,"stem":67,"children":68,"icon":76},"Documentation","\u002Fdocs\u002Flanding\u002Fdocs","0.docs\u002F1.landing\u002F06.docs\u002F1.index",[69,70,73],{"title":5,"path":66,"stem":67},{"title":20,"path":71,"stem":72},"\u002Fdocs\u002Flanding\u002Fdocs\u002Fdetails","0.docs\u002F1.landing\u002F06.docs\u002F2.details",{"title":24,"path":74,"stem":75},"\u002Fdocs\u002Flanding\u002Fdocs\u002Ftechnical","0.docs\u002F1.landing\u002F06.docs\u002F4.technical","i-heroicons-book-open",{"title":78,"path":79,"stem":80,"children":81,"icon":93},"Forms","\u002Fdocs\u002Flanding\u002Fforms","0.docs\u002F1.landing\u002F07.forms\u002F1.index",[82,83,86,90],{"title":5,"path":79,"stem":80},{"title":20,"path":84,"stem":85},"\u002Fdocs\u002Flanding\u002Fforms\u002Fdetails","0.docs\u002F1.landing\u002F07.forms\u002F2.details",{"title":87,"path":88,"stem":89},"Admin","\u002Fdocs\u002Flanding\u002Fforms\u002Fadmin","0.docs\u002F1.landing\u002F07.forms\u002F3.admin",{"title":24,"path":91,"stem":92},"\u002Fdocs\u002Flanding\u002Fforms\u002Ftechnical","0.docs\u002F1.landing\u002F07.forms\u002F4.technical","i-heroicons-clipboard-document-list",{"title":95,"path":96,"stem":97,"children":98,"icon":109},"Email","\u002Fdocs\u002Flanding\u002Femail","0.docs\u002F1.landing\u002F08.email\u002F1.index",[99,100,103,106],{"title":5,"path":96,"stem":97},{"title":20,"path":101,"stem":102},"\u002Fdocs\u002Flanding\u002Femail\u002Fdetails","0.docs\u002F1.landing\u002F08.email\u002F2.details",{"title":87,"path":104,"stem":105},"\u002Fdocs\u002Flanding\u002Femail\u002Fadmin","0.docs\u002F1.landing\u002F08.email\u002F3.admin",{"title":24,"path":107,"stem":108},"\u002Fdocs\u002Flanding\u002Femail\u002Ftechnical","0.docs\u002F1.landing\u002F08.email\u002F4.technical","i-heroicons-envelope",{"title":111,"path":112,"stem":113,"children":114,"icon":133},"Feedback Platform","\u002Fdocs\u002Flanding\u002Ffeedback","0.docs\u002F1.landing\u002F09.feedback\u002F1.index",[115,116,119,122,125,129],{"title":5,"path":112,"stem":113},{"title":20,"path":117,"stem":118},"\u002Fdocs\u002Flanding\u002Ffeedback\u002Fdetails","0.docs\u002F1.landing\u002F09.feedback\u002F2.details",{"title":87,"path":120,"stem":121},"\u002Fdocs\u002Flanding\u002Ffeedback\u002Fadmin","0.docs\u002F1.landing\u002F09.feedback\u002F3.admin",{"title":24,"path":123,"stem":124},"\u002Fdocs\u002Flanding\u002Ffeedback\u002Ftechnical","0.docs\u002F1.landing\u002F09.feedback\u002F4.technical",{"title":126,"path":127,"stem":128},"Compare vs SaaS","\u002Fdocs\u002Flanding\u002Ffeedback\u002Fcompare","0.docs\u002F1.landing\u002F09.feedback\u002F5.compare",{"title":130,"path":131,"stem":132},"FAQ","\u002Fdocs\u002Flanding\u002Ffeedback\u002Ffaq","0.docs\u002F1.landing\u002F09.feedback\u002F6.faq","i-heroicons-chat-bubble-left-right",{"title":135,"path":136,"stem":137,"children":138,"icon":149},"Storage","\u002Fdocs\u002Flanding\u002Fstorage","0.docs\u002F1.landing\u002F10.storage\u002F1.index",[139,140,143,146],{"title":5,"path":136,"stem":137},{"title":20,"path":141,"stem":142},"\u002Fdocs\u002Flanding\u002Fstorage\u002Fdetails","0.docs\u002F1.landing\u002F10.storage\u002F2.details",{"title":87,"path":144,"stem":145},"\u002Fdocs\u002Flanding\u002Fstorage\u002Fadmin","0.docs\u002F1.landing\u002F10.storage\u002F3.admin",{"title":24,"path":147,"stem":148},"\u002Fdocs\u002Flanding\u002Fstorage\u002Ftechnical","0.docs\u002F1.landing\u002F10.storage\u002F4.technical","i-heroicons-circle-stack",{"title":151,"path":152,"stem":153,"children":154,"icon":156},"Offline First","\u002Fdocs\u002Flanding\u002Foffline-first","0.docs\u002F1.landing\u002F11.offline-first\u002F1.index",[155],{"title":151,"path":152,"stem":153},"i-heroicons-users",{"title":158,"path":159,"stem":160,"children":161,"icon":156},"Yjs Sync","\u002Fdocs\u002Flanding\u002Fyjs-sync","0.docs\u002F1.landing\u002F12.yjs-sync\u002F1.index",[162,163,166,169],{"title":5,"path":159,"stem":160},{"title":20,"path":164,"stem":165},"\u002Fdocs\u002Flanding\u002Fyjs-sync\u002Fdetails","0.docs\u002F1.landing\u002F12.yjs-sync\u002F2.details",{"title":87,"path":167,"stem":168},"\u002Fdocs\u002Flanding\u002Fyjs-sync\u002Fadmin","0.docs\u002F1.landing\u002F12.yjs-sync\u002F3.admin",{"title":24,"path":170,"stem":171},"\u002Fdocs\u002Flanding\u002Fyjs-sync\u002Ftechnical","0.docs\u002F1.landing\u002F12.yjs-sync\u002F4.technical",{"title":173,"path":174,"stem":175,"children":176,"badge":178,"icon":179},"Newsletter","\u002Fdocs\u002Flanding\u002Fnewsletter","0.docs\u002F1.landing\u002F13.newsletter\u002Findex",[177],{"title":173,"path":174,"stem":175,"badge":178},"Coming Soon","i-lucide-send",[181,184,202,318,358],{"title":5,"path":182,"stem":183},"\u002Fdocs\u002Fnuxt-auto","0.docs\u002F3.nuxt-auto\u002Findex",{"title":185,"path":186,"stem":187,"children":188,"page":201},"Getting Started","\u002Fdocs\u002Fnuxt-auto\u002Fgetting-started","0.docs\u002F3.nuxt-auto\u002F1.getting-started",[189,193,197],{"title":190,"path":191,"stem":192},"Introduction","\u002Fdocs\u002Fnuxt-auto\u002Fgetting-started\u002Fintroduction","0.docs\u002F3.nuxt-auto\u002F1.getting-started\u002F1.introduction",{"title":194,"path":195,"stem":196},"Installation","\u002Fdocs\u002Fnuxt-auto\u002Fgetting-started\u002Finstallation","0.docs\u002F3.nuxt-auto\u002F1.getting-started\u002F2.installation",{"title":198,"path":199,"stem":200},"Quick Start","\u002Fdocs\u002Fnuxt-auto\u002Fgetting-started\u002Fquick-start","0.docs\u002F3.nuxt-auto\u002F1.getting-started\u002F3.quick-start",false,{"title":203,"path":204,"stem":205,"children":206,"page":201},"Auto API","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api","0.docs\u002F3.nuxt-auto\u002F2.auto-api",[207,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290,294,298,302,306,310,314],{"title":185,"path":208,"stem":209},"\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fgetting-started","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F1.getting-started",{"title":211,"path":212,"stem":213},"Aggregations","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Faggregations","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F10.aggregations",{"title":215,"path":216,"stem":217},"Lifecycle Hooks","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Flifecycle-hooks","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F11.lifecycle-hooks",{"title":219,"path":220,"stem":221},"Many-to-Many (M2M) Relationships","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fm2m-relationships","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F12.m2m-relationships",{"title":223,"path":224,"stem":225},"Plugin System","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fplugin-system","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F13.plugin-system",{"title":227,"path":228,"stem":229},"Database Adapters","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fdatabase-adapters","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F14.database-adapters",{"title":231,"path":232,"stem":233},"Custom Endpoints","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fcustom-endpoints","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F15.custom-endpoints",{"title":235,"path":236,"stem":237},"Multi-Tenancy","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fmulti-tenancy","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F16.multi-tenancy",{"title":239,"path":240,"stem":241},"Schema Presets (Cross-engine)","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fschema-presets","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F17.schema-presets",{"title":243,"path":244,"stem":245},"Permissions Cookbook","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fpermissions-cookbook","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F18.permissions-cookbook",{"title":247,"path":248,"stem":249},"Billing & Plan Gating","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fbilling","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F19.billing",{"title":251,"path":252,"stem":253},"Validation","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fvalidation","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F2.validation",{"title":255,"path":256,"stem":257},"Rate Limiting","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Frate-limiting","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F20.rate-limiting",{"title":259,"path":260,"stem":261},"Request Metadata Plugin","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Frequest-metadata","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F21.request-metadata",{"title":263,"path":264,"stem":265},"Plugin Catalog","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fplugin-catalog","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F22.plugin-catalog",{"title":267,"path":268,"stem":269},"Configuration Reference","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fconfiguration","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F23.configuration",{"title":271,"path":272,"stem":273},"Handler Overrides","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fhandler-overrides","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F3.handler-overrides",{"title":275,"path":276,"stem":277},"Cloudflare D1","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fcloudflare-d1","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F30.cloudflare-d1",{"title":279,"path":280,"stem":281},"SQLite to D1 Migration","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fmigration-sqlite-d1","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F31.migration-sqlite-d1",{"title":283,"path":284,"stem":285},"Frontend Composables","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Ffrontend-composables","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F32.frontend-composables",{"title":287,"path":288,"stem":289},"Testing","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Ftesting","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F33.testing",{"title":291,"path":292,"stem":293},"Pagination","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fpagination","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F4.pagination",{"title":295,"path":296,"stem":297},"Upgrading","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fupgrading","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F40.upgrading",{"title":299,"path":300,"stem":301},"Soft Deletes","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fsoft-deletes","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F5.soft-deletes",{"title":303,"path":304,"stem":305},"Authentication & Authorization","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fauthentication-authorization","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F6.authentication-authorization",{"title":307,"path":308,"stem":309},"Better-Auth Integration","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fbetter-auth","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F7.better-auth",{"title":311,"path":312,"stem":313},"Nested Relations","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fnested-relationships","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F8.nested-relationships",{"title":315,"path":316,"stem":317},"Bulk Operations","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fbulk-operations","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F9.bulk-operations",{"title":319,"path":320,"stem":321,"children":322,"page":201},"Auto Admin","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin","0.docs\u002F3.nuxt-auto\u002F3.auto-admin",[323,326,330,334,338,342,346,350,354],{"title":185,"path":324,"stem":325},"\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fgetting-started","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F1.getting-started",{"title":327,"path":328,"stem":329},"Configuration & Theming","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fconfiguration-theming","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F2.configuration-theming",{"title":331,"path":332,"stem":333},"Resource Configuration","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fresource-configuration","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F3.resource-configuration",{"title":335,"path":336,"stem":337},"Form Fields & Widgets","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fform-fields-widgets","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F4.form-fields-widgets",{"title":339,"path":340,"stem":341},"Permissions","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fpermissions","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F5.permissions",{"title":343,"path":344,"stem":345},"Custom Pages","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fcustom-pages","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F6.custom-pages",{"title":347,"path":348,"stem":349},"M2M Relationships","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fm2m-relationships","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F7.m2m-relationships",{"title":351,"path":352,"stem":353},"Custom Actions","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fcustom-actions","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F8.custom-actions",{"title":355,"path":356,"stem":357},"Composables","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fcomposables","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F9.composables",{"title":359,"path":360,"stem":361,"children":362,"icon":364},"Claude Code Skills","\u002Fdocs\u002Fnuxt-auto\u002Fclaude-code-skills","0.docs\u002F3.nuxt-auto\u002F4.claude-code-skills\u002F1.index",[363],{"title":5,"path":360,"stem":361},"i-lucide-bot",[366,369,382,409,427,450,472,502],{"title":5,"path":367,"stem":368},"\u002Fdocs\u002Fnuxt-protokit","0.docs\u002F4.nuxt-protokit\u002Findex",{"title":185,"path":370,"stem":371,"children":372,"icon":381},"\u002Fdocs\u002Fnuxt-protokit\u002Fgetting-started","0.docs\u002F4.nuxt-protokit\u002F1.getting-started\u002F1.index",[373,374,378],{"title":190,"path":370,"stem":371},{"title":375,"path":376,"stem":377},"Core Concepts","\u002Fdocs\u002Fnuxt-protokit\u002Fgetting-started\u002Fconcepts","0.docs\u002F4.nuxt-protokit\u002F1.getting-started\u002F2.concepts",{"title":198,"path":379,"stem":380},"\u002Fdocs\u002Fnuxt-protokit\u002Fgetting-started\u002Fquick-start","0.docs\u002F4.nuxt-protokit\u002F1.getting-started\u002F3.quick-start","i-lucide-rocket",{"title":383,"path":384,"stem":385,"children":386,"icon":408},"Schemas","\u002Fdocs\u002Fnuxt-protokit\u002Fschemas","0.docs\u002F4.nuxt-protokit\u002F2.schemas\u002F1.index",[387,388,392,396,400,404],{"title":5,"path":384,"stem":385},{"title":389,"path":390,"stem":391},"Field Types","\u002Fdocs\u002Fnuxt-protokit\u002Fschemas\u002Ffields","0.docs\u002F4.nuxt-protokit\u002F2.schemas\u002F2.fields",{"title":393,"path":394,"stem":395},"Collections","\u002Fdocs\u002Fnuxt-protokit\u002Fschemas\u002Fcollections","0.docs\u002F4.nuxt-protokit\u002F2.schemas\u002F3.collections",{"title":397,"path":398,"stem":399},"Derived & Computed","\u002Fdocs\u002Fnuxt-protokit\u002Fschemas\u002Fderived-computed","0.docs\u002F4.nuxt-protokit\u002F2.schemas\u002F4.derived-computed",{"title":401,"path":402,"stem":403},"Connections","\u002Fdocs\u002Fnuxt-protokit\u002Fschemas\u002Fconnections","0.docs\u002F4.nuxt-protokit\u002F2.schemas\u002F5.connections",{"title":405,"path":406,"stem":407},"Visualizations & Layouts","\u002Fdocs\u002Fnuxt-protokit\u002Fschemas\u002Fvisualizations","0.docs\u002F4.nuxt-protokit\u002F2.schemas\u002F6.visualizations","i-lucide-file-code",{"title":355,"path":410,"stem":411,"children":412,"icon":426},"\u002Fdocs\u002Fnuxt-protokit\u002Fcomposables","0.docs\u002F4.nuxt-protokit\u002F3.composables\u002F1.index",[413,414,418,422],{"title":5,"path":410,"stem":411},{"title":415,"path":416,"stem":417},"usePrototype","\u002Fdocs\u002Fnuxt-protokit\u002Fcomposables\u002Fuse-prototype","0.docs\u002F4.nuxt-protokit\u002F3.composables\u002F2.use-prototype",{"title":419,"path":420,"stem":421},"useProtoDoc","\u002Fdocs\u002Fnuxt-protokit\u002Fcomposables\u002Fuse-proto-doc","0.docs\u002F4.nuxt-protokit\u002F3.composables\u002F3.use-proto-doc",{"title":423,"path":424,"stem":425},"useProtoCollection","\u002Fdocs\u002Fnuxt-protokit\u002Fcomposables\u002Fuse-proto-collection","0.docs\u002F4.nuxt-protokit\u002F3.composables\u002F4.use-proto-collection","i-lucide-layers",{"title":428,"path":429,"stem":430,"children":431,"icon":449},"Components","\u002Fdocs\u002Fnuxt-protokit\u002Fcomponents","0.docs\u002F4.nuxt-protokit\u002F4.components\u002F1.index",[432,433,437,441,445],{"title":5,"path":429,"stem":430},{"title":434,"path":435,"stem":436},"ProtoTool","\u002Fdocs\u002Fnuxt-protokit\u002Fcomponents\u002Fproto-tool","0.docs\u002F4.nuxt-protokit\u002F4.components\u002F2.proto-tool",{"title":438,"path":439,"stem":440},"ProtoCrudModal","\u002Fdocs\u002Fnuxt-protokit\u002Fcomponents\u002Fproto-crud-modal","0.docs\u002F4.nuxt-protokit\u002F4.components\u002F3.proto-crud-modal",{"title":442,"path":443,"stem":444},"ProtoCalendar","\u002Fdocs\u002Fnuxt-protokit\u002Fcomponents\u002Fproto-calendar","0.docs\u002F4.nuxt-protokit\u002F4.components\u002F4.proto-calendar",{"title":446,"path":447,"stem":448},"ProtoItemPanel variants","\u002Fdocs\u002Fnuxt-protokit\u002Fcomponents\u002Fproto-item-panels","0.docs\u002F4.nuxt-protokit\u002F4.components\u002F5.proto-item-panels","i-lucide-puzzle",{"title":151,"path":451,"stem":452,"children":453,"icon":471},"\u002Fdocs\u002Fnuxt-protokit\u002Foffline-first","0.docs\u002F4.nuxt-protokit\u002F5.offline-first\u002F1.index",[454,455,459,463,467],{"title":151,"path":451,"stem":452},{"title":456,"path":457,"stem":458},"Corruption Recovery","\u002Fdocs\u002Fnuxt-protokit\u002Foffline-first\u002Fcorruption-recovery","0.docs\u002F4.nuxt-protokit\u002F5.offline-first\u002F2.corruption-recovery",{"title":460,"path":461,"stem":462},"Size & GC","\u002Fdocs\u002Fnuxt-protokit\u002Foffline-first\u002Fdocument-size-and-gc","0.docs\u002F4.nuxt-protokit\u002F5.offline-first\u002F3.document-size-and-gc",{"title":464,"path":465,"stem":466},"Multi-tenant Isolation","\u002Fdocs\u002Fnuxt-protokit\u002Foffline-first\u002Fmulti-tenant-isolation","0.docs\u002F4.nuxt-protokit\u002F5.offline-first\u002F4.multi-tenant-isolation",{"title":468,"path":469,"stem":470},"Encryption at Rest","\u002Fdocs\u002Fnuxt-protokit\u002Foffline-first\u002Fencryption","0.docs\u002F4.nuxt-protokit\u002F5.offline-first\u002F5.encryption","i-lucide-wifi-off",{"title":473,"icon":474,"path":475,"stem":476,"children":477},"Advanced","i-lucide-graduation-cap","\u002Fdocs\u002Fnuxt-protokit\u002Fadvanced","0.docs\u002F4.nuxt-protokit\u002F6.advanced\u002F1.index",[478,479,483,487,491,494,498],{"title":5,"path":475,"stem":476},{"title":480,"path":481,"stem":482},"Multi-Tool Apps","\u002Fdocs\u002Fnuxt-protokit\u002Fadvanced\u002Fbuilding-a-toolkit","0.docs\u002F4.nuxt-protokit\u002F6.advanced\u002F1.building-a-toolkit",{"title":484,"path":485,"stem":486},"Schema Patterns","\u002Fdocs\u002Fnuxt-protokit\u002Fadvanced\u002Fcustom-schema-patterns","0.docs\u002F4.nuxt-protokit\u002F6.advanced\u002F2.custom-schema-patterns",{"title":488,"path":489,"stem":490},"Custom Fields & Viz","\u002Fdocs\u002Fnuxt-protokit\u002Fadvanced\u002Fextensibility","0.docs\u002F4.nuxt-protokit\u002F6.advanced\u002F3.extensibility",{"title":339,"path":492,"stem":493},"\u002Fdocs\u002Fnuxt-protokit\u002Fadvanced\u002Fpermissions","0.docs\u002F4.nuxt-protokit\u002F6.advanced\u002F4.permissions",{"title":495,"path":496,"stem":497},"Business Logic Guards","\u002Fdocs\u002Fnuxt-protokit\u002Fadvanced\u002Fpermissions-business-logic","0.docs\u002F4.nuxt-protokit\u002F6.advanced\u002F5.permissions-business-logic",{"title":499,"path":500,"stem":501},"Headless Mode","\u002Fdocs\u002Fnuxt-protokit\u002Fadvanced\u002Fheadless-mode","0.docs\u002F4.nuxt-protokit\u002F6.advanced\u002F6.headless-mode",{"title":359,"path":503,"stem":504,"children":505,"icon":364},"\u002Fdocs\u002Fnuxt-protokit\u002Fclaude-code-skills","0.docs\u002F4.nuxt-protokit\u002F7.claude-code-skills\u002F1.index",[506],{"title":5,"path":503,"stem":504},[508,511],{"title":5,"path":509,"stem":510},"\u002Fdocs\u002Fnuxt-cookie-consent","0.docs\u002F5.nuxt-cookie-consent\u002Findex",{"title":512,"icon":513,"path":514,"stem":515,"children":516,"page":201},"Guide","i-lucide-book-open","\u002Fdocs\u002Fnuxt-cookie-consent\u002Fguide","0.docs\u002F5.nuxt-cookie-consent\u002F1.guide",[517,521,525,530,535,539,544],{"title":190,"path":518,"stem":519,"icon":520},"\u002Fdocs\u002Fnuxt-cookie-consent\u002Fguide\u002Fintroduction","0.docs\u002F5.nuxt-cookie-consent\u002F1.guide\u002F1.introduction","i-lucide-info",{"title":194,"path":522,"stem":523,"icon":524},"\u002Fdocs\u002Fnuxt-cookie-consent\u002Fguide\u002Finstallation","0.docs\u002F5.nuxt-cookie-consent\u002F1.guide\u002F2.installation","i-lucide-download",{"title":526,"path":527,"stem":528,"icon":529},"Configuration","\u002Fdocs\u002Fnuxt-cookie-consent\u002Fguide\u002Fconfiguration","0.docs\u002F5.nuxt-cookie-consent\u002F1.guide\u002F3.configuration","i-lucide-settings-2",{"title":531,"path":532,"stem":533,"icon":534},"Usage","\u002Fdocs\u002Fnuxt-cookie-consent\u002Fguide\u002Fusage","0.docs\u002F5.nuxt-cookie-consent\u002F1.guide\u002F4.usage","i-lucide-play",{"title":355,"path":536,"stem":537,"icon":538},"\u002Fdocs\u002Fnuxt-cookie-consent\u002Fguide\u002Fcomposables","0.docs\u002F5.nuxt-cookie-consent\u002F1.guide\u002F5.composables","i-lucide-function-square",{"title":540,"path":541,"stem":542,"icon":543},"Components & overriding","\u002Fdocs\u002Fnuxt-cookie-consent\u002Fguide\u002Fcomponents","0.docs\u002F5.nuxt-cookie-consent\u002F1.guide\u002F6.components","i-lucide-component",{"title":545,"path":546,"stem":547,"icon":548},"Internationalization","\u002Fdocs\u002Fnuxt-cookie-consent\u002Fguide\u002Fi18n","0.docs\u002F5.nuxt-cookie-consent\u002F1.guide\u002F7.i18n","i-lucide-languages",{"page":550,"fallbackPage":1468},{"id":551,"title":468,"body":552,"description":1466,"extension":1467,"links":1468,"meta":1469,"navigation":1470,"ogImage":1468,"path":469,"seo":1471,"stem":470,"__hash__":1472},"nuxt_protokit\u002F0.docs\u002F4.nuxt-protokit\u002F5.offline-first\u002F5.encryption.md",{"type":553,"value":554,"toc":1449},"minimark",[555,559,563,568,580,616,627,631,636,719,771,778,781,785,788,922,928,932,992,996,1000,1019,1025,1078,1082,1085,1089,1098,1102,1109,1113,1119,1185,1201,1205,1208,1374,1382,1386,1445],[556,557,468],"h1",{"id":558},"encryption-at-rest",[560,561,562],"p",{},"By default, Y.js updates are stored in IndexedDB as raw binary. Anyone with access to the browser's DevTools or the underlying SQLite file on disk can read the data. For sensitive use cases — health records, financial data, confidential planning — you can enable AES-GCM encryption so the stored blobs are unreadable without the key.",[564,565,567],"h2",{"id":566},"how-it-works","How it works",[560,569,570,571,575,576,579],{},"When encryption is enabled, protokit replaces the standard ",[572,573,574],"code",{},"y-indexeddb"," persistence with a custom ",[572,577,578],{},"EncryptedIdbPersistence"," that:",[581,582,583,595,606,609],"ol",{},[584,585,586,587,590,591,594],"li",{},"Opens its own IndexedDB database (key prefix: ",[572,588,589],{},"proto:enc:"," instead of ",[572,592,593],{},"proto:",")",[584,596,597,598,602,603],{},"Encrypts each Y.js update with ",[599,600,601],"strong",{},"AES-GCM (256-bit)"," before writing — format: ",[572,604,605],{},"[IV (12 bytes)][ciphertext]",[584,607,608],{},"On load, reads all stored blobs, decrypts them, and applies them to the in-memory Y.Doc",[584,610,611,612,615],{},"After 50 stored updates, ",[599,613,614],{},"compacts"," to a single full-state snapshot to prevent unbounded growth",[560,617,618,619,622,623,626],{},"Key derivation (when a password is supplied): ",[599,620,621],{},"PBKDF2"," with 100 000 iterations, SHA-256, and a random 16-byte salt. The salt is stored in the IDB ",[572,624,625],{},"meta"," store — it is not secret, it prevents pre-computation attacks.",[564,628,630],{"id":629},"basic-usage","Basic usage",[632,633,635],"h3",{"id":634},"with-a-password","With a password",[637,638,643],"pre",{"className":639,"code":640,"language":641,"meta":642,"style":642},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Composable\nconst { state } = usePrototype(schema, {\n  encryption: { password: userPassword },\n})\n","ts","",[572,644,645,654,688,711],{"__ignoreMap":642},[646,647,650],"span",{"class":648,"line":649},"line",1,[646,651,653],{"class":652},"sHwdD","\u002F\u002F Composable\n",[646,655,657,661,665,669,672,675,679,682,685],{"class":648,"line":656},2,[646,658,660],{"class":659},"spNyl","const",[646,662,664],{"class":663},"sMK4o"," {",[646,666,668],{"class":667},"sTEyZ"," state ",[646,670,671],{"class":663},"}",[646,673,674],{"class":663}," =",[646,676,678],{"class":677},"s2Zo4"," usePrototype",[646,680,681],{"class":667},"(schema",[646,683,684],{"class":663},",",[646,686,687],{"class":663}," {\n",[646,689,691,695,698,700,703,705,708],{"class":648,"line":690},3,[646,692,694],{"class":693},"swJcz","  encryption",[646,696,697],{"class":663},":",[646,699,664],{"class":663},[646,701,702],{"class":693}," password",[646,704,697],{"class":663},[646,706,707],{"class":667}," userPassword ",[646,709,710],{"class":663},"},\n",[646,712,714,716],{"class":648,"line":713},4,[646,715,671],{"class":663},[646,717,718],{"class":667},")\n",[637,720,724],{"className":721,"code":722,"language":723,"meta":642,"style":642},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!-- Component — password-string prop only (use composable for CryptoKey) -->\n\u003CProtoTool :schema=\"schema\" :encryption-password=\"userPassword\" \u002F>\n","vue",[572,725,726,731],{"__ignoreMap":642},[646,727,728],{"class":648,"line":649},[646,729,730],{"class":652},"\u003C!-- Component — password-string prop only (use composable for CryptoKey) -->\n",[646,732,733,736,738,741,744,747,750,752,754,756,759,761,763,766,768],{"class":648,"line":656},[646,734,735],{"class":663},"\u003C",[646,737,434],{"class":693},[646,739,740],{"class":663}," :",[646,742,743],{"class":659},"schema",[646,745,746],{"class":663},"=",[646,748,749],{"class":663},"\"",[646,751,743],{"class":667},[646,753,749],{"class":663},[646,755,740],{"class":663},[646,757,758],{"class":659},"encryption-password",[646,760,746],{"class":663},[646,762,749],{"class":663},[646,764,765],{"class":667},"userPassword",[646,767,749],{"class":663},[646,769,770],{"class":663}," \u002F>\n",[560,772,773],{},[774,775],"img",{"alt":776,"src":777},"A prototype unlocked with its password: everything written to IndexedDB is AES-GCM encrypted","\u002Fscreenshots\u002Fnuxt-protokit\u002Fencryption-unlocked-1440.png",[560,779,780],{},"The password is derived into a key on first open. The salt is stored in the IDB so the same password always produces the same key for that document.",[632,782,784],{"id":783},"with-a-pre-derived-cryptokey","With a pre-derived CryptoKey",[560,786,787],{},"Use this when your app manages key derivation externally — for example, a key wrapped by a server-issued token, a hardware key, or WebAuthn.",[637,789,791],{"className":639,"code":790,"language":641,"meta":642,"style":642},"import { deriveKey, generateSalt } from '#protokit\u002Futils\u002Fencryption'\n\n\u002F\u002F Derive once (or load from secure key store)\nconst salt = generateSalt()  \u002F\u002F store this alongside your user record\nconst key = await deriveKey(userPassword, salt)\n\nconst { state } = usePrototype(schema, {\n  encryption: { key },\n})\n",[572,792,793,825,831,836,853,876,881,902,915],{"__ignoreMap":642},[646,794,795,799,801,804,806,809,812,815,818,822],{"class":648,"line":649},[646,796,798],{"class":797},"s7zQu","import",[646,800,664],{"class":663},[646,802,803],{"class":667}," deriveKey",[646,805,684],{"class":663},[646,807,808],{"class":667}," generateSalt",[646,810,811],{"class":663}," }",[646,813,814],{"class":797}," from",[646,816,817],{"class":663}," '",[646,819,821],{"class":820},"sfazB","#protokit\u002Futils\u002Fencryption",[646,823,824],{"class":663},"'\n",[646,826,827],{"class":648,"line":656},[646,828,830],{"emptyLinePlaceholder":829},true,"\n",[646,832,833],{"class":648,"line":690},[646,834,835],{"class":652},"\u002F\u002F Derive once (or load from secure key store)\n",[646,837,838,840,843,845,847,850],{"class":648,"line":713},[646,839,660],{"class":659},[646,841,842],{"class":667}," salt ",[646,844,746],{"class":663},[646,846,808],{"class":677},[646,848,849],{"class":667},"()  ",[646,851,852],{"class":652},"\u002F\u002F store this alongside your user record\n",[646,854,856,858,861,863,866,868,871,873],{"class":648,"line":855},5,[646,857,660],{"class":659},[646,859,860],{"class":667}," key ",[646,862,746],{"class":663},[646,864,865],{"class":797}," await",[646,867,803],{"class":677},[646,869,870],{"class":667},"(userPassword",[646,872,684],{"class":663},[646,874,875],{"class":667}," salt)\n",[646,877,879],{"class":648,"line":878},6,[646,880,830],{"emptyLinePlaceholder":829},[646,882,884,886,888,890,892,894,896,898,900],{"class":648,"line":883},7,[646,885,660],{"class":659},[646,887,664],{"class":663},[646,889,668],{"class":667},[646,891,671],{"class":663},[646,893,674],{"class":663},[646,895,678],{"class":677},[646,897,681],{"class":667},[646,899,684],{"class":663},[646,901,687],{"class":663},[646,903,905,907,909,911,913],{"class":648,"line":904},8,[646,906,694],{"class":693},[646,908,697],{"class":663},[646,910,664],{"class":663},[646,912,860],{"class":667},[646,914,710],{"class":663},[646,916,918,920],{"class":648,"line":917},9,[646,919,671],{"class":663},[646,921,718],{"class":667},[560,923,924,927],{},[572,925,926],{},"importRawKey(bytes)"," is also exported if you receive a raw 256-bit key from your backend.",[564,929,931],{"id":930},"security-properties","Security properties",[933,934,935,948],"table",{},[936,937,938],"thead",{},[939,940,941,945],"tr",{},[942,943,944],"th",{},"Property",[942,946,947],{},"Detail",[949,950,951,960,968,976,984],"tbody",{},[939,952,953,957],{},[954,955,956],"td",{},"Algorithm",[954,958,959],{},"AES-GCM 256-bit (authenticated encryption)",[939,961,962,965],{},[954,963,964],{},"Key derivation",[954,966,967],{},"PBKDF2, 100 000 iterations, SHA-256",[939,969,970,973],{},[954,971,972],{},"IV",[954,974,975],{},"12 bytes, random per update — same plaintext encrypts differently every time",[939,977,978,981],{},[954,979,980],{},"Authentication",[954,982,983],{},"GCM tag verifies integrity — tampered ciphertext throws, not silently corrupts",[939,985,986,989],{},[954,987,988],{},"Salt",[954,990,991],{},"16 bytes random, stored in IDB meta store (not secret)",[564,993,995],{"id":994},"important-limitations","Important limitations",[632,997,999],{"id":998},"server-sync-sends-unencrypted-data","Server sync sends unencrypted data",[560,1001,1002,1003,1006,1007,1010,1011,1014,1015,1018],{},"When ",[572,1004,1005],{},"serverSync"," is enabled, the server push (",[572,1008,1009],{},"POST \u002Fapi\u002Fyjs\u002Fsync",") sends the ",[599,1012,1013],{},"raw in-memory Y.Doc state"," — not the encrypted blobs. Encryption is a ",[599,1016,1017],{},"local-at-rest"," measure only.",[560,1020,1021,1022,697],{},"For true end-to-end encryption where the server never sees plaintext, combine with ",[572,1023,1024],{},"disableSync: true",[637,1026,1028],{"className":639,"code":1027,"language":641,"meta":642,"style":642},"usePrototype(schema, {\n  encryption: { password: userPassword },\n  disableSync: true,  \u002F\u002F never push to server — local-only\n})\n",[572,1029,1030,1040,1056,1072],{"__ignoreMap":642},[646,1031,1032,1034,1036,1038],{"class":648,"line":649},[646,1033,415],{"class":677},[646,1035,681],{"class":667},[646,1037,684],{"class":663},[646,1039,687],{"class":663},[646,1041,1042,1044,1046,1048,1050,1052,1054],{"class":648,"line":656},[646,1043,694],{"class":693},[646,1045,697],{"class":663},[646,1047,664],{"class":663},[646,1049,702],{"class":693},[646,1051,697],{"class":663},[646,1053,707],{"class":667},[646,1055,710],{"class":663},[646,1057,1058,1061,1063,1067,1069],{"class":648,"line":690},[646,1059,1060],{"class":693},"  disableSync",[646,1062,697],{"class":663},[646,1064,1066],{"class":1065},"sfNiH"," true",[646,1068,684],{"class":663},[646,1070,1071],{"class":652},"  \u002F\u002F never push to server — local-only\n",[646,1073,1074,1076],{"class":648,"line":713},[646,1075,671],{"class":663},[646,1077,718],{"class":667},[632,1079,1081],{"id":1080},"losing-the-key-means-losing-the-data","Losing the key means losing the data",[560,1083,1084],{},"There is no recovery path. If a user forgets their password, the encrypted IDB is unreadable. Design your UX accordingly — consider a recovery key or server-side key escrow if data recovery matters.",[632,1086,1088],{"id":1087},"changing-encryption-settings-starts-fresh","Changing encryption settings starts fresh",[560,1090,1091,1092,1094,1095,1097],{},"Encrypted and unencrypted stores use different IDB keys (",[572,1093,589],{}," vs ",[572,1096,593],{},"). Switching a document from unencrypted to encrypted (or vice versa) opens a blank document — the old store is untouched but no longer used.",[632,1099,1101],{"id":1100},"no-corruption-recovery-modal-when-encrypted","No corruption recovery modal when encrypted",[560,1103,1104,1105,1108],{},"The corruption recovery flow (which detects y-indexeddb ",[572,1106,1107],{},"Unexpected case"," rejections) does not apply to the encrypted path. If an encrypted IDB becomes corrupt, the document loads empty. Server sync + snapshots are the recommended backup strategy in that scenario.",[564,1110,1112],{"id":1111},"combining-encryption-with-namespace-isolation","Combining encryption with namespace isolation",[560,1114,1115,1116,697],{},"Both options compose naturally. The resulting IDB key is ",[572,1117,1118],{},"proto:enc:\u003Cnamespace>:\u003Cschema.key>",[637,1120,1122],{"className":639,"code":1121,"language":641,"meta":642,"style":642},"usePrototype(schema, {\n  namespace: `${tenantId}:${userId}`,\n  encryption: { password: userPassword },\n})\n",[572,1123,1124,1134,1163,1179],{"__ignoreMap":642},[646,1125,1126,1128,1130,1132],{"class":648,"line":649},[646,1127,415],{"class":677},[646,1129,681],{"class":667},[646,1131,684],{"class":663},[646,1133,687],{"class":663},[646,1135,1136,1139,1141,1144,1147,1149,1151,1154,1157,1160],{"class":648,"line":656},[646,1137,1138],{"class":693},"  namespace",[646,1140,697],{"class":663},[646,1142,1143],{"class":663}," `${",[646,1145,1146],{"class":667},"tenantId",[646,1148,671],{"class":663},[646,1150,697],{"class":820},[646,1152,1153],{"class":663},"${",[646,1155,1156],{"class":667},"userId",[646,1158,1159],{"class":663},"}`",[646,1161,1162],{"class":663},",\n",[646,1164,1165,1167,1169,1171,1173,1175,1177],{"class":648,"line":690},[646,1166,694],{"class":693},[646,1168,697],{"class":663},[646,1170,664],{"class":663},[646,1172,702],{"class":693},[646,1174,697],{"class":663},[646,1176,707],{"class":667},[646,1178,710],{"class":663},[646,1180,1181,1183],{"class":648,"line":713},[646,1182,671],{"class":663},[646,1184,718],{"class":667},[560,1186,1187,1188,1191,1192,1195,1196,1191,1198,1200],{},"Cleanup via ",[572,1189,1190],{},"clearProtoNamespace"," and ",[572,1193,1194],{},"clearProtoKeys"," handles both ",[572,1197,593],{},[572,1199,589],{}," stores automatically.",[564,1202,1204],{"id":1203},"exported-utilities","Exported utilities",[560,1206,1207],{},"The encryption primitives are imported explicitly (they are not auto-imported):",[637,1209,1211],{"className":639,"code":1210,"language":641,"meta":642,"style":642},"import { generateSalt, deriveKey, importRawKey, encryptBytes, decryptBytes } from '#protokit\u002Futils\u002Fencryption'\n\n\u002F\u002F Key derivation\nconst salt = generateSalt()                          \u002F\u002F 16 random bytes\nconst key  = await deriveKey(password, salt)         \u002F\u002F PBKDF2 → CryptoKey\nconst key  = await importRawKey(bytes)               \u002F\u002F 32-byte buffer → CryptoKey\n\n\u002F\u002F Encryption \u002F decryption (low-level — use EncryptedIdbPersistence for persistence)\nconst blob  = await encryptBytes(key, uint8Array)    \u002F\u002F AES-GCM encrypt\nconst plain = await decryptBytes(key, arrayBuffer)   \u002F\u002F AES-GCM decrypt (throws if wrong key)\n",[572,1212,1213,1250,1254,1259,1275,1299,1317,1321,1326,1350],{"__ignoreMap":642},[646,1214,1215,1217,1219,1221,1223,1225,1227,1230,1232,1235,1237,1240,1242,1244,1246,1248],{"class":648,"line":649},[646,1216,798],{"class":797},[646,1218,664],{"class":663},[646,1220,808],{"class":667},[646,1222,684],{"class":663},[646,1224,803],{"class":667},[646,1226,684],{"class":663},[646,1228,1229],{"class":667}," importRawKey",[646,1231,684],{"class":663},[646,1233,1234],{"class":667}," encryptBytes",[646,1236,684],{"class":663},[646,1238,1239],{"class":667}," decryptBytes",[646,1241,811],{"class":663},[646,1243,814],{"class":797},[646,1245,817],{"class":663},[646,1247,821],{"class":820},[646,1249,824],{"class":663},[646,1251,1252],{"class":648,"line":656},[646,1253,830],{"emptyLinePlaceholder":829},[646,1255,1256],{"class":648,"line":690},[646,1257,1258],{"class":652},"\u002F\u002F Key derivation\n",[646,1260,1261,1263,1265,1267,1269,1272],{"class":648,"line":713},[646,1262,660],{"class":659},[646,1264,842],{"class":667},[646,1266,746],{"class":663},[646,1268,808],{"class":677},[646,1270,1271],{"class":667},"()                          ",[646,1273,1274],{"class":652},"\u002F\u002F 16 random bytes\n",[646,1276,1277,1279,1282,1284,1286,1288,1291,1293,1296],{"class":648,"line":855},[646,1278,660],{"class":659},[646,1280,1281],{"class":667}," key  ",[646,1283,746],{"class":663},[646,1285,865],{"class":797},[646,1287,803],{"class":677},[646,1289,1290],{"class":667},"(password",[646,1292,684],{"class":663},[646,1294,1295],{"class":667}," salt)         ",[646,1297,1298],{"class":652},"\u002F\u002F PBKDF2 → CryptoKey\n",[646,1300,1301,1303,1305,1307,1309,1311,1314],{"class":648,"line":878},[646,1302,660],{"class":659},[646,1304,1281],{"class":667},[646,1306,746],{"class":663},[646,1308,865],{"class":797},[646,1310,1229],{"class":677},[646,1312,1313],{"class":667},"(bytes)               ",[646,1315,1316],{"class":652},"\u002F\u002F 32-byte buffer → CryptoKey\n",[646,1318,1319],{"class":648,"line":883},[646,1320,830],{"emptyLinePlaceholder":829},[646,1322,1323],{"class":648,"line":904},[646,1324,1325],{"class":652},"\u002F\u002F Encryption \u002F decryption (low-level — use EncryptedIdbPersistence for persistence)\n",[646,1327,1328,1330,1333,1335,1337,1339,1342,1344,1347],{"class":648,"line":917},[646,1329,660],{"class":659},[646,1331,1332],{"class":667}," blob  ",[646,1334,746],{"class":663},[646,1336,865],{"class":797},[646,1338,1234],{"class":677},[646,1340,1341],{"class":667},"(key",[646,1343,684],{"class":663},[646,1345,1346],{"class":667}," uint8Array)    ",[646,1348,1349],{"class":652},"\u002F\u002F AES-GCM encrypt\n",[646,1351,1353,1355,1358,1360,1362,1364,1366,1368,1371],{"class":648,"line":1352},10,[646,1354,660],{"class":659},[646,1356,1357],{"class":667}," plain ",[646,1359,746],{"class":663},[646,1361,865],{"class":797},[646,1363,1239],{"class":677},[646,1365,1341],{"class":667},[646,1367,684],{"class":663},[646,1369,1370],{"class":667}," arrayBuffer)   ",[646,1372,1373],{"class":652},"\u002F\u002F AES-GCM decrypt (throws if wrong key)\n",[560,1375,1376,1378,1379,1381],{},[572,1377,578],{}," is also exported if you need to manage persistence directly outside of ",[572,1380,419],{},".",[564,1383,1385],{"id":1384},"when-to-use-encryption","When to use encryption",[933,1387,1388,1398],{},[936,1389,1390],{},[939,1391,1392,1395],{},[942,1393,1394],{},"Scenario",[942,1396,1397],{},"Recommendation",[949,1399,1400,1408,1416,1424,1434],{},[939,1401,1402,1405],{},[954,1403,1404],{},"Internal tool, company devices",[954,1406,1407],{},"Not needed — namespace isolation is sufficient",[939,1409,1410,1413],{},[954,1411,1412],{},"SaaS, user-owned devices, non-sensitive data",[954,1414,1415],{},"Not needed",[939,1417,1418,1421],{},[954,1419,1420],{},"Financial \u002F health \u002F legal data on shared devices",[954,1422,1423],{},"Enable encryption",[939,1425,1426,1429],{},[954,1427,1428],{},"Compliance requirement (HIPAA, GDPR sensitive data)",[954,1430,1431,1432],{},"Enable encryption + ",[572,1433,1024],{},[939,1435,1436,1439],{},[954,1437,1438],{},"Public kiosk \u002F untrusted device",[954,1440,1441,1442,1444],{},"Encryption + namespace + ",[572,1443,1190],{}," on session end",[1446,1447,1448],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":642,"searchDepth":656,"depth":656,"links":1450},[1451,1452,1456,1457,1463,1464,1465],{"id":566,"depth":656,"text":567},{"id":629,"depth":656,"text":630,"children":1453},[1454,1455],{"id":634,"depth":690,"text":635},{"id":783,"depth":690,"text":784},{"id":930,"depth":656,"text":931},{"id":994,"depth":656,"text":995,"children":1458},[1459,1460,1461,1462],{"id":998,"depth":690,"text":999},{"id":1080,"depth":690,"text":1081},{"id":1087,"depth":690,"text":1088},{"id":1100,"depth":690,"text":1101},{"id":1111,"depth":656,"text":1112},{"id":1203,"depth":656,"text":1204},{"id":1384,"depth":656,"text":1385},"How to encrypt IndexedDB data with AES-GCM so local storage is unreadable without the key — even via DevTools or direct file access.","md",null,{},{"title":468},{"title":468,"description":1466},"AxwjncfRQ6usFttmkxigDMs9c706ZI7tyrDj06sdnsk",[1474,1476],{"title":464,"path":465,"stem":466,"description":1475,"children":-1},"How to scope Y.js documents per user, tenant, or workspace — and how to clean up IndexedDB on logout.",{"title":5,"path":475,"stem":476,"description":1477,"children":-1},"Advanced patterns for Nuxt Protokit — reusable toolkits, schema patterns, extensibility, permission guards and headless mode.",1792254332136]