io.kich.recipe.defs

kich.io

Schema Diff

+106 -0

From

CID
bafyreigndsaovge...
Indexed At
2026-02-18 19:31 UTC
View this version

To

CID
bafyreifrzoaopyg...
Indexed At
2026-09-12 22:53 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

9 breaking changes, 34 non-breaking changes.

Breaking Changes (9)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#recipeView", src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.url", kind: "prop", name: Some("url") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#recipeView", src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.id", kind: "prop", name: Some("id") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#recipeView", src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.name", kind: "prop", name: Some("name") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#recipeView", src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.completenessPercent", kind: "prop", name: Some("completenessPercent") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#recipeView", src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.servings", kind: "prop", name: Some("servings") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#tagRef", src: "io.kich.recipe.defs#tagRef", tgt: "io.kich.recipe.defs#tagRef.name", kind: "prop", name: Some("name") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#tagRef", src: "io.kich.recipe.defs#tagRef", tgt: "io.kich.recipe.defs#tagRef.id", kind: "prop", name: Some("id") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#collectionRef", src: "io.kich.recipe.defs#collectionRef", tgt: "io.kich.recipe.defs#collectionRef.name", kind: "prop", name: Some("name") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#collectionRef", src: "io.kich.recipe.defs#collectionRef", tgt: "io.kich.recipe.defs#collectionRef.id", kind: "prop", name: Some("id") }
Non-Breaking Changes (34)
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#collectionRef" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#collectionRef.id" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#collectionRef.name" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.collections" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.collections:items" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.completenessPercent" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.cookTimeMinutes" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.description" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.id" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.imageUrl" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.missingCount" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.name" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.prepTimeMinutes" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.servings" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.tags" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.tags:items" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.updatedAt" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.url" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#tagRef" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#tagRef.id" }
  • AddedVertex AddedVertex { vertex_id: "io.kich.recipe.defs#tagRef.name" }
  • AddedEdge AddedEdge { src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.collections", kind: "prop", name: Some("collections") }
  • AddedEdge AddedEdge { src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.cookTimeMinutes", kind: "prop", name: Some("cookTimeMinutes") }
  • AddedEdge AddedEdge { src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.description", kind: "prop", name: Some("description") }
  • AddedEdge AddedEdge { src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.imageUrl", kind: "prop", name: Some("imageUrl") }
  • AddedEdge AddedEdge { src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.missingCount", kind: "prop", name: Some("missingCount") }
  • AddedEdge AddedEdge { src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.prepTimeMinutes", kind: "prop", name: Some("prepTimeMinutes") }
  • AddedEdge AddedEdge { src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.tags", kind: "prop", name: Some("tags") }
  • AddedEdge AddedEdge { src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.updatedAt", kind: "prop", name: Some("updatedAt") }
  • AddedEdge AddedEdge { src: "io.kich.recipe.defs#recipeView.collections", tgt: "io.kich.recipe.defs#recipeView.collections:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "io.kich.recipe.defs#recipeView.collections:items", tgt: "io.kich.recipe.defs#collectionRef", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "io.kich.recipe.defs#recipeView.tags", tgt: "io.kich.recipe.defs#recipeView.tags:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "io.kich.recipe.defs#recipeView.tags:items", tgt: "io.kich.recipe.defs#tagRef", kind: "ref", name: None }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "io.kich.recipe.defs#collectionRef" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#collectionRef.id" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#collectionRef.name" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.collections" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.collections:items" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.completenessPercent" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.cookTimeMinutes" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.description" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.id" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.imageUrl" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.missingCount" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.name" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.prepTimeMinutes" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.servings" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.tags" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.tags:items" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.updatedAt" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#recipeView.url" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#tagRef" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#tagRef.id" }
  • AddedVertex { vertex_id: "io.kich.recipe.defs#tagRef.name" }

Additional Notes

  • Breaking: RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#recipeView", src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.url", kind: "prop", name: Some("url") }
  • Breaking: RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#recipeView", src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.id", kind: "prop", name: Some("id") }
  • Breaking: RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#recipeView", src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.name", kind: "prop", name: Some("name") }
  • Breaking: RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#recipeView", src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.completenessPercent", kind: "prop", name: Some("completenessPercent") }
  • Breaking: RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#recipeView", src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.servings", kind: "prop", name: Some("servings") }
  • Breaking: RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#tagRef", src: "io.kich.recipe.defs#tagRef", tgt: "io.kich.recipe.defs#tagRef.name", kind: "prop", name: Some("name") }
  • Breaking: RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#tagRef", src: "io.kich.recipe.defs#tagRef", tgt: "io.kich.recipe.defs#tagRef.id", kind: "prop", name: Some("id") }
  • Breaking: RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#collectionRef", src: "io.kich.recipe.defs#collectionRef", tgt: "io.kich.recipe.defs#collectionRef.name", kind: "prop", name: Some("name") }
  • Breaking: RequiredEdgeAdded { vertex_id: "io.kich.recipe.defs#collectionRef", src: "io.kich.recipe.defs#collectionRef", tgt: "io.kich.recipe.defs#collectionRef.id", kind: "prop", name: Some("id") }
  • Non-breaking: AddedEdge { src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.collections", kind: "prop", name: Some("collections") }
  • Non-breaking: AddedEdge { src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.cookTimeMinutes", kind: "prop", name: Some("cookTimeMinutes") }
  • Non-breaking: AddedEdge { src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.description", kind: "prop", name: Some("description") }
  • Non-breaking: AddedEdge { src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.imageUrl", kind: "prop", name: Some("imageUrl") }
  • Non-breaking: AddedEdge { src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.missingCount", kind: "prop", name: Some("missingCount") }
  • Non-breaking: AddedEdge { src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.prepTimeMinutes", kind: "prop", name: Some("prepTimeMinutes") }
  • Non-breaking: AddedEdge { src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.tags", kind: "prop", name: Some("tags") }
  • Non-breaking: AddedEdge { src: "io.kich.recipe.defs#recipeView", tgt: "io.kich.recipe.defs#recipeView.updatedAt", kind: "prop", name: Some("updatedAt") }
  • Non-breaking: AddedEdge { src: "io.kich.recipe.defs#recipeView.collections", tgt: "io.kich.recipe.defs#recipeView.collections:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "io.kich.recipe.defs#recipeView.collections:items", tgt: "io.kich.recipe.defs#collectionRef", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "io.kich.recipe.defs#recipeView.tags", tgt: "io.kich.recipe.defs#recipeView.tags:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "io.kich.recipe.defs#recipeView.tags:items", tgt: "io.kich.recipe.defs#tagRef", kind: "ref", name: None }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 +
    "collectionRef": {
5 +
      "description": "A collection this recipe belongs to, by id and display name.",
6 +
      "properties": {
7 +
        "id": {
8 +
          "type": "string"
9 +
        },
10 +
        "name": {
11 +
          "type": "string"
12 +
        }
13 +
      },
14 +
      "required": [
15 +
        "id",
16 +
        "name"
17 +
      ],
18 +
      "type": "object"
19 +
    },
4 20
    "main": {
5 21
      "description": "Shared definitions for recipe-related lexicons",
6 22
      "properties": {},
7 23
      "type": "object"
24 +
    },
25 +
    "recipeView": {
26 +
      "description": "A recipe as a list reader sees it: enough to choose one, not enough to cook it. Ingredients and instructions are deliberately absent — a caller that wants to cook follows `url`.",
27 +
      "properties": {
28 +
        "collections": {
29 +
          "items": {
30 +
            "ref": "#collectionRef",
31 +
            "type": "ref"
32 +
          },
33 +
          "type": "array"
34 +
        },
35 +
        "completenessPercent": {
36 +
          "description": "How much of this recipe the pantry already covers, 0–100. A whole number rather than the stored 0–1 fraction, because lexicons have no float type and no reader needs the precision.",
37 +
          "maximum": 100,
38 +
          "minimum": 0,
39 +
          "type": "integer"
40 +
        },
41 +
        "cookTimeMinutes": {
42 +
          "minimum": 0,
43 +
          "type": "integer"
44 +
        },
45 +
        "description": {
46 +
          "type": "string"
47 +
        },
48 +
        "id": {
49 +
          "description": "Stable identifier for this recipe",
50 +
          "type": "string"
51 +
        },
52 +
        "imageUrl": {
53 +
          "description": "An absolute URL to a photograph, already resolved — whether the recipe is private (object storage) or published (a PDS blob on a CDN). Absent when the recipe has no image.",
54 +
          "format": "uri",
55 +
          "type": "string"
56 +
        },
57 +
        "missingCount": {
58 +
          "description": "How many ingredients are not in the house. 0 means everything is in.",
59 +
          "minimum": 0,
60 +
          "type": "integer"
61 +
        },
62 +
        "name": {
63 +
          "type": "string"
64 +
        },
65 +
        "prepTimeMinutes": {
66 +
          "minimum": 0,
67 +
          "type": "integer"
68 +
        },
69 +
        "servings": {
70 +
          "description": "How many the recipe makes. A number; halves are real, so not an integer.",
71 +
          "type": "unknown"
72 +
        },
73 +
        "tags": {
74 +
          "items": {
75 +
            "ref": "#tagRef",
76 +
            "type": "ref"
77 +
          },
78 +
          "type": "array"
79 +
        },
80 +
        "updatedAt": {
81 +
          "format": "datetime",
82 +
          "type": "string"
83 +
        },
84 +
        "url": {
85 +
          "description": "Where to open this recipe in kich",
86 +
          "format": "uri",
87 +
          "type": "string"
88 +
        }
89 +
      },
90 +
      "required": [
91 +
        "id",
92 +
        "name",
93 +
        "servings",
94 +
        "completenessPercent",
95 +
        "url"
96 +
      ],
97 +
      "type": "object"
98 +
    },
99 +
    "tagRef": {
100 +
      "description": "A tag, by id and display name.",
101 +
      "properties": {
102 +
        "id": {
103 +
          "type": "string"
104 +
        },
105 +
        "name": {
106 +
          "type": "string"
107 +
        }
108 +
      },
109 +
      "required": [
110 +
        "id",
111 +
        "name"
112 +
      ],
113 +
      "type": "object"
8 114
    }
9 115
  },
10 116
  "description": "Shared definitions for the recipe namespace.",
11 117
  "id": "io.kich.recipe.defs",
12 118
  "lexicon": 1
13 119
}

Compare Other Versions

Lexicon Garden

@