[{"data":1,"prerenderedAt":2109},["ShallowReactive",2],{"navigation":3,"\u002Fservices\u002Fplaintext-bypass":927,"mdc-8z6zgn-key":2062,"mdc-ocliqy-key":2074},[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":784,"access":12,"apiToc":929,"body":930,"category":2053,"description":2054,"extension":2055,"meta":2056,"navigation":2053,"nest":2057,"path":785,"seo":2058,"sinceVersion":2053,"status":2059,"stem":786,"subtitle":2053,"tier":2060,"tocExternal":2053,"__hash__":2061},"docs\u002Fservices\u002Fplaintext-bypass.md",false,{"type":931,"value":932,"toc":2035},"minimark",[933,936,947,951,956,987,1000,1004,1019,1023,1028,1039,1206,1213,1218,1284,1295,1299,1305,1308,1343,1354,1458,1462,1467,1490,1512,1516,1519,1764,1768,1867,1871,1874,1925,1932,1936,1939,1970,1974,2031],[934,935,784],"h1",{"id":784},[937,938,939],"blockquote",{},[940,941,942,946],"p",{},[943,944,945],"strong",{},"Reference:"," the fixed set of internal collections in a noy-db vault that store plain JSON, by design.",[948,949],"service-meta",{":rows":950},"[{\"label\":\"Cluster\",\"value\":\"disk-format\"},{\"label\":\"Cross-cuts\",\"value\":\"`@noy-db\u002Fhub` core, every `@noy-db\u002Fto-*` storage backend, the `.noydb` bundle format, `@noy-db\u002Fon-magic-link`.\"}]",[952,953,955],"h2",{"id":954},"what-this-doc-is","What this doc is",[940,957,958,959,964,965,969,970,973,974,977,978,982,983,986],{},"noy-db's headline guarantee is that a storage backend — S3, IndexedDB, Postgres, whatever adapter you plug in — only ever sees ciphertext. Every record you write through a ",[960,961,963],"a",{"href":962},"..\u002Fcore\u002F01-overview","vault's collection",", ",[966,967,968],"code",{},"vault.collection\u003CT>(...).put(id, payload)",", is wrapped in an ",[943,971,972],{},"envelope"," (",[966,975,976],{},"{ _noydb, _v, _ts, _iv, _data }",") and ",[960,979,981],{"href":980},"..\u002Fcore\u002Fnoydb\u002Fenclave","encrypted"," with AES-256-GCM under a per-collection ",[943,984,985],{},"DEK"," (data-encryption key) before it reaches the store.",[940,988,989,990,994,995,999],{},"That guarantee has one deliberate carve-out. A handful of collections the hub itself uses to operate — unlocking a ",[960,991,993],{"href":992},"..\u002Fcore\u002F06-permissions-and-keyring","keyring"," (the record that carries a user's wrapped keys), reading vault policy, running the sync engine, redeeming an invite — need to be readable ",[996,997,998],"em",{},"before"," any key material exists to decrypt them with. Encrypting those would create a chicken-and-egg problem: you'd need to unlock the vault to read the document that tells you how to unlock the vault. Those collections store plain JSON instead. This page is the complete list of which ones, why each is exempt, and what a person who compromises only the storage backend (never any key) can learn from them.",[952,1001,1003],{"id":1002},"opt-in","Opt in",[940,1005,1006,1007,1010,1011,1014,1015,1018],{},"There is nothing to opt into. Every vault has this fixed set of plaintext collections\nunconditionally — there is no ",[966,1008,1009],{},"with*()"," strategy, no factory, and no ",[966,1012,1013],{},"createVault"," option that\nturns it on or off. The only thing you can opt into is ",[996,1016,1017],{},"reading"," one of these envelopes directly,\nwhich is what the next section shows.",[952,1020,1022],{"id":1021},"usage","Usage",[1024,1025,1027],"h3",{"id":1026},"read-a-plaintext-envelopes-raw-fields","Read a plaintext envelope's raw fields",[940,1029,1030,1031,1034,1035,1038],{},"A store backend exposes envelopes however it persists them — a ",[966,1032,1033],{},"to-file"," store, for example,\nwrites one JSON file per record. You can inspect the ",[966,1036,1037],{},"_iv"," field yourself to confirm a given\nenvelope is a plaintext bypass rather than ciphertext:",[1040,1041,1046],"pre",{"className":1042,"code":1043,"language":1044,"meta":1045,"style":1045},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { readFileSync } from 'node:fs'\nimport type { EncryptedEnvelope } from '@noy-db\u002Fhub'\n\nconst envelope = JSON.parse(\n  readFileSync('data\u002F\u003Cvault>\u002F_keyring\u002Falice.json', 'utf8'),\n) as EncryptedEnvelope\n\nenvelope._iv\n\u002F\u002F → ''  (empty — this is a plaintext bypass; a non-empty _iv would mean ciphertext)\n","ts","",[966,1047,1048,1081,1105,1112,1138,1171,1184,1189,1199],{"__ignoreMap":1045},[1049,1050,1053,1057,1061,1065,1068,1071,1074,1078],"span",{"class":1051,"line":1052},"line",1,[1049,1054,1056],{"class":1055},"s7zQu","import",[1049,1058,1060],{"class":1059},"sMK4o"," {",[1049,1062,1064],{"class":1063},"sTEyZ"," readFileSync",[1049,1066,1067],{"class":1059}," }",[1049,1069,1070],{"class":1055}," from",[1049,1072,1073],{"class":1059}," '",[1049,1075,1077],{"class":1076},"sfazB","node:fs",[1049,1079,1080],{"class":1059},"'\n",[1049,1082,1084,1086,1089,1091,1094,1096,1098,1100,1103],{"class":1051,"line":1083},2,[1049,1085,1056],{"class":1055},[1049,1087,1088],{"class":1055}," type",[1049,1090,1060],{"class":1059},[1049,1092,1093],{"class":1063}," EncryptedEnvelope",[1049,1095,1067],{"class":1059},[1049,1097,1070],{"class":1055},[1049,1099,1073],{"class":1059},[1049,1101,1102],{"class":1076},"@noy-db\u002Fhub",[1049,1104,1080],{"class":1059},[1049,1106,1108],{"class":1051,"line":1107},3,[1049,1109,1111],{"emptyLinePlaceholder":1110},true,"\n",[1049,1113,1115,1119,1122,1125,1128,1131,1135],{"class":1051,"line":1114},4,[1049,1116,1118],{"class":1117},"spNyl","const",[1049,1120,1121],{"class":1063}," envelope ",[1049,1123,1124],{"class":1059},"=",[1049,1126,1127],{"class":1063}," JSON",[1049,1129,1130],{"class":1059},".",[1049,1132,1134],{"class":1133},"s2Zo4","parse",[1049,1136,1137],{"class":1063},"(\n",[1049,1139,1141,1144,1147,1150,1153,1155,1158,1160,1163,1165,1168],{"class":1051,"line":1140},5,[1049,1142,1143],{"class":1133},"  readFileSync",[1049,1145,1146],{"class":1063},"(",[1049,1148,1149],{"class":1059},"'",[1049,1151,1152],{"class":1076},"data\u002F\u003Cvault>\u002F_keyring\u002Falice.json",[1049,1154,1149],{"class":1059},[1049,1156,1157],{"class":1059},",",[1049,1159,1073],{"class":1059},[1049,1161,1162],{"class":1076},"utf8",[1049,1164,1149],{"class":1059},[1049,1166,1167],{"class":1063},")",[1049,1169,1170],{"class":1059},",\n",[1049,1172,1174,1177,1180],{"class":1051,"line":1173},6,[1049,1175,1176],{"class":1063},") ",[1049,1178,1179],{"class":1055},"as",[1049,1181,1183],{"class":1182},"sBMFI"," EncryptedEnvelope\n",[1049,1185,1187],{"class":1051,"line":1186},7,[1049,1188,1111],{"emptyLinePlaceholder":1110},[1049,1190,1192,1194,1196],{"class":1051,"line":1191},8,[1049,1193,972],{"class":1063},[1049,1195,1130],{"class":1059},[1049,1197,1198],{"class":1063},"_iv\n",[1049,1200,1202],{"class":1051,"line":1201},9,[1049,1203,1205],{"class":1204},"sHwdD","\u002F\u002F → ''  (empty — this is a plaintext bypass; a non-empty _iv would mean ciphertext)\n",[1024,1207,1209,1210],{"id":1208},"unwrap-the-record-with-readplaintextrecord","Unwrap the record with ",[966,1211,1212],{},"readPlaintextRecord",[940,1214,1215,1217],{},[966,1216,1102],{}," exports a small helper that turns a plaintext envelope into the record it carries,\nwithout needing a vault or any key material:",[1040,1219,1221],{"className":1042,"code":1220,"language":1044,"meta":1045,"style":1045},"import { readPlaintextRecord } from '@noy-db\u002Fhub\u002Fdebug'\n\nconst keyringRecord = readPlaintextRecord(envelope)\nconsole.log(keyringRecord)\n\u002F\u002F → { role: 'owner', permissions: { '*': 'rw' }, granted_by: 'alice',\n\u002F\u002F     display_name: 'Alice', deks: { 'default': '…wrapped…' } }\n",[966,1222,1223,1243,1247,1261,1274,1279],{"__ignoreMap":1045},[1049,1224,1225,1227,1229,1232,1234,1236,1238,1241],{"class":1051,"line":1052},[1049,1226,1056],{"class":1055},[1049,1228,1060],{"class":1059},[1049,1230,1231],{"class":1063}," readPlaintextRecord",[1049,1233,1067],{"class":1059},[1049,1235,1070],{"class":1055},[1049,1237,1073],{"class":1059},[1049,1239,1240],{"class":1076},"@noy-db\u002Fhub\u002Fdebug",[1049,1242,1080],{"class":1059},[1049,1244,1245],{"class":1051,"line":1083},[1049,1246,1111],{"emptyLinePlaceholder":1110},[1049,1248,1249,1251,1254,1256,1258],{"class":1051,"line":1107},[1049,1250,1118],{"class":1117},[1049,1252,1253],{"class":1063}," keyringRecord ",[1049,1255,1124],{"class":1059},[1049,1257,1231],{"class":1133},[1049,1259,1260],{"class":1063},"(envelope)\n",[1049,1262,1263,1266,1268,1271],{"class":1051,"line":1114},[1049,1264,1265],{"class":1063},"console",[1049,1267,1130],{"class":1059},[1049,1269,1270],{"class":1133},"log",[1049,1272,1273],{"class":1063},"(keyringRecord)\n",[1049,1275,1276],{"class":1051,"line":1140},[1049,1277,1278],{"class":1204},"\u002F\u002F → { role: 'owner', permissions: { '*': 'rw' }, granted_by: 'alice',\n",[1049,1280,1281],{"class":1051,"line":1173},[1049,1282,1283],{"class":1204},"\u002F\u002F     display_name: 'Alice', deks: { 'default': '…wrapped…' } }\n",[940,1285,1286,1288,1289,1291,1292,1294],{},[966,1287,1212],{}," throws if handed an ",[943,1290,981],{}," envelope (non-empty ",[966,1293,1037],{},") — there is no\nkey here to decrypt with; go through the vault instead.",[952,1296,1298],{"id":1297},"api-reference","API reference",[1024,1300,1302],{"id":1301},"readplaintextrecordenvelope",[966,1303,1304],{},"readPlaintextRecord(envelope)",[940,1306,1307],{},"Extracts the record from a plaintext-stored envelope. Handles both layouts a store can hold:",[1309,1310,1311,1324],"ul",{},[1312,1313,1314,973,1317,1320,1321,1130],"li",{},[943,1315,1316],{},"Classic plaintext",[966,1318,1319],{},"encrypt: false",", or one of the unconditionally-plaintext collections on\nthis page) — the record is a JSON string in ",[966,1322,1323],{},"envelope._data",[1312,1325,1326,973,1329,1331,1332,1335,1336,1339,1340,1130],{},[943,1327,1328],{},"Debug-plaintext",[966,1330,1319],{}," + ",[966,1333,1334],{},"debugPlaintext: true"," on ",[966,1337,1338],{},"createNoydb",") — the record's\nfields are inlined beside the envelope metadata instead of being JSON-stringified into ",[966,1341,1342],{},"_data",[940,1344,1345,1346,1349,1350,1353],{},"Returns ",[966,1347,1348],{},"null"," for an empty\u002Fabsent body. Throws if ",[966,1351,1352],{},"envelope._iv"," is non-empty (an encrypted\nenvelope) — decrypt through the vault instead.",[1040,1355,1357],{"className":1042,"code":1356,"language":1044,"meta":1045,"style":1045},"import { readPlaintextRecord } from '@noy-db\u002Fhub\u002Fdebug'\n\nreadPlaintextRecord({ _noydb: 1, _v: 1, _ts: 't', _iv: '', _data: '{\"id\":\"d1\",\"n\":2}' })\n\u002F\u002F → { id: 'd1', n: 2 }\n",[966,1358,1359,1377,1381,1453],{"__ignoreMap":1045},[1049,1360,1361,1363,1365,1367,1369,1371,1373,1375],{"class":1051,"line":1052},[1049,1362,1056],{"class":1055},[1049,1364,1060],{"class":1059},[1049,1366,1231],{"class":1063},[1049,1368,1067],{"class":1059},[1049,1370,1070],{"class":1055},[1049,1372,1073],{"class":1059},[1049,1374,1240],{"class":1076},[1049,1376,1080],{"class":1059},[1049,1378,1379],{"class":1051,"line":1083},[1049,1380,1111],{"emptyLinePlaceholder":1110},[1049,1382,1383,1385,1387,1390,1394,1397,1401,1403,1406,1408,1410,1412,1415,1417,1419,1422,1424,1426,1429,1431,1434,1436,1439,1441,1443,1446,1448,1450],{"class":1051,"line":1107},[1049,1384,1212],{"class":1133},[1049,1386,1146],{"class":1063},[1049,1388,1389],{"class":1059},"{",[1049,1391,1393],{"class":1392},"swJcz"," _noydb",[1049,1395,1396],{"class":1059},":",[1049,1398,1400],{"class":1399},"sbssI"," 1",[1049,1402,1157],{"class":1059},[1049,1404,1405],{"class":1392}," _v",[1049,1407,1396],{"class":1059},[1049,1409,1400],{"class":1399},[1049,1411,1157],{"class":1059},[1049,1413,1414],{"class":1392}," _ts",[1049,1416,1396],{"class":1059},[1049,1418,1073],{"class":1059},[1049,1420,1421],{"class":1076},"t",[1049,1423,1149],{"class":1059},[1049,1425,1157],{"class":1059},[1049,1427,1428],{"class":1392}," _iv",[1049,1430,1396],{"class":1059},[1049,1432,1433],{"class":1059}," ''",[1049,1435,1157],{"class":1059},[1049,1437,1438],{"class":1392}," _data",[1049,1440,1396],{"class":1059},[1049,1442,1073],{"class":1059},[1049,1444,1445],{"class":1076},"{\"id\":\"d1\",\"n\":2}",[1049,1447,1149],{"class":1059},[1049,1449,1067],{"class":1059},[1049,1451,1452],{"class":1063},")\n",[1049,1454,1455],{"class":1051,"line":1114},[1049,1456,1457],{"class":1204},"\u002F\u002F → { id: 'd1', n: 2 }\n",[952,1459,1461],{"id":1460},"the-discriminator-on-the-wire","The discriminator on the wire",[940,1463,1464,1465,1396],{},"Every envelope read starts by checking one field, ",[966,1466,1037],{},[1309,1468,1469,1477],{},[1312,1470,1471,1473,1474,1476],{},[966,1472,1037],{}," non-empty → the envelope is encrypted with AES-256-GCM under a DEK; ",[966,1475,1342],{}," is ciphertext.",[1312,1478,1479,1482,1483,1486,1487,1489],{},[966,1480,1481],{},"_iv: ''"," (empty string) → the envelope is a ",[943,1484,1485],{},"plaintext bypass","; ",[966,1488,1342],{}," is JSON, readable without any key.",[940,1491,1492,1493,1496,1497,1500,1501,1504,1505,1507,1508,1511],{},"Both paths share the same envelope shape, so the sync engine, conformance tests, and every ",[966,1494,1495],{},"to-*"," backend read either kind the same way — a backend never has to know in advance which collections are which. The discriminator lives on each envelope, not declared once for a whole collection: ",[966,1498,1499],{},"vault.collection\u003CT>(...)"," data is always encrypted, and a few operational collections (the sync-credential store, the tamper-evident ledger, the consent-audit log, blob metadata) carry their ",[996,1502,1503],{},"own"," DEK and are encrypted the same way — the only time they turn up as plaintext is if the entire vault was opened with ",[966,1506,1319],{}," (a whole-vault, all-collections opt-out documented on the vault-creation options, not a per-collection bypass). The collections catalogued below are different: they are plaintext in every vault, unconditionally, regardless of the ",[966,1509,1510],{},"encrypt"," option.",[952,1513,1515],{"id":1514},"the-unconditionally-plaintext-collections","The unconditionally-plaintext collections",[940,1517,1518],{},"Each row is a deliberate exemption: the \"Why\" column is the argument that a change breaking that assumption would need to overturn.",[1520,1521,1522,1537],"table",{},[1523,1524,1525],"thead",{},[1526,1527,1528,1531,1534],"tr",{},[1529,1530,103],"th",{},[1529,1532,1533],{},"Source",[1529,1535,1536],{},"Why it must be plaintext",[1538,1539,1540,1583,1598,1617,1636,1655,1681,1703,1722,1749],"tbody",{},[1526,1541,1542,1548,1553],{},[1543,1544,1545],"td",{},[966,1546,1547],{},"_keyring\u002F\u003CuserId>",[1543,1549,1550],{},[966,1551,1552],{},"with-party\u002Fteam\u002Fkeyring.ts",[1543,1554,1555,1556,1558,1559,1562,1563,1566,1567,964,1570,964,1573,964,1576,964,1579,1582],{},"The ",[960,1557,993],{"href":992}," ",[943,1560,1561],{},"is"," the file that carries a user's wrapped DEKs and their ",[943,1564,1565],{},"KEK"," (key-encryption key) salt. Reading it without keys is the entry point for unlock — encrypting it would mean you'd need a key to find out how to get a key. The fields it exposes (",[966,1568,1569],{},"role",[966,1571,1572],{},"permissions",[966,1574,1575],{},"granted_by",[966,1577,1578],{},"expires_at",[966,1580,1581],{},"display_name",", and the count of wrapped DEKs) are a documented metadata leak: they let a caller check role and permissions without unwrapping anything.",[1526,1584,1585,1590,1595],{},[1543,1586,1587],{},[966,1588,1589],{},"_meta\u002Fpolicy",[1543,1591,1592],{},[966,1593,1594],{},"with-party\u002Fpolicy\u002Fstorage.ts",[1543,1596,1597],{},"The vault's factor\u002Fgate policy has to be readable before any unlock decision is made — a gate can require \"tier-1 unlock\" to even be attempted, and the engine can't know that without reading the policy first.",[1526,1599,1600,1605,1610],{},[1543,1601,1602],{},[966,1603,1604],{},"_meta\u002Frecovery-paper",[1543,1606,1607],{},[966,1608,1609],{},"with-party\u002Fteam\u002Frecovery.ts",[1543,1611,1612,1613,1616],{},"Each entry holds a set of DEKs wrapped under a key derived from the user's paper recovery code (PBKDF2-SHA256, 600,000 iterations) plus its own salt and IV. The ",[996,1614,1615],{},"wrapping"," is the security boundary — the document itself is inert without the recovery code, so there's nothing to protect by also encrypting the envelope.",[1526,1618,1619,1624,1629],{},[1543,1620,1621],{},[966,1622,1623],{},"_meta\u002Fhandle",[1543,1625,1626],{},[966,1627,1628],{},"kernel\u002Fvault.ts",[1543,1630,1631,1632,1635],{},"An opaque ULID identifying a ",[966,1633,1634],{},".noydb"," bundle, generated at first export and reused on every later export of that vault. Read by a multi-vault picker to label bundles before any user is authenticated — and the same ULID already sits unencrypted in the bundle header, so encrypting the vault-side copy would protect nothing.",[1526,1637,1638,1643,1648],{},[1543,1639,1640],{},[966,1641,1642],{},"_meta\u002Fcover",[1543,1644,1645],{},[966,1646,1647],{},"with-party\u002Fdirectory\u002Fcover\u002Fstorage.ts",[1543,1649,1650,1651,1654],{},"Owner-curated label (name, description, icon, locale) that the owner explicitly opts every field into — see ",[960,1652,645],{"href":1653},".\u002Fcover",". Meant to be readable without unlocking the vault, so it can't be encrypted.",[1526,1656,1657,1662,1670],{},[1543,1658,1659],{},[966,1660,1661],{},"_meta\u002Finvite-audit-\u003CtokenId>",[1543,1663,1664,964,1667],{},[966,1665,1666],{},"@noy-db\u002Fon-magic-link",[966,1668,1669],{},"src\u002Finvite.ts",[1543,1671,1672,1673,1676,1677,1680],{},"Audit record for a magic-link invite, read by the recipient's session before they hold any keyring, and mutated when the issuer revokes the invite. It's also the \"revoked-link-shadow-keyring\" defense: if ",[966,1674,1675],{},"acceptInvite"," finds no audit doc for a token, it throws ",[966,1678,1679],{},"InviteAuditMissingError"," and refuses to proceed even if the rest of the link is well-formed — so the check has to run before any key exists to gate it.",[1526,1682,1683,1688,1693],{},[1543,1684,1685],{},[966,1686,1687],{},"_meta\u002Fdirectory",[1543,1689,1690],{},[966,1691,1692],{},"with-party\u002Fdirectory\u002Fstorage.ts",[1543,1694,1695,1696,1699,1700,1702],{},"A one-field vault-level toggle (",[966,1697,1698],{},"{ enabled: boolean }",") read by the user-enumeration helper to decide whether non-admin callers may list vault members — the read has to happen on the same before-any-unlock path as ",[966,1701,1589],{},". A UX flag, not a privacy boundary.",[1526,1704,1705,1710,1715],{},[1543,1706,1707],{},[966,1708,1709],{},"_meta\u002Fvisibility\u002F\u003CkeyringId>",[1543,1711,1712],{},[966,1713,1714],{},"with-party\u002Fdirectory\u002Fvisibility.ts",[1543,1716,1717,1718,1721],{},"A per-user \"hide me from the member list\" opt-out (",[966,1719,1720],{},"{ hidden: boolean }","). Has to be readable even when that user's own envelope can't be decrypted (legacy keyring, missing DEK propagation, corrupted ciphertext), so the enumeration helper can still filter it in.",[1526,1723,1724,1729,1734],{},[1543,1725,1726],{},[966,1727,1728],{},"_meta\u002Fadoption",[1543,1730,1731],{},[966,1732,1733],{},"with-cargo\u002Fadopt-partition.ts",[1543,1735,1736,1737,1740,1741,1744,1745,1748],{},"Marker written when a transferable partition is adopted into a vault that has no keyring yet — there is no DEK to encrypt under. While the partition is adopted-but-unowned it carries a ",[966,1738,1739],{},"transferSeal"," (the partition's DEK set, sealed with AES-GCM under an out-of-band, never-stored 32-byte transfer key) — the ",[996,1742,1743],{},"sealing",", not envelope encryption, is the security boundary. Once an owner is minted, the seal is destroyed and the row is rewritten to ",[966,1746,1747],{},"{ sealId, adoptedAt, consumedAt }"," with no key material left in it.",[1526,1750,1751,1756,1761],{},[1543,1752,1753],{},[966,1754,1755],{},"_sync\u002Fmeta",[1543,1757,1758],{},[966,1759,1760],{},"with-party\u002Fteam\u002Fsync.ts",[1543,1762,1763],{},"The sync engine's own bookkeeping — last-pushed timestamp, last-pulled cursor, the dirty-record set. Has to be readable before the next pull can run, the same chicken-and-egg constraint as the other pre-unlock reads above.",[952,1765,1767],{"id":1766},"what-is-not-in-this-set-verified-encrypted","What is NOT in this set (verified encrypted)",[1309,1769,1770,1787,1806,1818,1834,1851,1859],{},[1312,1771,1772,1775,1776,1778,1779,1782,1783,1786],{},[943,1773,1774],{},"Every user-data collection."," Anything written through ",[966,1777,968],{}," is AES-256-GCM-encrypted under a per-collection DEK. A store sees only ciphertext plus the ",[966,1780,1781],{},"_v"," \u002F ",[966,1784,1785],{},"_ts"," metadata fields.",[1312,1788,1789,1794,1795,1798,1799,1802,1803,1805],{},[943,1790,1791],{},[966,1792,1793],{},"_users\u002F\u003CkeyringId>"," — the per-user envelope (contact info, presence, ",[960,1796,884],{"href":1797},".\u002Fuser-envelope","). Encrypted under its own DEK, propagated to every keyring the same way collection DEKs are. The owner-curated ",[996,1800,1801],{},"vault"," label above (",[966,1804,1642],{},") is the plaintext one; the per-user envelope is not.",[1312,1807,1808,1813,1814,1817],{},[943,1809,1810],{},[966,1811,1812],{},"_sync_credentials"," — per-adapter sync transport secrets (tokens, connection strings). Encrypted under a dedicated DEK and served only through its own owner\u002Fadmin-gated API — never reachable through the generic ",[966,1815,1816],{},"vault.collection()"," handle, and never propagated to a sub-admin grantee, because leaking it would leak a live transport secret rather than metadata.",[1312,1819,1820,1825,1826,1831,1832,1130],{},[943,1821,1822],{},[966,1823,1824],{},"_ledger"," (the hash-chained tamper-evidence log) and ",[943,1827,1828],{},[966,1829,1830],{},"_consent_audit"," (the per-access consent log) — each is encrypted under its own DEK by default. Both can only be read in plaintext if the whole vault was created with ",[966,1833,1319],{},[1312,1835,1836,1841,1842,1847,1848,1850],{},[943,1837,1838],{},[966,1839,1840],{},"_blob_index"," and ",[943,1843,1844],{},[966,1845,1846],{},"_blob_chunks"," — blob metadata and encrypted chunk bytes, both under a vault-shared blob DEK by default; same ",[966,1849,1319],{}," caveat as above.",[1312,1852,1853,1858],{},[943,1854,1855],{},[966,1856,1857],{},"_history"," — full-record version snapshots, encrypted under the host collection's own DEK.",[1312,1860,1861,1866],{},[943,1862,1863],{},[966,1864,1865],{},"_idx\u002F\u003Cfield>\u002F\u003CrecordId>"," — query-index side-car entries, encrypted under the host collection's DEK so a leaked index can't be reverse-engineered into record contents.",[952,1868,1870],{"id":1869},"what-an-attacker-with-store-only-access-can-learn","What an attacker with store-only access can learn",[940,1872,1873],{},"A compromise of a store backend (a leaked S3 bucket, an IndexedDB dump, a captured WebDAV session) — with no key material at all — yields these plaintext fields:",[1309,1875,1876,1888,1895,1902,1909],{},[1312,1877,1878,1884,1885],{},[943,1879,1880,1881,1396],{},"From ",[966,1882,1883],{},"_keyring\u002F*"," every user id with access to the vault, their role, their per-collection permissions, how many DEKs they hold, who granted their access, expiry timestamps, and KEK salts. ",[943,1886,1887],{},"No raw keys.",[1312,1889,1890,1894],{},[943,1891,1880,1892,1396],{},[966,1893,1589],{}," exactly which factors each gate requires. Useful intelligence before attempting a policy bypass; does not help the bypass itself.",[1312,1896,1897,1901],{},[943,1898,1880,1899,1396],{},[966,1900,1604],{}," the wrapped-DEK blob, offline-attackable against the recovery code. The 600,000-iteration PBKDF2 wrap is the entire defense — a short or reused recovery code is the failure mode.",[1312,1903,1904,1908],{},[943,1905,1880,1906,1396],{},[966,1907,1642],{}," whatever the owner explicitly chose to publish.",[1312,1910,1911,1916,1917,1920,1921,1924],{},[943,1912,1880,1913,1915],{},[966,1914,1728],{}," (only while a partition is adopted-but-unowned):"," the sealed partition-DEK blob, offline-attackable against the 32-byte transfer key. That key is 256 bits of randomness delivered out-of-band and never itself stored, so brute-forcing it is infeasible — the exposure is the sealed blob plus the ",[966,1918,1919],{},"sealId"," and adoption timestamp. Once ",[966,1922,1923],{},"createOwnerOnAdoptedPartition"," runs, the blob is gone.",[940,1926,1927,1928,1931],{},"The \"stores see only ciphertext\" guarantee applies to data that flows through ",[966,1929,1930],{},"Collection\u003CT>.put",". The collections above are a documented, bounded exception to it — infrastructure metadata the hub needs before it has any key, not application data.",[952,1933,1935],{"id":1934},"consequences-of-changing-this-set","Consequences of changing this set",[940,1937,1938],{},"Every row above is load-bearing for something the hub does before a key exists — that's what keeps the set small. Two things follow from that:",[1309,1940,1941,1953],{},[1312,1942,1943,1946,1947,1949,1950,1952],{},[943,1944,1945],{},"Adding"," a collection to this list changes the on-disk format contract: every ",[966,1948,1495],{}," backend and every conformance test that reads ",[966,1951,1037],{}," to decide whether to decrypt now has one more collection to special-case, and the new plaintext fields become part of the store-only attacker surface described above.",[1312,1954,1955,1958,1959,1782,1962,1965,1966,1969],{},[943,1956,1957],{},"Removing"," a collection from this list — encrypting something that used to be plaintext — is a breaking on-disk format change for existing vaults: it requires a new envelope-format version (the hub tracks this via ",[966,1960,1961],{},"NOYDB_FORMAT_VERSION",[966,1963,1964],{},"NOYDB_KEYRING_VERSION",") and a migration that rewrites every existing envelope of that shape, since old readers would otherwise try to ",[966,1967,1968],{},"JSON.parse"," ciphertext.",[952,1971,1973],{"id":1972},"see-also","See also",[1309,1975,1976,1985,1990,2002,2011,2020],{},[1312,1977,1978,1980,1981,1984],{},[960,1979,645],{"href":1653}," — the one bypass that is ",[996,1982,1983],{},"consumer-controlled",": the owner explicitly opts every field in.",[1312,1986,1987,1989],{},[960,1988,884],{"href":1797}," — the encrypted counterpart: per-user, not per-vault, and not on this list.",[1312,1991,1992,1995,1996,1998,1999,2001],{},[960,1993,629],{"href":1994},".\u002Fbundle"," — the ",[966,1997,1634],{}," container format; ",[966,2000,1623],{}," is shared between the vault and the bundle header.",[1312,2003,2004,2007,2008,2010],{},[960,2005,844],{"href":2006},".\u002Fsession-tiers"," — ",[966,2009,1589],{}," is the input to the tier\u002Fgate policy engine.",[1312,2012,2013,2017,2018,1130],{},[960,2014,2016],{"href":2015},".\u002Ftransferable-partitions","transferable-partitions"," — the adoption flow that writes ",[966,2019,1728],{},[1312,2021,2022,2023,1130],{},"Proven by showcase ",[960,2024,2028],{"href":2025,"rel":2026},"https:\u002F\u002Fgithub.com\u002Fnoy-db\u002Fdocs\u002Fblob\u002Fmain\u002Fshowcases\u002Fsrc\u002F112-debug-plaintext-mode.showcase.test.ts",[2027],"nofollow",[966,2029,2030],{},"112-debug-plaintext-mode",[2032,2033,2034],"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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":1045,"searchDepth":1107,"depth":1107,"links":2036},[2037,2038,2039,2044,2047,2048,2049,2050,2051,2052],{"id":954,"depth":1083,"text":955},{"id":1002,"depth":1083,"text":1003},{"id":1021,"depth":1083,"text":1022,"children":2040},[2041,2042],{"id":1026,"depth":1107,"text":1027},{"id":1208,"depth":1107,"text":2043},"Unwrap the record with readPlaintextRecord",{"id":1297,"depth":1083,"text":1298,"children":2045},[2046],{"id":1301,"depth":1107,"text":1304},{"id":1460,"depth":1083,"text":1461},{"id":1514,"depth":1083,"text":1515},{"id":1766,"depth":1083,"text":1767},{"id":1869,"depth":1083,"text":1870},{"id":1934,"depth":1083,"text":1935},{"id":1972,"depth":1083,"text":1973},null,"The fixed set of internal collections that store plain JSON instead of ciphertext, why each needs to, and what a store-only attacker learns from them.","md",{},"service",{"title":784,"description":2054},"stable","important","1oOhlS6OPzSFaTlePqX3K-vG5AcmA7TqMkzPh317_uM",{"data":2063,"body":2064},{},{"type":2065,"children":2066},"root",[2067],{"type":2068,"tag":940,"props":2069,"children":2070},"element",{},[2071],{"type":2072,"value":2073},"text","disk-format",{"data":2075,"body":2076},{},{"type":2065,"children":2077},[2078],{"type":2068,"tag":940,"props":2079,"children":2080},{},[2081,2086,2088,2094,2096,2101,2103,2108],{"type":2068,"tag":966,"props":2082,"children":2084},{"className":2083},[],[2085],{"type":2072,"value":1102},{"type":2072,"value":2087}," core, every ",{"type":2068,"tag":966,"props":2089,"children":2091},{"className":2090},[],[2092],{"type":2072,"value":2093},"@noy-db\u002Fto-*",{"type":2072,"value":2095}," storage backend, the ",{"type":2068,"tag":966,"props":2097,"children":2099},{"className":2098},[],[2100],{"type":2072,"value":1634},{"type":2072,"value":2102}," bundle format, ",{"type":2068,"tag":966,"props":2104,"children":2106},{"className":2105},[],[2107],{"type":2072,"value":1666},{"type":2072,"value":1130},1791896587208]