io.kich.recipe.defs

kich.io

Schema Diff

+111 -0

From

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

To

CID
bafyreievxsm7ukv...
Indexed At
2026-09-12 23:51 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

9 breaking changes, 36 non-breaking changes.

Breaking Changes (9)
  • 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") }
  • 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") }
Non-Breaking Changes (36)
  • 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.createdAt" }
  • 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.createdAt", kind: "prop", name: Some("createdAt") }
  • 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.createdAt" }
  • 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#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") }
  • 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") }
  • 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.createdAt", kind: "prop", name: Some("createdAt") }
  • 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 +
        "createdAt": {
46 +
          "description": "When the recipe was saved to this kitchen. Distinct from `updatedAt`, which moves every time somebody edits it — a reader sorting a cookbook by what is new wants the first, not the second.",
47 +
          "format": "datetime",
48 +
          "type": "string"
49 +
        },
50 +
        "description": {
51 +
          "type": "string"
52 +
        },
53 +
        "id": {
54 +
          "description": "Stable identifier for this recipe",
55 +
          "type": "string"
56 +
        },
57 +
        "imageUrl": {
58 +
          "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.",
59 +
          "format": "uri",
60 +
          "type": "string"
61 +
        },
62 +
        "missingCount": {
63 +
          "description": "How many ingredients are not in the house. 0 means everything is in.",
64 +
          "minimum": 0,
65 +
          "type": "integer"
66 +
        },
67 +
        "name": {
68 +
          "type": "string"
69 +
        },
70 +
        "prepTimeMinutes": {
71 +
          "minimum": 0,
72 +
          "type": "integer"
73 +
        },
74 +
        "servings": {
75 +
          "description": "How many the recipe makes. A number; halves are real, so not an integer.",
76 +
          "type": "unknown"
77 +
        },
78 +
        "tags": {
79 +
          "items": {
80 +
            "ref": "#tagRef",
81 +
            "type": "ref"
82 +
          },
83 +
          "type": "array"
84 +
        },
85 +
        "updatedAt": {
86 +
          "format": "datetime",
87 +
          "type": "string"
88 +
        },
89 +
        "url": {
90 +
          "description": "Where to open this recipe in kich",
91 +
          "format": "uri",
92 +
          "type": "string"
93 +
        }
94 +
      },
95 +
      "required": [
96 +
        "id",
97 +
        "name",
98 +
        "servings",
99 +
        "completenessPercent",
100 +
        "url"
101 +
      ],
102 +
      "type": "object"
103 +
    },
104 +
    "tagRef": {
105 +
      "description": "A tag, by id and display name.",
106 +
      "properties": {
107 +
        "id": {
108 +
          "type": "string"
109 +
        },
110 +
        "name": {
111 +
          "type": "string"
112 +
        }
113 +
      },
114 +
      "required": [
115 +
        "id",
116 +
        "name"
117 +
      ],
118 +
      "type": "object"
8 119
    }
9 120
  },
10 121
  "description": "Shared definitions for the recipe namespace.",
11 122
  "id": "io.kich.recipe.defs",
12 123
  "lexicon": 1
13 124
}

Compare Other Versions

Lexicon Garden

@