{
  "schema_version": "1.0",
  "site_id": "photo-archive-notes",
  "canonical_origin": "https://photo-archive-notes.pages.dev",
  "tools": [
    {
      "id": "photo-storage-plan",
      "path": "/tools/photo-storage-plan/",
      "title": "Photo-copy storage planner",
      "description": "Estimate logical storage per complete copy and across all copies, with explicit units and optional planning headroom.",
      "input_schema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "photo_count": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1000000000,
            "description": "Number of photographs; a whole-number planning assumption."
          },
          "average_size": {
            "type": "number",
            "minimum": 0.000001,
            "maximum": 1000000,
            "description": "Average size per photograph in the selected unit, excluding other files unless included in the estimate."
          },
          "size_unit": {
            "type": "string",
            "enum": [
              "MB",
              "MiB"
            ],
            "description": "MB = 1,000,000 bytes; MiB = 1,048,576 bytes."
          },
          "copies": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "description": "Total complete copies, including an original if it is one planned copy."
          },
          "headroom_percent": {
            "type": "number",
            "minimum": 0,
            "maximum": 100,
            "default": 0,
            "description": "Optional extra capacity percentage, default 0; applied to every complete copy."
          }
        },
        "required": [
          "photo_count",
          "average_size",
          "size_unit",
          "copies"
        ]
      },
      "output_schema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "ok",
          "errors",
          "summary",
          "rows",
          "notes",
          "values"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "errors": {
            "type": "array",
            "maxItems": 0,
            "items": {
              "type": "object"
            }
          },
          "summary": {
            "type": "string"
          },
          "rows": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "label",
                "value"
              ],
              "properties": {
                "label": {
                  "type": "string"
                },
                "value": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "number"
                    }
                  ]
                },
                "unit": {
                  "type": "string"
                }
              }
            }
          },
          "notes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "values": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "bytes_per_photo": {
                "type": "number",
                "minimum": 0,
                "description": "Entered mean size converted to bytes; an assumption, not a measured file."
              },
              "logical_per_copy_bytes": {
                "type": "number",
                "minimum": 0,
                "description": "Logical byte capacity of one complete copy, before headroom."
              },
              "planned_per_copy_bytes": {
                "type": "number",
                "minimum": 0,
                "description": "Byte capacity of one complete copy with entered planning headroom."
              },
              "base_bytes": {
                "type": "number",
                "minimum": 0,
                "description": "Total logical bytes across all complete copies, before headroom."
              },
              "planned_bytes": {
                "type": "number",
                "minimum": 0,
                "maximum": 1000000000000000,
                "description": "Total bytes across all complete copies with planning headroom."
              },
              "gb": {
                "type": "number",
                "minimum": 0,
                "description": "All copies including headroom, in decimal GB (1,000,000,000 bytes)."
              },
              "gib": {
                "type": "number",
                "minimum": 0,
                "description": "All copies including headroom, in binary GiB (1,073,741,824 bytes)."
              },
              "per_copy_gb": {
                "type": "number",
                "minimum": 0,
                "description": "One complete copy including headroom, in decimal GB."
              },
              "per_copy_gib": {
                "type": "number",
                "minimum": 0,
                "description": "One complete copy including headroom, in binary GiB."
              },
              "total_logical_gb": {
                "type": "number",
                "minimum": 0,
                "description": "All copies before headroom, in decimal GB."
              },
              "total_logical_gib": {
                "type": "number",
                "minimum": 0,
                "description": "All copies before headroom, in binary GiB."
              },
              "copies": {
                "type": "integer",
                "minimum": 1,
                "maximum": 100,
                "description": "Total complete copies, not extra copies beyond an original."
              },
              "headroom_percent": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "description": "The optional user-entered planning percentage, or 0 when omitted."
              },
              "rule_version": {
                "type": "string",
                "const": "2026-11-05.2",
                "description": "Exact shared calculation rule version."
              }
            },
            "required": [
              "bytes_per_photo",
              "logical_per_copy_bytes",
              "planned_per_copy_bytes",
              "base_bytes",
              "planned_bytes",
              "gb",
              "gib",
              "per_copy_gb",
              "per_copy_gib",
              "total_logical_gb",
              "total_logical_gib",
              "copies",
              "headroom_percent",
              "rule_version"
            ]
          }
        }
      },
      "rule_version": "2026-11-05.2",
      "updated_on": "2026-11-05",
      "sources": [
        {
          "title": "Library of Congress — Digital preservation FAQ",
          "url": "https://www.loc.gov/preservation/about/faqs/reformatting.html",
          "reviewed_on": "2026-11-04"
        },
        {
          "title": "Google Account Help — Download your Google data",
          "url": "https://support.google.com/accounts/answer/3024190?hl=en",
          "reviewed_on": "2026-11-04"
        }
      ],
      "assumptions": [
        "Logical bytes per complete copy = photo count × average file size in bytes. Total logical bytes = that value × total complete copies.",
        "Planning headroom multiplies each copy and the total by (1 + percent ÷ 100). Omitted headroom is 0%.",
        "MB and GB use powers of 1,000; MiB and GiB use powers of 1,024. Copies means all complete copies, not extra copies beyond an original.",
        "The supported total is at most 1,000,000,000,000,000 planned bytes (1 PB), including headroom. Display rounding does not change the calculation."
      ],
      "limitations": [
        "Average-size assumptions omit export metadata, edits, videos and duplicates unless you include them in the estimate. Logical capacity is not a measurement of a disk or cloud account.",
        "No file, photo library or cloud account is accessed. Capacity does not establish independent backups, completed copies, recoverability or media reliability."
      ]
    }
  ]
}
