[{"data":1,"prerenderedAt":554},["ShallowReactive",2],{"docs:\u002Fdocs\u002Fconcepts":3,"docs:nav":507},{"id":4,"title":5,"badge":6,"body":7,"description":253,"extension":499,"meta":500,"navigation":501,"order":278,"path":502,"section":503,"seo":504,"stem":505,"__hash__":506},"docs\u002Fdocs\u002Fconcepts.md","Concepts & data model",null,{"type":8,"value":9,"toc":488},"minimark",[10,14,19,31,35,47,51,54,118,125,148,152,155,234,237,241,244,247,346,349,356,360,363,370,376,380,388,392,395,398,402,484],[11,12,13],"p",{},"Four layers: sector, shard, slab, object. Every endpoint is shaped by them.",[15,16,18],"h2",{"id":17},"sector","Sector",[11,20,21,22,26,27,30],{},"The unit a provider stores: ",[23,24,25],"strong",{},"4 MiB",". Every sector is addressed by its ",[23,28,29],{},"Merkle root",", a 32-byte\nhash. That root is how you ask for it back and how integrity is checked. A provider that returns\ndifferent bytes returns bytes that do not hash to the root, and your client rejects them.",[15,32,34],{"id":33},"shard","Shard",[11,36,37,38,41,42,46],{},"One erasure-coded fragment, stored as one or more sectors on one provider. Default geometry is\n",[23,39,40],{},"30 shards: 10 data, 20 parity",". Shard size is ",[43,44,45],"code",{},"ceil(sliceSize \u002F minShards)",".",[15,48,50],{"id":49},"slab","Slab",[11,52,53],{},"One erasure-coded stripe: the shards that decode together.",[55,56,57,70],"table",{},[58,59,60],"thead",{},[61,62,63,67],"tr",{},[64,65,66],"th",{},"Field",[64,68,69],{},"Meaning",[71,72,73,88,98,108],"tbody",{},[61,74,75,81],{},[76,77,78],"td",{},[43,79,80],{},"minShards",[76,82,83,84,87],{},"Shards needed to reconstruct. ",[43,85,86],{},"10"," by default.",[61,89,90,95],{},[76,91,92],{},[43,93,94],{},"sectors[]",[76,96,97],{},"One entry per shard: provider public key, sector root, contract.",[61,99,100,105],{},[76,101,102],{},[43,103,104],{},"encryptionKey",[76,106,107],{},"32 bytes of encryption parameter for this slab.",[61,109,110,115],{},[76,111,112],{},[43,113,114],{},"version",[76,116,117],{},"Slab format version.",[11,119,120,121,124],{},"A slab's ",[23,122,123],{},"ID is a digest of its parameters",", not a random id and not a hash of the provider set.\nRepair can move a shard to another provider without the slab ID changing, so object references\nstay valid.",[126,127,130],"app-callout",{"title":128,"tone":129},"Slab geometry is validated","warn",[11,131,132,133,136,137,140,141,144,145,147],{},"Redundancy (",[43,134,135],{},"totalShards \u002F minShards",") must be at least ",[23,138,139],{},"1.5×"," and at most ",[23,142,143],{},"4.0×",". No provider\nmay appear twice in one slab. Duplicate sector roots are rejected. ",[43,146,104],{}," must be exactly\n32 bytes. Violations are rejected at registration.",[15,149,151],{"id":150},"object","Object",[11,153,154],{},"An ordered list of slab segments, plus wrapped keys and signatures.",[55,156,157,165],{},[58,158,159],{},[61,160,161,163],{},[64,162,66],{},[64,164,69],{},[71,166,167,177,190,200,210,220],{},[61,168,169,174],{},[76,170,171],{},[43,172,173],{},"id",[76,175,176],{},"32-byte object key. You choose it. Usually a hash of the content.",[61,178,179,184],{},[76,180,181],{},[43,182,183],{},"slabs[]",[76,185,186,189],{},[43,187,188],{},"{ id, offset, length }"," — a byte range in a slab. Concatenated in order, these are the object.",[61,191,192,197],{},[76,193,194],{},[43,195,196],{},"encryptedDataKey",[76,198,199],{},"The object's data key, wrapped. Tessera cannot unwrap it.",[61,201,202,207],{},[76,203,204],{},[43,205,206],{},"encryptedMetadata",[76,208,209],{},"An opaque blob. Tessera never interprets it.",[61,211,212,217],{},[76,213,214],{},[43,215,216],{},"encryptedMetadataKey",[76,218,219],{},"The wrapped key for that blob.",[61,221,222,231],{},[76,223,224,227,228],{},[43,225,226],{},"dataSignature",", ",[43,229,230],{},"metadataSignature",[76,232,233],{},"Your signatures over the respective parts.",[11,235,236],{},"Several small objects can share a slab. One large object can span many. Deduplication and packing\nfall out of the model.",[15,238,240],{"id":239},"what-the-object-model-does-not-contain","What the object model does not contain",[11,242,243],{},"No filename, no path, no directory, no content type, no cleartext size. The columns do not exist.",[11,245,246],{},"If you need a file browser, you build the naming layer:",[248,249,254],"pre",{"className":250,"code":251,"language":252,"meta":253,"style":253},"language-ts shiki shiki-themes github-dark-default github-dark-default","const metadata = {\n  name: 'quarterly-report.pdf',\n  contentType: 'application\u002Fpdf',\n  size: 8_431_233,\n  path: '\u002Freports\u002F2026\u002Fq1\u002F',\n  createdAt: '2026-04-02T09:14:00Z',\n}\n\u002F\u002F encrypt(metadata) → encryptedMetadata\n","ts","",[43,255,256,276,289,300,311,322,333,339],{"__ignoreMap":253},[257,258,261,265,269,272],"span",{"class":259,"line":260},"line",1,[257,262,264],{"class":263},"srH4v","const",[257,266,268],{"class":267},"sEQcL"," metadata",[257,270,271],{"class":263}," =",[257,273,275],{"class":274},"sb7RM"," {\n",[257,277,279,282,286],{"class":259,"line":278},2,[257,280,281],{"class":274},"  name: ",[257,283,285],{"class":284},"skZ57","'quarterly-report.pdf'",[257,287,288],{"class":274},",\n",[257,290,292,295,298],{"class":259,"line":291},3,[257,293,294],{"class":274},"  contentType: ",[257,296,297],{"class":284},"'application\u002Fpdf'",[257,299,288],{"class":274},[257,301,303,306,309],{"class":259,"line":302},4,[257,304,305],{"class":274},"  size: ",[257,307,308],{"class":267},"8_431_233",[257,310,288],{"class":274},[257,312,314,317,320],{"class":259,"line":313},5,[257,315,316],{"class":274},"  path: ",[257,318,319],{"class":284},"'\u002Freports\u002F2026\u002Fq1\u002F'",[257,321,288],{"class":274},[257,323,325,328,331],{"class":259,"line":324},6,[257,326,327],{"class":274},"  createdAt: ",[257,329,330],{"class":284},"'2026-04-02T09:14:00Z'",[257,332,288],{"class":274},[257,334,336],{"class":259,"line":335},7,[257,337,338],{"class":274},"}\n",[257,340,342],{"class":259,"line":341},8,[257,343,345],{"class":344},"sI3U9","\u002F\u002F encrypt(metadata) → encryptedMetadata\n",[11,347,348],{},"To list a directory you decrypt the metadata of the objects you know about, which means you keep a\nlocal index. You take on an index. In exchange no one — including Tessera, including anyone who\ncompels Tessera — can enumerate what you stored or infer it from names.",[126,350,353],{"title":351,"tone":352},"Design your keys deliberately","note",[11,354,355],{},"The object key is the only server-side handle, and you choose it. A content hash gives free\ndeduplication. A deterministic hash of your own path gives lookup by path without an index. A\nrandom key gives unlinkability. Pick before you have a million objects.",[15,357,359],{"id":358},"account","Account",[11,361,362],{},"The account on the storage API is the credential: the ed25519 public key you were issued. No\nusername, no email, no separate account object in the storage path.",[11,364,365,366,369],{},"Every slab and object is bound to the credential that created it. A request signed by a different\ncredential is ",[43,367,368],{},"403",". A new credential is a new namespace. There is no credential that belongs to\nan account that owns objects.",[126,371,373],{"title":372,"tone":129},"The credential is the account",[11,374,375],{},"Losing the private key means losing access to everything stored under it. Tessera cannot restore\nit. We never had it. Back it up before you store anything you care about.",[15,377,379],{"id":378},"how-the-layers-stack","How the layers stack",[248,381,386],{"className":382,"code":384,"language":385},[383],"language-text","Object  \"report.pdf\"        ← your metadata says so; we do not know\n  ├── slab A, offset 0,       length 4194304\n  └── slab B, offset 0,       length 4236929\n                 │\n                 └── Slab B: minShards 10, 30 sectors\n                       ├── shard  1 → provider ed25519:a1b2… root 9f3c…\n                       ├── shard  2 → provider ed25519:c3d4… root 22ab…\n                       ├── …\n                       └── shard 30 → provider ed25519:e5f6… root 7c1d…\n","text",[43,387,384],{"__ignoreMap":253},[15,389,391],{"id":390},"repair","Repair",[11,393,394],{},"Slab health is scanned continuously. When a provider goes away, the shard is reconstructed from\nparity, written to a replacement provider, and the slab record is updated in place. The slab ID\ndoes not change.",[11,396,397],{},"You do not trigger repair, pay for it as an event, or read the data for it to happen.",[15,399,401],{"id":400},"encoding-conventions","Encoding conventions",[55,403,404,414],{},[58,405,406],{},[61,407,408,411],{},[64,409,410],{},"Type",[64,412,413],{},"Wire format",[71,415,416,424,435,450,463,476],{},[61,417,418,421],{},[76,419,420],{},"Slab ID, object key, sector root",[76,422,423],{},"Lowercase hex, 64 characters",[61,425,426,429],{},[76,427,428],{},"Provider public key",[76,430,431,434],{},[43,432,433],{},"ed25519:"," followed by 64 hex characters",[61,436,437,443],{},[76,438,439,442],{},[43,440,441],{},"credential"," query parameter",[76,444,445,446,449],{},"base64url ",[23,447,448],{},"with"," padding",[61,451,452,458],{},[76,453,454,457],{},[43,455,456],{},"appKey"," from provisioning",[76,459,445,460,449],{},[23,461,462],{},"without",[61,464,465,473],{},[76,466,467,468,227,470,472],{},"Byte-slice JSON fields (",[43,469,104],{},[43,471,206],{},", …)",[76,474,475],{},"Standard base64 with padding",[61,477,478,481],{},[76,479,480],{},"Timestamps",[76,482,483],{},"RFC 3339",[485,486,487],"style",{},"html pre.shiki code .srH4v, html code.shiki .srH4v{--shiki-default:#FF7B72;--shiki-dark:#FF7B72}html pre.shiki code .sEQcL, html code.shiki .sEQcL{--shiki-default:#79C0FF;--shiki-dark:#79C0FF}html pre.shiki code .sb7RM, html code.shiki .sb7RM{--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}html pre.shiki code .skZ57, html code.shiki .skZ57{--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html pre.shiki code .sI3U9, html code.shiki .sI3U9{--shiki-default:#8B949E;--shiki-dark:#8B949E}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":253,"searchDepth":291,"depth":291,"links":489},[490,491,492,493,494,495,496,497,498],{"id":17,"depth":278,"text":18},{"id":33,"depth":278,"text":34},{"id":49,"depth":278,"text":50},{"id":150,"depth":278,"text":151},{"id":239,"depth":278,"text":240},{"id":358,"depth":278,"text":359},{"id":378,"depth":278,"text":379},{"id":390,"depth":278,"text":391},{"id":400,"depth":278,"text":401},"md",{},true,"\u002Fdocs\u002Fconcepts","Introduction",{"title":5,"description":253},"docs\u002Fconcepts","K3tagWqnfNZPGiXWdyf1algwhLxwNzzkU_CMmeMb0Tw",[508,512,517,520,523,526,529,532,535,536,540,543,546,551],{"path":509,"title":510,"description":253,"section":511,"order":278,"badge":6},"\u002Fdocs\u002Faccounts","Accounts & billing","Guides",{"path":513,"title":514,"description":515,"section":516,"order":260,"badge":6},"\u002Fdocs\u002Fapi-quickstart","API quickstart","Create a billing account over HTTP, then register a storage key with the SDK.","API",{"path":518,"title":359,"description":253,"section":519,"order":313,"badge":6},"\u002Fdocs\u002Fapi\u002Faccount","API reference",{"path":521,"title":522,"description":253,"section":519,"order":302,"badge":6},"\u002Fdocs\u002Fapi\u002Fobjects","Objects",{"path":524,"title":525,"description":253,"section":519,"order":278,"badge":6},"\u002Fdocs\u002Fapi\u002Fplacement","Placement",{"path":527,"title":528,"description":253,"section":519,"order":260,"badge":6},"\u002Fdocs\u002Fapi\u002Fprovisioning","Credentials",{"path":530,"title":531,"description":253,"section":519,"order":291,"badge":6},"\u002Fdocs\u002Fapi\u002Fslabs","Slabs",{"path":533,"title":534,"description":253,"section":511,"order":291,"badge":6},"\u002Fdocs\u002Fauthentication","Authentication",{"path":502,"title":5,"description":253,"section":503,"order":278,"badge":6},{"path":537,"title":538,"description":253,"section":539,"order":260,"badge":6},"\u002Fdocs\u002Ferrors","Errors","Reference",{"path":541,"title":542,"description":253,"section":516,"order":260,"badge":6},"\u002Fdocs","Overview",{"path":544,"title":545,"description":253,"section":539,"order":278,"badge":6},"\u002Fdocs\u002Flimits","Limits & quotas",{"path":547,"title":548,"description":549,"section":550,"order":260,"badge":6},"\u002Fdocs\u002Fquickstart","CLI quickstart","Install the CLI, create an account, store one file, and read it back.","CLI",{"path":552,"title":553,"description":253,"section":511,"order":302,"badge":6},"\u002Fdocs\u002Frecovery","Recovery without Tessera",1794060204966]