[{"data":1,"prerenderedAt":2167},["ShallowReactive",2],{"navigation":3,"\u002Farchitecture\u002Fkernel\u002Fforking-the-enclave":927},[4,40,114,446,474,498,596,903],{"title":5,"path":6,"stem":7,"children":8},"Architecture","\u002Farchitecture","architecture",[9,14,28,32,36],{"title":10,"path":6,"stem":11,"access":12,"icon":13},"Overview","architecture\u002Findex","public","i-lucide-network",{"title":10,"path":15,"stem":16,"children":17,"access":12,"icon":19},"\u002Farchitecture\u002Fkernel","architecture\u002F1.kernel\u002Findex",[18,20,24],{"title":10,"path":15,"stem":16,"access":12,"icon":19},"i-lucide-box",{"title":21,"path":22,"stem":23,"access":12},"Enclave","\u002Farchitecture\u002Fkernel\u002Fenclave","architecture\u002F1.kernel\u002Fenclave",{"title":25,"path":26,"stem":27,"access":12},"Forking the enclave","\u002Farchitecture\u002Fkernel\u002Fforking-the-enclave","architecture\u002F1.kernel\u002Fforking-the-enclave",{"title":29,"path":30,"stem":31,"access":12},"Ports","\u002Farchitecture\u002Fports","architecture\u002F2.ports",{"title":33,"path":34,"stem":35,"access":12},"Service layers","\u002Farchitecture\u002Fservice-layers","architecture\u002F3.service-layers",{"title":37,"path":38,"stem":39,"access":12},"Families","\u002Farchitecture\u002Ffamilies","architecture\u002F4.families",{"title":41,"path":42,"stem":43,"children":44},"Core","\u002Fcore","core",[45,47,50,53,56,88,97],{"title":10,"path":42,"stem":46,"access":12,"icon":19},"core\u002Findex",{"title":10,"path":48,"stem":49,"access":12},"\u002Fcore\u002F01-overview","core\u002F01-overview",{"title":10,"path":51,"stem":52,"access":12},"\u002Fcore\u002F05-stores","core\u002F05-stores",{"title":10,"path":54,"stem":55,"access":12},"\u002Fcore\u002F06-permissions-and-keyring","core\u002F06-permissions-and-keyring",{"title":10,"path":57,"stem":58,"children":59,"access":12},"\u002Fcore\u002Fnoydb","core\u002F2.noydb\u002Findex",[60,61,65,68,72,76,80,84],{"title":10,"path":57,"stem":58,"access":12},{"title":62,"path":63,"stem":64,"access":12},"Noydb","\u002Fcore\u002Fnoydb\u002Fmethods","core\u002F2.noydb\u002F1.methods",{"title":21,"path":66,"stem":67,"access":12},"\u002Fcore\u002Fnoydb\u002Fenclave","core\u002F2.noydb\u002F2.enclave",{"title":69,"path":70,"stem":71,"access":12},"Secret & keyring","\u002Fcore\u002Fnoydb\u002Fkeyring","core\u002F2.noydb\u002F3.keyring",{"title":73,"path":74,"stem":75,"access":12},"Authentication","\u002Fcore\u002Fnoydb\u002Fauthentication","core\u002F2.noydb\u002F4.authentication",{"title":77,"path":78,"stem":79,"access":12},"Auth recovery","\u002Fcore\u002Fnoydb\u002Frecovery","core\u002F2.noydb\u002F5.recovery",{"title":81,"path":82,"stem":83,"access":12},"Configuration","\u002Fcore\u002Fnoydb\u002Fconfiguration","core\u002F2.noydb\u002F6.configuration",{"title":85,"path":86,"stem":87,"access":12},"Strategies","\u002Fcore\u002Fnoydb\u002Fstrategies","core\u002F2.noydb\u002F7.strategies",{"title":10,"path":89,"stem":90,"children":91,"access":12},"\u002Fcore\u002Fvault","core\u002F3.vault\u002Findex",[92,93],{"title":10,"path":89,"stem":90,"access":12},{"title":94,"path":95,"stem":96,"access":12},"Vault","\u002Fcore\u002Fvault\u002Fmethods","core\u002F3.vault\u002F1.methods",{"title":10,"path":98,"stem":99,"children":100,"access":12},"\u002Fcore\u002Fcollection","core\u002F4.collection\u002Findex",[101,102,106,110],{"title":10,"path":98,"stem":99,"access":12},{"title":103,"path":104,"stem":105,"access":12},"Collection","\u002Fcore\u002Fcollection\u002Fmethods","core\u002F4.collection\u002F1.methods",{"title":107,"path":108,"stem":109,"access":12},"Querying","\u002Fcore\u002Fcollection\u002Fquerying","core\u002F4.collection\u002F2.querying",{"title":111,"path":112,"stem":113,"access":12},"Schema","\u002Fcore\u002Fcollection\u002Fschema","core\u002F4.collection\u002F3.schema",{"title":37,"path":115,"stem":116,"children":117},"\u002Ffamilies","families",[118,121,168,194,208,212,216,294,340],{"title":10,"path":115,"stem":119,"access":12,"icon":120},"families\u002Findex","i-lucide-plug",{"title":122,"path":123,"stem":124,"children":125,"access":12,"icon":127},"as-Exports","\u002Ffamilies\u002Fas","families\u002Fas\u002Findex",[126,128,132,136,140,144,148,152,156,160,164],{"title":122,"path":123,"stem":124,"access":12,"icon":127},"i-lucide-book-open",{"title":129,"path":130,"stem":131,"access":12},"aws-s3","\u002Ffamilies\u002Fas\u002Faws-s3","families\u002Fas\u002Faws-s3",{"title":133,"path":134,"stem":135,"access":12},"blob","\u002Ffamilies\u002Fas\u002Fblob","families\u002Fas\u002Fblob",{"title":137,"path":138,"stem":139,"access":12},"csv","\u002Ffamilies\u002Fas\u002Fcsv","families\u002Fas\u002Fcsv",{"title":141,"path":142,"stem":143,"access":12},"json","\u002Ffamilies\u002Fas\u002Fjson","families\u002Fas\u002Fjson",{"title":145,"path":146,"stem":147,"access":12},"ndjson","\u002Ffamilies\u002Fas\u002Fndjson","families\u002Fas\u002Fndjson",{"title":149,"path":150,"stem":151,"access":12},"noydb","\u002Ffamilies\u002Fas\u002Fnoydb","families\u002Fas\u002Fnoydb",{"title":153,"path":154,"stem":155,"access":12},"sql","\u002Ffamilies\u002Fas\u002Fsql","families\u002Fas\u002Fsql",{"title":157,"path":158,"stem":159,"access":12},"xlsx","\u002Ffamilies\u002Fas\u002Fxlsx","families\u002Fas\u002Fxlsx",{"title":161,"path":162,"stem":163,"access":12},"xml","\u002Ffamilies\u002Fas\u002Fxml","families\u002Fas\u002Fxml",{"title":165,"path":166,"stem":167,"access":12},"zip","\u002Ffamilies\u002Fas\u002Fzip","families\u002Fas\u002Fzip",{"title":169,"path":170,"stem":171,"children":172,"access":12,"icon":127},"at-Seals","\u002Ffamilies\u002Fat","families\u002Fat\u002Findex",[173,174,178,182,186,190],{"title":169,"path":170,"stem":171,"access":12,"icon":127},{"title":175,"path":176,"stem":177,"access":12},"aws-kms","\u002Ffamilies\u002Fat\u002Faws-kms","families\u002Fat\u002Faws-kms",{"title":179,"path":180,"stem":181,"access":12},"azure-keyvault","\u002Ffamilies\u002Fat\u002Fazure-keyvault","families\u002Fat\u002Fazure-keyvault",{"title":183,"path":184,"stem":185,"access":12},"env","\u002Ffamilies\u002Fat\u002Fenv","families\u002Fat\u002Fenv",{"title":187,"path":188,"stem":189,"access":12},"gcp-kms","\u002Ffamilies\u002Fat\u002Fgcp-kms","families\u002Fat\u002Fgcp-kms",{"title":191,"path":192,"stem":193,"access":12},"macos-keychain","\u002Ffamilies\u002Fat\u002Fmacos-keychain","families\u002Fat\u002Fmacos-keychain",{"title":195,"path":196,"stem":197,"children":198,"access":12,"icon":127},"by-Sessions","\u002Ffamilies\u002Fby","families\u002Fby\u002Findex",[199,200,204],{"title":195,"path":196,"stem":197,"access":12,"icon":127},{"title":201,"path":202,"stem":203,"access":12},"peer","\u002Ffamilies\u002Fby\u002Fpeer","families\u002Fby\u002Fpeer",{"title":205,"path":206,"stem":207,"access":12},"tabs","\u002Ffamilies\u002Fby\u002Ftabs","families\u002Fby\u002Ftabs",{"title":209,"path":210,"stem":211,"access":12},"Classifying a package","\u002Ffamilies\u002Fclassification","families\u002Fclassification",{"title":213,"path":214,"stem":215,"access":12},"Command-line tools","\u002Ffamilies\u002Fcli","families\u002Fcli",{"title":217,"path":218,"stem":219,"children":220,"access":12,"icon":127},"in-Frameworks","\u002Ffamilies\u002Fin","families\u002Fin\u002Findex",[221,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290],{"title":217,"path":218,"stem":219,"access":12,"icon":127},{"title":223,"path":224,"stem":225,"access":12},"ai","\u002Ffamilies\u002Fin\u002Fai","families\u002Fin\u002Fai",{"title":227,"path":228,"stem":229,"access":12},"devtools","\u002Ffamilies\u002Fin\u002Fdevtools","families\u002Fin\u002Fdevtools",{"title":231,"path":232,"stem":233,"access":12},"devtools-tui","\u002Ffamilies\u002Fin\u002Fdevtools-tui","families\u002Fin\u002Fdevtools-tui",{"title":235,"path":236,"stem":237,"access":12},"liff","\u002Ffamilies\u002Fin\u002Fliff","families\u002Fin\u002Fliff",{"title":239,"path":240,"stem":241,"access":12},"nextjs","\u002Ffamilies\u002Fin\u002Fnextjs","families\u002Fin\u002Fnextjs",{"title":243,"path":244,"stem":245,"access":12},"nuxt","\u002Ffamilies\u002Fin\u002Fnuxt","families\u002Fin\u002Fnuxt",{"title":247,"path":248,"stem":249,"access":12},"pinia","\u002Ffamilies\u002Fin\u002Fpinia","families\u002Fin\u002Fpinia",{"title":251,"path":252,"stem":253,"access":12},"pwa","\u002Ffamilies\u002Fin\u002Fpwa","families\u002Fin\u002Fpwa",{"title":255,"path":256,"stem":257,"access":12},"react","\u002Ffamilies\u002Fin\u002Freact","families\u002Fin\u002Freact",{"title":259,"path":260,"stem":261,"access":12},"relay","\u002Ffamilies\u002Fin\u002Frelay","families\u002Fin\u002Frelay",{"title":263,"path":264,"stem":265,"access":12},"rest","\u002Ffamilies\u002Fin\u002Frest","families\u002Fin\u002Frest",{"title":267,"path":268,"stem":269,"access":12},"solid","\u002Ffamilies\u002Fin\u002Fsolid","families\u002Fin\u002Fsolid",{"title":271,"path":272,"stem":273,"access":12},"svelte","\u002Ffamilies\u002Fin\u002Fsvelte","families\u002Fin\u002Fsvelte",{"title":275,"path":276,"stem":277,"access":12},"tanstack-query","\u002Ffamilies\u002Fin\u002Ftanstack-query","families\u002Fin\u002Ftanstack-query",{"title":279,"path":280,"stem":281,"access":12},"tanstack-table","\u002Ffamilies\u002Fin\u002Ftanstack-table","families\u002Fin\u002Ftanstack-table",{"title":283,"path":284,"stem":285,"access":12},"vue","\u002Ffamilies\u002Fin\u002Fvue","families\u002Fin\u002Fvue",{"title":287,"path":288,"stem":289,"access":12},"yjs","\u002Ffamilies\u002Fin\u002Fyjs","families\u002Fin\u002Fyjs",{"title":291,"path":292,"stem":293,"access":12},"zustand","\u002Ffamilies\u002Fin\u002Fzustand","families\u002Fin\u002Fzustand",{"title":295,"path":296,"stem":297,"children":298,"access":12,"icon":127},"on-Auth","\u002Ffamilies\u002Fon","families\u002Fon\u002Findex",[299,300,304,308,312,316,320,324,328,332,336],{"title":295,"path":296,"stem":297,"access":12,"icon":127},{"title":301,"path":302,"stem":303,"access":12},"email-otp","\u002Ffamilies\u002Fon\u002Femail-otp","families\u002Fon\u002Femail-otp",{"title":305,"path":306,"stem":307,"access":12},"magic-link","\u002Ffamilies\u002Fon\u002Fmagic-link","families\u002Fon\u002Fmagic-link",{"title":309,"path":310,"stem":311,"access":12},"oidc","\u002Ffamilies\u002Fon\u002Foidc","families\u002Fon\u002Foidc",{"title":313,"path":314,"stem":315,"access":12},"password","\u002Ffamilies\u002Fon\u002Fpassword","families\u002Fon\u002Fpassword",{"title":317,"path":318,"stem":319,"access":12},"pin","\u002Ffamilies\u002Fon\u002Fpin","families\u002Fon\u002Fpin",{"title":321,"path":322,"stem":323,"access":12},"recovery","\u002Ffamilies\u002Fon\u002Frecovery","families\u002Fon\u002Frecovery",{"title":325,"path":326,"stem":327,"access":12},"shamir","\u002Ffamilies\u002Fon\u002Fshamir","families\u002Fon\u002Fshamir",{"title":329,"path":330,"stem":331,"access":12},"threat","\u002Ffamilies\u002Fon\u002Fthreat","families\u002Fon\u002Fthreat",{"title":333,"path":334,"stem":335,"access":12},"totp","\u002Ffamilies\u002Fon\u002Ftotp","families\u002Fon\u002Ftotp",{"title":337,"path":338,"stem":339,"access":12},"webauthn","\u002Ffamilies\u002Fon\u002Fwebauthn","families\u002Fon\u002Fwebauthn",{"title":341,"path":342,"stem":343,"children":344,"access":12,"icon":127},"to-Stores","\u002Ffamilies\u002Fto","families\u002Fto\u002Findex",[345,346,350,353,357,361,365,370,374,378,382,386,390,394,398,402,406,410,414,417,421,425,429,434,438,442],{"title":341,"path":342,"stem":343,"access":12,"icon":127},{"title":347,"path":348,"stem":349,"access":12},"aws-dynamo","\u002Ffamilies\u002Fto\u002Faws-dynamo","families\u002Fto\u002Faws-dynamo",{"title":129,"path":351,"stem":352,"access":12},"\u002Ffamilies\u002Fto\u002Faws-s3","families\u002Fto\u002Faws-s3",{"title":354,"path":355,"stem":356,"access":12},"browser-fs","\u002Ffamilies\u002Fto\u002Fbrowser-fs","families\u002Fto\u002Fbrowser-fs",{"title":358,"path":359,"stem":360,"access":12},"browser-idb","\u002Ffamilies\u002Fto\u002Fbrowser-idb","families\u002Fto\u002Fbrowser-idb",{"title":362,"path":363,"stem":364,"access":12},"browser-local","\u002Ffamilies\u002Fto\u002Fbrowser-local","families\u002Fto\u002Fbrowser-local",{"title":366,"path":367,"stem":368,"access":12,"icon":369},"Choosing a store","\u002Ffamilies\u002Fto\u002Fchoosing-a-store","families\u002Fto\u002Fchoosing-a-store","i-lucide-split",{"title":371,"path":372,"stem":373,"access":12},"cloudflare-d1","\u002Ffamilies\u002Fto\u002Fcloudflare-d1","families\u002Fto\u002Fcloudflare-d1",{"title":375,"path":376,"stem":377,"access":12},"cloudflare-r2","\u002Ffamilies\u002Fto\u002Fcloudflare-r2","families\u002Fto\u002Fcloudflare-r2",{"title":379,"path":380,"stem":381,"access":12},"drive","\u002Ffamilies\u002Fto\u002Fdrive","families\u002Fto\u002Fdrive",{"title":383,"path":384,"stem":385,"access":12},"file","\u002Ffamilies\u002Fto\u002Ffile","families\u002Fto\u002Ffile",{"title":387,"path":388,"stem":389,"access":12},"icloud","\u002Ffamilies\u002Fto\u002Ficloud","families\u002Fto\u002Ficloud",{"title":391,"path":392,"stem":393,"access":12},"memory","\u002Ffamilies\u002Fto\u002Fmemory","families\u002Fto\u002Fmemory",{"title":395,"path":396,"stem":397,"access":12},"meter","\u002Ffamilies\u002Fto\u002Fmeter","families\u002Fto\u002Fmeter",{"title":399,"path":400,"stem":401,"access":12},"mysql","\u002Ffamilies\u002Fto\u002Fmysql","families\u002Fto\u002Fmysql",{"title":403,"path":404,"stem":405,"access":12},"nfs","\u002Ffamilies\u002Fto\u002Fnfs","families\u002Fto\u002Fnfs",{"title":407,"path":408,"stem":409,"access":12},"postgres","\u002Ffamilies\u002Fto\u002Fpostgres","families\u002Fto\u002Fpostgres",{"title":411,"path":412,"stem":413,"access":12},"probe","\u002Ffamilies\u002Fto\u002Fprobe","families\u002Fto\u002Fprobe",{"title":263,"path":415,"stem":416,"access":12},"\u002Ffamilies\u002Fto\u002Frest","families\u002Fto\u002Frest",{"title":418,"path":419,"stem":420,"access":12},"smb","\u002Ffamilies\u002Fto\u002Fsmb","families\u002Fto\u002Fsmb",{"title":422,"path":423,"stem":424,"access":12},"sqlite","\u002Ffamilies\u002Fto\u002Fsqlite","families\u002Fto\u002Fsqlite",{"title":426,"path":427,"stem":428,"access":12},"ssh","\u002Ffamilies\u002Fto\u002Fssh","families\u002Fto\u002Fssh",{"title":430,"path":431,"stem":432,"access":12,"icon":433},"Store-locator descriptors","\u002Ffamilies\u002Fto\u002Fstore-locator","families\u002Fto\u002Fstore-locator","i-lucide-map-pin",{"title":435,"path":436,"stem":437,"access":12},"supabase","\u002Ffamilies\u002Fto\u002Fsupabase","families\u002Fto\u002Fsupabase",{"title":439,"path":440,"stem":441,"access":12},"turso","\u002Ffamilies\u002Fto\u002Fturso","families\u002Fto\u002Fturso",{"title":443,"path":444,"stem":445,"access":12},"webdav","\u002Ffamilies\u002Fto\u002Fwebdav","families\u002Fto\u002Fwebdav",{"title":447,"path":448,"stem":449,"children":450},"Faq","\u002Ffaq","faq",[451,454,458,462,466,470],{"title":10,"path":448,"stem":452,"access":12,"icon":453},"faq\u002Findex","i-lucide-circle-help",{"title":455,"path":456,"stem":457,"access":12},"Where can noy-db run?","\u002Ffaq\u002Fwhere-can-noy-db-run","faq\u002F1.where-can-noy-db-run",{"title":459,"path":460,"stem":461,"access":12},"Native mobile & PWA","\u002Ffaq\u002Fmobile-and-pwa","faq\u002F2.mobile-and-pwa",{"title":463,"path":464,"stem":465,"access":12},"Threat model","\u002Ffaq\u002Fthreat-model","faq\u002F3.threat-model",{"title":467,"path":468,"stem":469,"access":12},"Community & ecosystem","\u002Ffaq\u002Fcommunity-and-ecosystem","faq\u002F4.community-and-ecosystem",{"title":471,"path":472,"stem":473,"access":12},"Licensing","\u002Ffaq\u002Flicensing","faq\u002F5.licensing",{"title":475,"path":476,"stem":477,"children":478},"Glossary","\u002Fglossary","glossary",[479,482,486,490,494],{"title":10,"path":476,"stem":480,"access":12,"icon":481},"glossary\u002Findex","i-lucide-book-a",{"title":483,"path":484,"stem":485,"access":12},"Core vocabulary","\u002Fglossary\u002Fcore-vocabulary","glossary\u002Fcore-vocabulary",{"title":487,"path":488,"stem":489,"access":12},"Deletion vocabulary","\u002Fglossary\u002Fdeletion","glossary\u002Fdeletion",{"title":491,"path":492,"stem":493,"access":12},"Satellite collection vocabulary","\u002Fglossary\u002Fsatellite-collections","glossary\u002Fsatellite-collections",{"title":495,"path":496,"stem":497,"access":12},"Schema migration vocabulary","\u002Fglossary\u002Fschema-migration","glossary\u002Fschema-migration",{"title":499,"path":500,"stem":501,"children":502},"Recipes","\u002Frecipes","recipes",[503,506,510,514,518,522,526,530,534,538,542,546,550,554,558,562,567,571,575,580,584,588,592],{"title":10,"path":500,"stem":504,"access":12,"icon":505},"recipes\u002Findex","i-lucide-play",{"title":507,"path":508,"stem":509,"access":12},"Accounting app","\u002Frecipes\u002Faccounting-app","recipes\u002Faccounting-app",{"title":511,"path":512,"stem":513,"access":12},"Analytics app","\u002Frecipes\u002Fanalytics-app","recipes\u002Fanalytics-app",{"title":515,"path":516,"stem":517,"access":12},"Attestation verifier","\u002Frecipes\u002Fattestation-verifier","recipes\u002Fattestation-verifier",{"title":519,"path":520,"stem":521,"access":12},"AWS-KMS attestation","\u002Frecipes\u002Faws-kms-pdf-attestation","recipes\u002Faws-kms-pdf-attestation",{"title":523,"path":524,"stem":525,"access":12},"Browser durability","\u002Frecipes\u002Fbrowser-durability","recipes\u002Fbrowser-durability",{"title":527,"path":528,"stem":529,"access":12},"Production cloud store","\u002Frecipes\u002Fcloud-store","recipes\u002Fcloud-store",{"title":531,"path":532,"stem":533,"access":12},"Compose your own setup","\u002Frecipes\u002Fcompose-your-own","recipes\u002Fcompose-your-own",{"title":535,"path":536,"stem":537,"access":12},"Confidential HR records","\u002Frecipes\u002Fconfidential-hr","recipes\u002Fconfidential-hr",{"title":539,"path":540,"stem":541,"access":12},"Composing an echo secret","\u002Frecipes\u002Fecho-secret-enrollment","recipes\u002Fecho-secret-enrollment",{"title":543,"path":544,"stem":545,"access":12},"Email archive","\u002Frecipes\u002Femail-archive","recipes\u002Femail-archive",{"title":547,"path":548,"stem":549,"access":12},"Email archive — threads & revisions","\u002Frecipes\u002Femail-archive-threads-revisions","recipes\u002Femail-archive-threads-revisions",{"title":551,"path":552,"stem":553,"access":12},"Export & portability","\u002Frecipes\u002Fexport-portability","recipes\u002Fexport-portability",{"title":555,"path":556,"stem":557,"access":12},"Passwordless OIDC (AWS Cognito)","\u002Frecipes\u002Fpasswordless-oidc","recipes\u002Fpasswordless-oidc",{"title":559,"path":560,"stem":561,"access":12},"Personal notebook","\u002Frecipes\u002Fpersonal-notebook","recipes\u002Fpersonal-notebook",{"title":563,"path":564,"stem":565,"access":12,"icon":566},"Playgrounds","\u002Frecipes\u002Fplaygrounds","recipes\u002Fplaygrounds","i-lucide-gamepad-2",{"title":568,"path":569,"stem":570,"access":12},"React invoice app","\u002Frecipes\u002Freact-invoices","recipes\u002Freact-invoices",{"title":572,"path":573,"stem":574,"access":12},"Collaborative app","\u002Frecipes\u002Frealtime-crdt-app","recipes\u002Frealtime-crdt-app",{"title":576,"path":577,"stem":578,"access":12,"icon":579},"Run the showcases","\u002Frecipes\u002Frun-the-showcases","recipes\u002Frun-the-showcases","i-lucide-flask-conical",{"title":581,"path":582,"stem":583,"access":12},"Search & RAG","\u002Frecipes\u002Fsearch-rag","recipes\u002Fsearch-rag",{"title":585,"path":586,"stem":587,"access":12},"Team vault topology","\u002Frecipes\u002Fteam-vault-topology","recipes\u002Fteam-vault-topology",{"title":589,"path":590,"stem":591,"access":12},"Unlock ceremonies","\u002Frecipes\u002Funlock-ceremonies","recipes\u002Funlock-ceremonies",{"title":593,"path":594,"stem":595,"access":12},"User preferences","\u002Frecipes\u002Fuser-preferences","recipes\u002Fuser-preferences",{"title":597,"path":598,"stem":599,"children":600},"Services","\u002Fservices","services",[601,604,608,612,616,620,624,628,632,636,640,644,648,652,656,660,664,668,672,676,680,684,688,692,696,700,704,710,714,718,722,726,730,734,738,742,746,750,755,759,763,767,771,775,779,783,787,791,795,799,803,807,811,815,819,823,827,831,835,839,843,847,851,855,859,863,867,871,875,879,883,887,891,895,899],{"title":10,"path":598,"stem":602,"access":12,"icon":603},"services\u002Findex","i-lucide-layers",{"title":605,"path":606,"stem":607,"access":12},"archive","\u002Fservices\u002Farchive","services\u002Farchive",{"title":609,"path":610,"stem":611,"access":12},"attestation","\u002Fservices\u002Fattestation","services\u002Fattestation",{"title":613,"path":614,"stem":615,"access":12},"auth-introspection","\u002Fservices\u002Fauth-introspection","services\u002Fauth-introspection",{"title":617,"path":618,"stem":619,"access":12},"auth-landscape","\u002Fservices\u002Fauth-landscape","services\u002Fauth-landscape",{"title":621,"path":622,"stem":623,"access":12},"blobs","\u002Fservices\u002Fblobs","services\u002Fblobs",{"title":625,"path":626,"stem":627,"access":12},"broker","\u002Fservices\u002Fbroker","services\u002Fbroker",{"title":629,"path":630,"stem":631,"access":12},"bundle","\u002Fservices\u002Fbundle","services\u002Fbundle",{"title":633,"path":634,"stem":635,"access":12},"classified","\u002Fservices\u002Fclassified","services\u002Fclassified",{"title":637,"path":638,"stem":639,"access":12},"computed","\u002Fservices\u002Fcomputed","services\u002Fcomputed",{"title":641,"path":642,"stem":643,"access":12},"consent","\u002Fservices\u002Fconsent","services\u002Fconsent",{"title":645,"path":646,"stem":647,"access":12},"cover","\u002Fservices\u002Fcover","services\u002Fcover",{"title":649,"path":650,"stem":651,"access":12},"coverage","\u002Fservices\u002Fcoverage","services\u002Fcoverage",{"title":653,"path":654,"stem":655,"access":12},"crdt","\u002Fservices\u002Fcrdt","services\u002Fcrdt",{"title":657,"path":658,"stem":659,"access":12},"cross-join","\u002Fservices\u002Fcross-join","services\u002Fcross-join",{"title":661,"path":662,"stem":663,"access":12},"custody","\u002Fservices\u002Fcustody","services\u002Fcustody",{"title":665,"path":666,"stem":667,"access":12},"derivations","\u002Fservices\u002Fderivations","services\u002Fderivations",{"title":669,"path":670,"stem":671,"access":12},"directory","\u002Fservices\u002Fdirectory","services\u002Fdirectory",{"title":673,"path":674,"stem":675,"access":12},"search — AI","\u002Fservices\u002Fembeddings","services\u002Fembeddings",{"title":677,"path":678,"stem":679,"access":12},"Field metadata","\u002Fservices\u002Ffield-metadata","services\u002Ffield-metadata",{"title":681,"path":682,"stem":683,"access":12},"Foreign refs","\u002Fservices\u002Fforeign-refs","services\u002Fforeign-refs",{"title":685,"path":686,"stem":687,"access":12},"forget","\u002Fservices\u002Fforget","services\u002Fforget",{"title":689,"path":690,"stem":691,"access":12},"governance","\u002Fservices\u002Fgovernance","services\u002Fgovernance",{"title":693,"path":694,"stem":695,"access":12},"guards","\u002Fservices\u002Fguards","services\u002Fguards",{"title":697,"path":698,"stem":699,"access":12},"history","\u002Fservices\u002Fhistory","services\u002Fhistory",{"title":701,"path":702,"stem":703,"access":12},"i18n","\u002Fservices\u002Fi18n","services\u002Fi18n",{"title":705,"path":706,"stem":707,"children":708,"access":12},"indexing","\u002Fservices\u002Findexing","services\u002Findexing",[709],{"title":705,"path":706,"stem":707,"access":12},{"title":711,"path":712,"stem":713,"access":12},"introspection","\u002Fservices\u002Fintrospection","services\u002Fintrospection",{"title":715,"path":716,"stem":717,"access":12},"joins","\u002Fservices\u002Fjoins","services\u002Fjoins",{"title":719,"path":720,"stem":721,"access":12},"lazy","\u002Fservices\u002Flazy","services\u002Flazy",{"title":723,"path":724,"stem":725,"access":12},"links","\u002Fservices\u002Flinks","services\u002Flinks",{"title":727,"path":728,"stem":729,"access":12},"live","\u002Fservices\u002Flive","services\u002Flive",{"title":731,"path":732,"stem":733,"access":12},"lookup","\u002Fservices\u002Flookup","services\u002Flookup",{"title":735,"path":736,"stem":737,"access":12},"manifest","\u002Fservices\u002Fmanifest","services\u002Fmanifest",{"title":739,"path":740,"stem":741,"access":12},"materialized-views","\u002Fservices\u002Fmaterialized-views","services\u002Fmaterialized-views",{"title":743,"path":744,"stem":745,"access":12},"Metadata ladder","\u002Fservices\u002Fmetadata-ladder","services\u002Fmetadata-ladder",{"title":747,"path":748,"stem":749,"access":12},"Metadata riders","\u002Fservices\u002Fmetadata-riders","services\u002Fmetadata-riders",{"title":751,"path":752,"stem":753,"access":12,"badge":754},"metrics","\u002Fservices\u002Fmetrics","services\u002Fmetrics","Planned",{"title":756,"path":757,"stem":758,"access":12,"badge":754},"migrations","\u002Fservices\u002Fmigrations","services\u002Fmigrations",{"title":760,"path":761,"stem":762,"access":12},"money","\u002Fservices\u002Fmoney","services\u002Fmoney",{"title":764,"path":765,"stem":766,"access":12},"numbering","\u002Fservices\u002Fnumbering","services\u002Fnumbering",{"title":768,"path":769,"stem":770,"access":12},"overlay-views","\u002Fservices\u002Foverlay-views","services\u002Foverlay-views",{"title":772,"path":773,"stem":774,"access":12,"badge":754},"partitioning","\u002Fservices\u002Fpartitioning","services\u002Fpartitioning",{"title":776,"path":777,"stem":778,"access":12},"periods","\u002Fservices\u002Fperiods","services\u002Fperiods",{"title":780,"path":781,"stem":782,"access":12},"persisted-schemas","\u002Fservices\u002Fpersisted-schemas","services\u002Fpersisted-schemas",{"title":784,"path":785,"stem":786,"access":12},"plaintext-bypass","\u002Fservices\u002Fplaintext-bypass","services\u002Fplaintext-bypass",{"title":788,"path":789,"stem":790,"access":12},"pod-redirect","\u002Fservices\u002Fpod-redirect","services\u002Fpod-redirect",{"title":792,"path":793,"stem":794,"access":12},"pod-signature","\u002Fservices\u002Fpod-signature","services\u002Fpod-signature",{"title":796,"path":797,"stem":798,"access":12},"policy","\u002Fservices\u002Fpolicy","services\u002Fpolicy",{"title":800,"path":801,"stem":802,"access":12},"portability","\u002Fservices\u002Fportability","services\u002Fportability",{"title":804,"path":805,"stem":806,"access":12},"reduce","\u002Fservices\u002Freduce","services\u002Freduce",{"title":808,"path":809,"stem":810,"access":12},"routing","\u002Fservices\u002Frouting","services\u002Frouting",{"title":812,"path":813,"stem":814,"access":12},"satellites","\u002Fservices\u002Fsatellites","services\u002Fsatellites",{"title":816,"path":817,"stem":818,"access":12},"schema-identifiers","\u002Fservices\u002Fschema-identifiers","services\u002Fschema-identifiers",{"title":820,"path":821,"stem":822,"access":12},"schema-update","\u002Fservices\u002Fschema-update","services\u002Fschema-update",{"title":824,"path":825,"stem":826,"access":12},"sealed-record","\u002Fservices\u002Fsealed-record","services\u002Fsealed-record",{"title":828,"path":829,"stem":830,"access":12},"sealing provider id","\u002Fservices\u002Fsealing-pid-stability","services\u002Fsealing-pid-stability",{"title":832,"path":833,"stem":834,"access":12},"search — full-text","\u002Fservices\u002Fsearch","services\u002Fsearch",{"title":836,"path":837,"stem":838,"access":12},"sequence","\u002Fservices\u002Fsequence","services\u002Fsequence",{"title":840,"path":841,"stem":842,"access":12},"session","\u002Fservices\u002Fsession","services\u002Fsession",{"title":844,"path":845,"stem":846,"access":12},"session-tiers","\u002Fservices\u002Fsession-tiers","services\u002Fsession-tiers",{"title":848,"path":849,"stem":850,"access":12},"shadow","\u002Fservices\u002Fshadow","services\u002Fshadow",{"title":852,"path":853,"stem":854,"access":12},"share-link","\u002Fservices\u002Fshare-link","services\u002Fshare-link",{"title":856,"path":857,"stem":858,"access":12},"snapshots","\u002Fservices\u002Fsnapshots","services\u002Fsnapshots",{"title":860,"path":861,"stem":862,"access":12},"store capabilities","\u002Fservices\u002Fstorage-capability-matrix","services\u002Fstorage-capability-matrix",{"title":864,"path":865,"stem":866,"access":12},"sync","\u002Fservices\u002Fsync","services\u002Fsync",{"title":868,"path":869,"stem":870,"access":12},"team","\u002Fservices\u002Fteam","services\u002Fteam",{"title":872,"path":873,"stem":874,"access":12},"tiers","\u002Fservices\u002Ftiers","services\u002Ftiers",{"title":876,"path":877,"stem":878,"access":12},"transactions","\u002Fservices\u002Ftransactions","services\u002Ftransactions",{"title":880,"path":881,"stem":882,"access":12},"partitions","\u002Fservices\u002Ftransferable-partitions","services\u002Ftransferable-partitions",{"title":884,"path":885,"stem":886,"access":12},"user-envelope","\u002Fservices\u002Fuser-envelope","services\u002Fuser-envelope",{"title":888,"path":889,"stem":890,"access":12,"badge":754},"validation","\u002Fservices\u002Fvalidation","services\u002Fvalidation",{"title":892,"path":893,"stem":894,"access":12},"vault-head","\u002Fservices\u002Fvault-head","services\u002Fvault-head",{"title":896,"path":897,"stem":898,"access":12},"via","\u002Fservices\u002Fvia","services\u002Fvia",{"title":900,"path":901,"stem":902,"access":12},"withdrawal","\u002Fservices\u002Fwithdrawal","services\u002Fwithdrawal",{"title":904,"path":905,"stem":906,"children":907},"Start","\u002Fstart","start",[908,911,915,919,923],{"title":10,"path":905,"stem":909,"access":12,"icon":910},"start\u002Findex","i-lucide-flag",{"title":912,"path":913,"stem":914,"access":12},"Install","\u002Fstart\u002Finstall","start\u002F1.install",{"title":916,"path":917,"stem":918,"access":12},"Your first vault","\u002Fstart\u002Ffirst-vault","start\u002F2.first-vault",{"title":920,"path":921,"stem":922,"access":12},"Your first service","\u002Fstart\u002Ffirst-service","start\u002F3.first-service",{"title":924,"path":925,"stem":926,"access":12},"See the ciphertext","\u002Fstart\u002Fsee-the-ciphertext","start\u002F4.see-the-ciphertext",{"id":928,"title":25,"access":12,"apiToc":929,"body":930,"category":2159,"description":2160,"extension":2161,"meta":2162,"navigation":2159,"nest":949,"path":26,"seo":2163,"sinceVersion":2159,"status":2164,"stem":27,"subtitle":2159,"tier":2165,"tocExternal":2159,"__hash__":2166},"docs\u002Farchitecture\u002F1.kernel\u002Fforking-the-enclave.md",false,{"type":931,"value":932,"toc":2143},"minimark",[933,937,955,984,989,999,1065,1074,1087,1122,1137,1155,1159,1165,1287,1291,1309,1561,1568,1611,1653,1656,1680,1693,1697,1707,1857,1864,1945,1977,1984,1988,1991,2057,2064,2085,2091,2113,2117,2139],[934,935,25],"h1",{"id":936},"forking-the-enclave",[938,939,940,941,945,946,950,951,954],"p",{},"noy-db is an encrypted, offline-first document store: every record is encrypted inside the\n",[942,943,944],"code",{},"@noy-db\u002Fhub"," package before it reaches any storage backend. The ",[947,948,949],"strong",{},"enclave"," is the one\nfolder inside the hub's kernel where that crypto actually lives — see\n",[952,953,21],"a",{"href":22}," for why it is the one swappable core. This page is\nthe contract for actually swapping it: what a fork replaces, what it must keep, and how it\nproves conformance.",[956,957,958,964],"blockquote",{},[938,959,960,963],{},[947,961,962],{},"Audience:"," a sister project that wants noy-db's spine (the always-on\nkernel orchestration code), services, and wire protocol, but its own crypto engine,\nin-memory protection policy, or key story.",[938,965,966,969,970,972,973,976,977,980,981,983],{},[947,967,968],{},"Read first:"," ",[952,971,21],{"href":22}," — the security invariant this\ncontract protects, and the ",[952,974,975],{"href":6},"nested-cores"," level-0 arrow-flip it exercises\n(the spine consumes the enclave's frozen barrel, never the reverse). The reference\nenclave's own behavior is documented in ",[952,978,979],{"href":66},"Core 02 — Enclave",";\nthe family-level frame is\n",[952,982,37],{"href":38},".",[985,986,988],"h2",{"id":987},"what-a-fork-replaces","What a fork replaces",[938,990,991,998],{},[947,992,993,994,997],{},"Exactly one folder: ",[942,995,996],{},"packages\u002Fhub\u002Fsrc\u002Fcapsule\u002Fenclave-aes\u002F"," — nothing else.","\nThat folder is noy-db's crypto interior:",[1000,1001,1002,1009,1023,1034,1047],"ul",{},[1003,1004,1005,1008],"li",{},[942,1006,1007],{},"crypto.ts"," — the Web Crypto primitives (AES-256-GCM, PBKDF2-SHA256,\nAES-KW, HKDF, SHA-256\u002FHMAC-SHA-256).",[1003,1010,1011,1014,1015,1018,1019,1022],{},[942,1012,1013],{},"primitives.ts"," — those primitives assembled into the\n",[942,1016,1017],{},"CapsulePrimitives"," surface that ",[942,1020,1021],{},"makeCapsule()"," consumes (below).",[1003,1024,1025,1028,1029,1033],{},[942,1026,1027],{},"classify\u002F"," — the verify-without-reveal primitives (value digests,\nblind-index tags, constant-time compare, k-of-n evaluation) consumed by\nthe ",[952,1030,1031],{"href":634},[942,1032,633],{}," service.",[1003,1035,1036,1039,1040,1039,1043,1046],{},[942,1037,1038],{},"broker\u002F",", ",[942,1041,1042],{},"bound.ts",[942,1044,1045],{},"capabilities.ts"," — the capsule's bound form and\nthe capability set it declares.",[1003,1048,1049,1052,1053,1056,1057,1060,1061,1064],{},[942,1050,1051],{},"index.ts"," — the barrel: the ",[947,1054,1055],{},"only"," file the rest of the hub is allowed\nto import from this folder (",[942,1058,1059],{},"scripts\u002Fcheck-architecture.mjs","'s\n",[942,1062,1063],{},"enclave-barrel-only"," check enforces that mechanically).",[1066,1067,1069,1070,1073],"h3",{"id":1068},"the-envelope-format-is-not-in-that-folder-capsuleplumbing-is-shared","⭐ The envelope format is NOT in that folder — ",[942,1071,1072],{},"capsule\u002Fplumbing"," is shared",[938,1075,1076,1077,1082,1083,1086],{},"A fork is smaller than it looks, and smaller than this page used to say. The\nper-record codec, record-identity AAD, tombstones, sealed slots, rekeying,\nsigning and deterministic-slot handling — roughly three quarters of what used\nto sit inside the enclave — live in ",[947,1078,1079],{},[942,1080,1081],{},"capsule\u002Fplumbing\u002F",", because they\nencode ",[947,1084,1085],{},"hub's envelope format, not anyone's cipher",", and are therefore\nidentical for every capsule.",[938,1088,1089,1090,1092,1093,1096,1097,1100,1101,1104,1105,1039,1108,1100,1111,1114,1115,1118,1119,1121],{},"So a fork does not reimplement them. It supplies ",[942,1091,1017],{},"\n(",[942,1094,1095],{},"capsule\u002Fcontract.ts",") — ",[942,1098,1099],{},"encrypt","\u002F",[942,1102,1103],{},"decrypt",", the deterministic and\nsealed-field key derivations, ",[942,1106,1107],{},"generateDEK",[942,1109,1110],{},"wrapCek",[942,1112,1113],{},"unwrapCek",", and the\n",[942,1116,1117],{},"classify"," mint\u002Fopen pair — and ",[942,1120,1021],{}," returns the whole surface\nbuilt on top.",[938,1123,1124,1125,1128,1129,1131,1132,1136],{},"⚠️ ",[947,1126,1127],{},"That is a boundary worth reading before you plan a fork."," Replacing the\ncipher is a ",[942,1130,1017],{}," implementation; changing the ",[1133,1134,1135],"em",{},"envelope"," is a\nchange to hub's format, which is a family-wide seam and not a fork-local\ndecision at all.",[938,1138,1139,1140,1143,1144,1146,1147,1150,1151,1154],{},"A fork deletes this folder and drops in its own implementation — a\ndifferent KDF, a hardware-backed keystore, a post-quantum wrap algorithm, a\nkeyless HSM-backed design — as long as the replacement re-exports the same\nbarrel (below). Nothing outside ",[942,1141,1142],{},"capsule\u002Fenclave-aes\u002F**"," needs to change, and\n",[942,1145,1142],{}," itself imports nothing from ",[942,1148,1149],{},"with-*"," services — the\n",[947,1152,1153],{},"self-containment guarantee",", enforced by the same architecture check in\nthe reverse direction — so there's no tangle to unwind on the way out.",[985,1156,1158],{"id":1157},"what-a-fork-keeps","What a fork keeps",[938,1160,1161,1162,1164],{},"Everything outside ",[942,1163,1142],{}," is family-owned and untouched by a\nfork:",[1000,1166,1167,1222,1242,1255],{},[1003,1168,1169,1172,1173,1039,1176,1039,1179,1039,1182,1185,1186,1039,1189,1039,1192,1039,1195,1198,1199,1202,1203,1039,1206,1039,1209,1039,1212,1039,1215,1039,1218,1221],{},[947,1170,1171],{},"The envelope protocol header"," — ",[942,1174,1175],{},"_noydb",[942,1177,1178],{},"_v",[942,1180,1181],{},"_ts",[942,1183,1184],{},"_by",",\n",[942,1187,1188],{},"_source",[942,1190,1191],{},"_sourceTs",[942,1193,1194],{},"_tier",[942,1196,1197],{},"_elevatedBy",". This is wire protocol, not\nprotection: stores, the sync engine, history, and klum's cross-vault\norchestration all read these fields directly, on every enclave. Only the\n",[947,1200,1201],{},"protected body"," (",[942,1204,1205],{},"_iv",[942,1207,1208],{},"_data",[942,1210,1211],{},"_cek",[942,1213,1214],{},"_det",[942,1216,1217],{},"_sealed",[942,1219,1220],{},"_debug",")\nis enclave territory (see \"The body-access ratchet\" below) — a fork's\nenclave owns those fields' meaning, the header's meaning is fixed by the\nfamily.",[1003,1223,1224,1172,1227,1229,1230,1229,1233,1229,1235,1238,1239,1241],{},[947,1225,1226],{},"The spine",[942,1228,62],{}," → ",[942,1231,1232],{},"openVault()",[942,1234,94],{},[942,1236,1237],{},"vault.collection\u003CT>()","\n→ ",[942,1240,103],{},", the owner keyring, schema\u002Frefs, basic query.",[1003,1243,1244,1247,1248,1250,1251,1254],{},[947,1245,1246],{},"The services"," — every ",[942,1249,1149],{}," subsystem (history, blobs, sync,\naggregate, crdt, team, …) and its ",[942,1252,1253],{},"with\u003CName>()"," strategy seam.",[1003,1256,1257,1172,1260,1263,1264,1267,1268,1271,1272,1275,1276,1279,1280,1283,1284,1286],{},[947,1258,1259],{},"The ports",[942,1261,1262],{},"to-*"," storage destinations, ",[942,1265,1266],{},"in-*"," framework bindings,\n",[942,1269,1270],{},"on-*"," unlock primitives, ",[942,1273,1274],{},"as-*"," export formats, ",[942,1277,1278],{},"by-*"," transports,\n",[942,1281,1282],{},"at-*"," sealing-key providers. None of these see plaintext or the\nprotected body directly; they call through the collection\u002Fvault API or\n(for ",[942,1285,1262],{},") receive ciphertext envelopes verbatim.",[985,1288,1290],{"id":1289},"the-contract-surface","The contract surface",[938,1292,1293,1296,1297,1300,1301,1304,1305,1308],{},[942,1294,1295],{},"capsule\u002Fenclave-aes\u002Findex.ts"," is the frozen barrel — every symbol below must\nexist in any fork's replacement folder, with the same name and shape.\nFrozen by ",[942,1298,1299],{},"packages\u002Fhub\u002F__tests__\u002Fenclave-surface-golden.test.ts"," against\n",[942,1302,1303],{},"enclave-surface.golden.json"," (49 value exports + 5 type exports today).\n",[947,1306,1307],{},"Additive changes only"," — the family can add a new export in a later\nrelease; removing or renaming one is breaking for every fork.",[1000,1310,1311,1330,1356,1406,1419,1446,1460,1472,1510],{},[1003,1312,1313,1172,1316,1202,1319,1322,1323,1326,1327,1329],{},[947,1314,1315],{},"Key type",[942,1317,1318],{},"EnclaveKey",[942,1320,1321],{},"= CryptoKey"," in the reference enclave). The\nopaque handle every barrel-facing signature traffics in. A fork\nredefines the alias to its own representation (",[942,1324,1325],{},"type EnclaveKey = null","\nfor a keyless design) and the spine type-checks against that keyless\nworld at fork-compile time — outside the enclave, ",[942,1328,1318],{}," is never\nconstructed, inspected, or serialized, only passed between barrel calls.",[1003,1331,1332,1172,1335,1100,1337,1339,1340,1039,1343,1185,1346,1349,1350,1039,1353,983],{},[947,1333,1334],{},"Crypto ops",[942,1336,1099],{},[942,1338,1103],{}," (+ ",[942,1341,1342],{},"Bytes",[942,1344,1345],{},"BytesWithAAD",[942,1347,1348],{},"Deterministic"," variants), ",[942,1351,1352],{},"sha256Hex",[942,1354,1355],{},"hmacSha256Hex",[1003,1357,1358,1172,1361,1100,1364,1367,1368,1371,1372,1185,1374,1100,1377,1039,1380,1100,1382,1100,1384,1185,1387,1039,1390,1185,1393,1100,1396,1185,1399,1100,1402,1405],{},[947,1359,1360],{},"Key lifecycle",[942,1362,1363],{},"deriveKey",[942,1365,1366],{},"deriveSecretKey"," (PBKDF2-SHA256 →\nAES-KW \u002F AES-GCM; usage typed by ",[942,1369,1370],{},"SecretKeyUsage","), ",[942,1373,1107],{},[942,1375,1376],{},"wrapKey",[942,1378,1379],{},"unwrapKey",[942,1381,1110],{},[942,1383,1113],{},[942,1385,1386],{},"importCek",[942,1388,1389],{},"derivePresenceKey",[942,1391,1392],{},"deriveDeterministicKey",[942,1394,1395],{},"deriveSealedFieldKey",[942,1397,1398],{},"deriveSealedFieldKeyFromCek",[942,1400,1401],{},"resolveStableCek",[942,1403,1404],{},"rewrapBodyToDek",", base64 helpers, IV\u002Fsalt generators.",[1003,1407,1408,1172,1411,1414,1415,1418],{},[947,1409,1410],{},"Record codec",[942,1412,1413],{},"RecordCodec",", the per-record encode\u002Fdecode engine\n(+ the ",[942,1416,1417],{},"SealedShredSlot"," type).",[1003,1420,1421,1172,1424,1100,1427,1100,1430,1185,1433,1039,1436,1439,1440,1442,1443,1445],{},[947,1422,1423],{},"Sealing",[942,1425,1426],{},"sealRecordToHost",[942,1428,1429],{},"revokeSealedRecord",[942,1431,1432],{},"rotateRecordCek",[942,1434,1435],{},"SealingContext",[942,1437,1438],{},"SEALED_CEK_NS",". ",[1133,1441,1423],{}," grants an ",[942,1444,1282],{}," host you\ncontrol decrypt access to a scoped slice of a record.",[1003,1447,1448,1172,1450,1100,1453,1039,1456,1459],{},[947,1449,1348],{},[942,1451,1452],{},"findByDet",[942,1454,1455],{},"queryByDet",[942,1457,1458],{},"DeterministicContext"," —\nblind-equality lookup over deterministically-encrypted fields.",[1003,1461,1462,1172,1465,1100,1468,1471],{},[947,1463,1464],{},"Tombstone",[942,1466,1467],{},"isTombstone",[942,1469,1470],{},"buildTombstone"," — the residue an erased\nrecord leaves behind.",[1003,1473,1474,1172,1477,1039,1480,1039,1483,1185,1486,1489,1490,1185,1493,1039,1496,1039,1499,1502,1503,1505,1506,1509],{},[947,1475,1476],{},"Classify",[942,1478,1479],{},"deriveVdigSlotKey",[942,1481,1482],{},"pbkdf2VerifyDigest",[942,1484,1485],{},"ctEqualTags",[942,1487,1488],{},"evaluateKofN"," (verify-digest primitives) and ",[942,1491,1492],{},"deriveClassifyIndexKey",[942,1494,1495],{},"deriveClassifyIndexSalt",[942,1497,1498],{},"mintBidxTag",[942,1500,1501],{},"computeBidxTarget","\n(blind-index primitives). The verify\u002Fmatch orchestration around them\nlives in the ",[942,1504,633],{}," service and is ",[1133,1507,1508],{},"not"," part of the fork\ncontract — only these eight primitives are.",[1003,1511,1512,1515,1516,1519,1520,1100,1522,1100,1524,1100,1526,1528,1529],{},[947,1513,1514],{},"Envelope body (the protected-body access contract)"," — the ",[947,1517,1518],{},"4 body\nhelpers",", the sanctioned door onto ",[942,1521,1205],{},[942,1523,1208],{},[942,1525,1211],{},[942,1527,1217],{}," for\neveryone outside the folder:\n",[1000,1530,1531,1537,1543,1555],{},[1003,1532,1533,1536],{},[942,1534,1535],{},"openEnvelopeJson(env, key, opts?): Promise\u003Cstring>"," — decrypt (or pass\nthrough, in plaintext mode) the body to its JSON text.",[1003,1538,1539,1542],{},[942,1540,1541],{},"writeEnvelopeBody(json, key, opts?): Promise\u003CPick\u003CEncryptedEnvelope, '_iv' | '_data' | '_cek'>>","\n— produce the protected-body fields for callers assembling envelopes.",[1003,1544,1545,1172,1548,1551,1552,1554],{},[942,1546,1547],{},"hasPerRecordKey(env): boolean",[942,1549,1550],{},"_cek !== undefined",", without the\ncaller touching ",[942,1553,1211],{}," itself.",[1003,1556,1557,1560],{},[942,1558,1559],{},"envelopeBodyForHash(env): string"," — canonical body-bytes accessor for\nthe ledger hash chain.",[1066,1562,1564,1565],{"id":1563},"refusal-semantics-capsulenotsupportederror","Refusal semantics — ",[942,1566,1567],{},"CapsuleNotSupportedError",[938,1569,1570,1571,1574,1575,1185,1578,1039,1581,1202,1584,1100,1586,1588,1589,1591,1592,1594,1595,1598,1599,1602,1603,1606,1607,1610],{},"The barrel is frozen, but four groups are ",[947,1572,1573],{},"optional",": ",[942,1576,1577],{},"sealing",[942,1579,1580],{},"deterministic",[942,1582,1583],{},"per-record-keys",[942,1585,1110],{},[942,1587,1113],{},"), and ",[942,1590,1117],{},".\nA fork whose enclave doesn't implement one of these refuses it by throwing\n",[942,1593,1567],{}," (code ",[942,1596,1597],{},"'CAPSULE_NOT_SUPPORTED'",", exported from\n",[942,1600,1601],{},"@noy-db\u002Fhub\u002Fcapsule",", carrying the refused ",[942,1604,1605],{},"group",") from ",[947,1608,1609],{},"every"," function\nin that group.",[938,1612,1613,1614,1617,1618,1621,1622,1625,1626,1629,1630,1100,1633,1636,1637,1594,1640,1643,1644,1646,1647,1650,1651,983],{},"Since hub ",[942,1615,1616],{},"0.10.0-pre.2"," this is the canonical refusal, and hub itself throws it:\na capsule that lacks a group is refused ",[947,1619,1620],{},"at startup"," — by ",[942,1623,1624],{},"createNoydb()"," for\nan enabled service, by ",[942,1627,1628],{},"vault.collection()"," for a declared field form, and for\nthe ",[942,1631,1632],{},"authenticate",[942,1634,1635],{},"seal"," posture groups — before any keyring is read or written.\nThe older ",[942,1638,1639],{},"EnclaveNotSupportedError",[942,1641,1642],{},"'ENCLAVE_NOT_SUPPORTED'",", root\n",[942,1645,944],{},") is ",[947,1648,1649],{},"deprecated"," and goes at a later breaking cut; the\nconformance kit accepts both codes, so a fork that still throws it keeps\npassing, but new code throws ",[942,1652,1567],{},[938,1654,1655],{},"Two hard rules:",[1657,1658,1659,1671],"ol",{},[1003,1660,1661,1664,1665,1667,1668,1670],{},[947,1662,1663],{},"Never a mix."," A group either fully works or fully refuses. A fork\nwhose ",[942,1666,1395],{}," refuses but whose ",[942,1669,1398],{},"\nsilently succeeds is non-conformant — see the conformance kit below,\nwhich exists specifically to catch this.",[1003,1672,1673,1676,1677,1679],{},[947,1674,1675],{},"The core groups must never throw it."," Crypto ops, key lifecycle, the\nrecord codec, the envelope-body helpers, and tombstone semantics are\nunconditional — every fork must implement them for real.\n",[942,1678,1567],{}," is a lever for the four optional groups only,\nnever a way to skip the core contract.",[938,1681,1682,1683,1685,1686,1688,1689,1692],{},"A service that receives ",[942,1684,1567],{}," (or the deprecated\n",[942,1687,1639],{},") must ",[947,1690,1691],{},"fail closed"," —\ntreat it as \"this operation is refused,\" never as \"no protection was\nnecessary.\" Silently proceeding as if the optional group succeeded would\nbe a data-protection regression, not a graceful degradation.",[985,1694,1696],{"id":1695},"running-the-conformance-kit","Running the conformance kit",[938,1698,1699,1702,1703,1706],{},[942,1700,1701],{},"test-harnesses\u002Fenclave-conformance\u002F"," in the noy-db source tree is the\ncontract as an executable spec — the enclave equivalent of\n",[942,1704,1705],{},"test-harnesses\u002Fadapter-conformance",". It ships with the source a fork\nstarts from (it is not a published npm package), and it shape-checks the\nenclave module structurally — a fork never has to import noy-db's types.\nPoint it at any enclave module (the reference one, or a fork's):",[1708,1709,1714],"pre",{"className":1710,"code":1711,"language":1712,"meta":1713,"style":1713},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { runEnclaveConformance } from '@noy-db\u002Fports\u002Fcapsule'\nimport * as enclave from '.\u002Fmy-fork\u002Fcapsule\u002Fenclave-aes\u002Findex.js'\n\nrunEnclaveConformance(enclave, {\n  supports: { sealing: true, deterministic: true, perRecordKeys: false, classify: false },\n})\n","ts","",[942,1715,1716,1749,1773,1780,1796,1848],{"__ignoreMap":1713},[1717,1718,1721,1725,1729,1733,1736,1739,1742,1746],"span",{"class":1719,"line":1720},"line",1,[1717,1722,1724],{"class":1723},"s7zQu","import",[1717,1726,1728],{"class":1727},"sMK4o"," {",[1717,1730,1732],{"class":1731},"sTEyZ"," runEnclaveConformance",[1717,1734,1735],{"class":1727}," }",[1717,1737,1738],{"class":1723}," from",[1717,1740,1741],{"class":1727}," '",[1717,1743,1745],{"class":1744},"sfazB","@noy-db\u002Fports\u002Fcapsule",[1717,1747,1748],{"class":1727},"'\n",[1717,1750,1752,1754,1757,1760,1763,1766,1768,1771],{"class":1719,"line":1751},2,[1717,1753,1724],{"class":1723},[1717,1755,1756],{"class":1727}," *",[1717,1758,1759],{"class":1723}," as",[1717,1761,1762],{"class":1731}," enclave ",[1717,1764,1765],{"class":1723},"from",[1717,1767,1741],{"class":1727},[1717,1769,1770],{"class":1744},".\u002Fmy-fork\u002Fcapsule\u002Fenclave-aes\u002Findex.js",[1717,1772,1748],{"class":1727},[1717,1774,1776],{"class":1719,"line":1775},3,[1717,1777,1779],{"emptyLinePlaceholder":1778},true,"\n",[1717,1781,1783,1787,1790,1793],{"class":1719,"line":1782},4,[1717,1784,1786],{"class":1785},"s2Zo4","runEnclaveConformance",[1717,1788,1789],{"class":1731},"(enclave",[1717,1791,1792],{"class":1727},",",[1717,1794,1795],{"class":1727}," {\n",[1717,1797,1799,1803,1806,1808,1811,1813,1817,1819,1822,1824,1826,1828,1831,1833,1836,1838,1841,1843,1845],{"class":1719,"line":1798},5,[1717,1800,1802],{"class":1801},"swJcz","  supports",[1717,1804,1805],{"class":1727},":",[1717,1807,1728],{"class":1727},[1717,1809,1810],{"class":1801}," sealing",[1717,1812,1805],{"class":1727},[1717,1814,1816],{"class":1815},"sfNiH"," true",[1717,1818,1792],{"class":1727},[1717,1820,1821],{"class":1801}," deterministic",[1717,1823,1805],{"class":1727},[1717,1825,1816],{"class":1815},[1717,1827,1792],{"class":1727},[1717,1829,1830],{"class":1801}," perRecordKeys",[1717,1832,1805],{"class":1727},[1717,1834,1835],{"class":1815}," false",[1717,1837,1792],{"class":1727},[1717,1839,1840],{"class":1801}," classify",[1717,1842,1805],{"class":1727},[1717,1844,1835],{"class":1815},[1717,1846,1847],{"class":1727}," },\n",[1717,1849,1851,1854],{"class":1719,"line":1850},6,[1717,1852,1853],{"class":1727},"}",[1717,1855,1856],{"class":1731},")\n",[938,1858,1859,1860,1863],{},"Set each ",[942,1861,1862],{},"supports.*"," flag to whether your enclave implements that optional\ngroup. The kit then verifies, in one pass:",[1000,1865,1866,1869,1883,1891,1901,1922,1929,1932,1935],{},[1003,1867,1868],{},"envelope body round-trip, in both encrypted and plaintext modes (write →\nopen → identical JSON; protocol header untouched),",[1003,1870,1871,1872,1875,1876,1878,1879,1882],{},"body-helper discriminants (",[942,1873,1874],{},"hasPerRecordKey"," reflects ",[942,1877,1211],{}," presence;\n",[942,1880,1881],{},"envelopeBodyForHash"," produces the canonical, key-order-independent body\nstring),",[1003,1884,1885,1886,1229,1888,1890],{},"tombstone semantics (",[942,1887,1470],{},[942,1889,1467],{}," true on an\nencrypted collection; live envelopes false; always false in plaintext\nmode),",[1003,1892,1893,1894,1229,1896,1229,1898,1900],{},"key lifecycle coherence (",[942,1895,1363],{},[942,1897,1376],{},[942,1899,1379],{}," round\ntrip recovers a usable key),",[1003,1902,1903,1906,1907,1909,1910,1913,1914,1917,1918,1921],{},[947,1904,1905],{},"group-consistency"," for each optional group — every function in the\ngroup works, or every function refuses via the\n",[942,1908,1642],{}," code; a mixed group fails the suite (see\n",[942,1911,1912],{},"assertGroupRefuses"," in ",[942,1915,1916],{},"test-harnesses\u002Fenclave-conformance\u002Fsrc\u002Findex.ts",",\nand ",[942,1919,1920],{},"self-test.test.ts",", which proves the checker itself catches a\ndeliberately mixed stub),",[1003,1923,1924,1925,1928],{},"determinism where claimed (",[942,1926,1927],{},"encryptDeterministic"," is stable for the same\ninput),",[1003,1930,1931],{},"the classify primitives where claimed (digest determinism and salt\nseparation, constant-time tag comparison, k-of-n bounds, AAD splice\nrejection, per-field\u002Fper-collection blind-index separation),",[1003,1933,1934],{},"no protected-body-field leaks in helper outputs, and",[1003,1936,1937,1938,1941,1942,1944],{},"known-answer test vectors decrypt correctly (plus, when\n",[942,1939,1940],{},"supports.sealing",", the sealed-slot vector decrypts under\n",[942,1943,1395],{},") — useful if your fork claims wire-compatibility\nwith noy-db's own codec.",[938,1946,1947,969,1950,1039,1952,1185,1954,1956,1957,1959,1960,1963,1964,1966,1967,1100,1969,1185,1971,1100,1973,1976],{},[947,1948,1949],{},"4 documented coverage omissions:",[942,1951,1401],{},[942,1953,1404],{},[942,1955,1452],{},", and ",[942,1958,1455],{}," take a collection-shaped context object\n(",[942,1961,1962],{},"StableCekDeps"," \u002F ",[942,1965,1458],{},") rather than the plain key\u002Fenvelope\narguments a generic kit can construct portably. The kit exercises their\nlower-level primitives instead (",[942,1968,1110],{},[942,1970,1113],{},[942,1972,1927],{},[942,1974,1975],{},"decryptDeterministic",") — a fork's implementation of\nthose four functions is not independently conformance-checked today.",[938,1978,1979,1980,1983],{},"noy-db runs the kit in CI against its own reference enclave\n(",[942,1981,1982],{},"test-harnesses\u002Fenclave-conformance\u002Fsrc\u002Fconformance.test.ts","), proving the\nkit against a known-good implementation before any fork relies on it.",[985,1985,1987],{"id":1986},"security-expectations","Security expectations",[938,1989,1990],{},"A fork's enclave inherits these expectations from the reference\nimplementation — they are the contract's security floor, not\nimplementation details a fork is free to relax:",[1000,1992,1993,2014,2031],{},[1003,1994,1995,1998,1999,2002,2003,2005,2006,2009,2010,2013],{},[947,1996,1997],{},"Fail closed."," A refusal on an optional group must stop the operation,\nnot silently downgrade to \"unprotected.\" Zero npm crypto dependencies\n(",[942,2000,2001],{},"crypto.subtle"," only) and no Node-only imports (",[942,2004,1142],{},"\nmust stay portable to browser\u002FWorker\u002FDeno\u002FBun) are both mechanically\nenforced for the reference enclave (the ",[942,2007,2008],{},"no-crypto-deps"," and\n",[942,2011,2012],{},"hub-portable"," architecture checks) and are strongly recommended\ndefaults for a fork.",[1003,2015,2016,2019,2020,2023,2024,1100,2027,2030],{},[947,2017,2018],{},"Sealed non-residency."," Sealed fields (",[942,2021,2022],{},"_sealed[field]",") must never be\nmaterialized into the plain working set by a barrel helper — no helper\nreturns key material, and ",[942,2025,2026],{},"openEnvelopeJson",[942,2028,2029],{},"writeEnvelopeBody"," operate\nonly on the fields they're contracted to touch.",[1003,2032,2033,969,2039,2042,2043],{},[947,2034,2035,2038],{},[942,2036,2037],{},"forget()"," RAM-scrub.",[942,2040,2041],{},"vault.forget()"," (GDPR crypto-shred) drops the\nwrapped keys that make a subject's data recoverable; live in-memory\ncaches (DEKs, vault instance, active tier) are scrubbed as part of the\nsame call. A fork's key-lifecycle functions must preserve this: once a\nkey is dropped, nothing in the enclave should be able to reconstruct it\nfrom residual state.\n",[1133,2044,2045,2046,2048,2049,2052,2053,2056],{},"(Scope note: on an encrypted vault, ",[942,2047,2037],{}," is idempotent — a second\ncall for the same subject shreds nothing and does not throw. On an\nunencrypted collection, ",[942,2050,2051],{},"isTombstone()"," returns ",[942,2054,2055],{},"false"," by design —\nnothing is ever recognized as a tombstone — so the shred-once\nshort-circuit only exists in encrypted mode; plaintext mode is not\nzero-knowledge to begin with. A fork's tombstone predicate must preserve\nthe encrypted-mode contract.)",[985,2058,2060,2061],{"id":2059},"the-body-access-ratchet-enclave-body-only","The body-access ratchet — ",[942,2062,2063],{},"enclave-body-only",[938,2065,2066,2067,2069,2070,2073,2074,2077,2078,2081,2082,2084],{},"The envelope splits into the protocol header (above) and the protected\nbody, but when the ",[942,2068,2063],{}," architecture check was introduced,\nits scan found ",[947,2071,2072],{},"337 direct body-field accesses across 53 non-enclave\nfiles"," already in the tree — too many to migrate in one pass. The check\nis therefore a ",[947,2075,2076],{},"ratchet, not a hard ban",": each offending file is\ngrandfathered in the ",[942,2079,2080],{},"PRE_EXISTING_BODY_ACCESS"," map in\n",[942,2083,1059],{}," at its scanned count. The rule is exact\nequality — a file's actual count must always match its grandfathered\nentry; raising it fails CI, lowering it without updating the map also\nfails CI (the map has to be edited to bank a real reduction). The map\nreaching empty is the migration's finish line.",[938,2086,2087,2090],{},[947,2088,2089],{},"Current remaining count: 268 direct accesses across 52 files"," (down\nfrom the original 337 across 53) — the counts shrink as grandfathered call\nsites move onto the 4 body helpers.",[938,2092,2093,2094,2096,2097,1963,2099,1963,2101,2103,2104,1100,2106,1100,2108,1100,2110,2112],{},"This ratchet is a fork's friend, not its problem: every grandfathered site\nthat shrinks is a call site that stopped assuming the envelope body's\nliteral shape and started going through ",[942,2095,2026],{}," \u002F\n",[942,2098,2029],{},[942,2100,1874],{},[942,2102,1881],{}," instead —\none fewer place a fork's own enclave has to structurally match the\nreference implementation's ",[942,2105,1205],{},[942,2107,1208],{},[942,2109,1211],{},[942,2111,1217],{}," layout. A fork\ndoesn't need to wait for the ratchet to reach zero to fork today (the\nbarrel contract is what's frozen, not the migration's completion), but a\nsmaller grandfather map means less code implicitly assumes noy-db's\nspecific envelope shape.",[985,2114,2116],{"id":2115},"see-also","See also",[1000,2118,2119,2125,2132],{},[1003,2120,2121,2124],{},[952,2122,949],{"href":2123},".\u002Fenclave"," — the encryption core a fork must structurally match",[1003,2126,2127,2131],{},[952,2128,2130],{"href":2129},".\u002F","kernel"," — the always-on foundation a fork reimplements",[1003,2133,2134,2138],{},[952,2135,2137],{"href":2136},"..\u002Fports","ports"," — the published seams a fork binds instead of hub internals",[2140,2141,2142],"style",{},"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 .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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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);}",{"title":1713,"searchDepth":1775,"depth":1775,"links":2144},[2145,2149,2150,2154,2155,2156,2158],{"id":987,"depth":1751,"text":988,"children":2146},[2147],{"id":1068,"depth":1775,"text":2148},"⭐ The envelope format is NOT in that folder — capsule\u002Fplumbing is shared",{"id":1157,"depth":1751,"text":1158},{"id":1289,"depth":1751,"text":1290,"children":2151},[2152],{"id":1563,"depth":1775,"text":2153},"Refusal semantics — CapsuleNotSupportedError",{"id":1695,"depth":1751,"text":1696},{"id":1986,"depth":1751,"text":1987},{"id":2059,"depth":1751,"text":2157},"The body-access ratchet — enclave-body-only",{"id":2115,"depth":1751,"text":2116},null,"The frozen-barrel contract a sister project implements to replace noy-db's crypto interior — surface, refusal semantics, conformance kit, body-access ratchet.","md",{},{"title":25,"description":2160},"stable","advanced","jMAdwJZUqRodsWm-gCjZ-nUbSP0PWBmaHBI0PUH1pRA",1791896600381]