dev.atfs.file

atfs.dev

{
  "id": "dev.atfs.file",
  "defs": {
    "main": {
      "type": "object",
      "required": [
        "cid",
        "ipfsRoot",
        "size",
        "mimeType"
      ],
      "properties": {
        "cid": {
          "type": "cid-link",
          "description": "The blessed CID of the file's bytes (CIDv1, raw multicodec, sha-256 multihash) — the canonical identity. This is what dev.atfs.repo.uploadFile (and its com.atproto.repo.uploadBlob alias) returns, what equality/dedup use, what atfs's own HTTP surfaces serve at any size, and the only DASL-compatible form. Never a DAG root."
        },
        "size": {
          "type": "integer",
          "description": "Size of the file, in bytes."
        },
        "ipfsRoot": {
          "type": "cid-link",
          "description": "The CID to fetch this file over the IPFS network: the UnixFS root for chunked (large) files, or exactly equal to `cid` when the file fits a single block. Always present, even when equal to `cid`, so consumers never need conditional logic — fetch `ipfsRoot`, then verify the bytes against `cid`. Chunker-dependent: this is *a* valid way to fetch the bytes, not a second identity — re-adding the same bytes elsewhere with different chunk settings would yield a different, equally valid root."
        },
        "mimeType": {
          "type": "string",
          "description": "The IANA media type of the file's bytes, exactly as recorded at upload time (see dev.atfs.repo.uploadFile). Defaults to application/octet-stream when the uploader supplied no Content-Type."
        },
        "providers": {
          "type": "array",
          "items": {
            "type": "string",
            "format": "uri"
          },
          "maxLength": 16,
          "minLength": 1,
          "description": "Advisory HTTPS origins (not full URLs — each is expected to answer both /ipfs/<cid> and a dev.atfs.repo.getFile-style XRPC, with the rest supplied by the author's DID), ordered by preference with the uploader's own instance first. Never required for correctness: a full IPFS client can always fall back to DHT routing. HTTPS is meant literally — an atfs instance asked to pin this file skips any origin naming another scheme, and any origin resolving to an address that isn't routable on the public internet, since a providers list is a stranger's instruction about where to make connections."
        }
      }
    }
  },
  "$type": "com.atproto.lexicon.schema",
  "lexicon": 1,
  "description": "An embeddable reference to a file hosted on an atfs instance and addressed by IPFS content-addressing. Deliberately not the native `blob` lexicon type: a PDS scans records for blob refs and rejects any whose blob isn't in its own blob store, which an atfs-hosted file structurally isn't. Embed this object in place of a blob field instead; field names (mimeType, size) are kept identical to blob refs for familiarity."
}

Validate Record

Validate a record against dev.atfs.file

Validation Options
Treat any remaining unresolved references as valid

Metadata

DID
did:web:atfs.dev
CID
bafyreibnk2lxlcjejv75y4zvclabsrlxo33duun7i3bowdhqbhkbvvmwwq
Indexed At
2026-08-17 08:18 UTC
AT-URI
at://did:web:atfs.dev/com.atproto.lexicon.schema/dev.atfs.file

Version History (3 versions)

Lexicon Garden

@