{
"id": "ca.verworn.recipe",
"defs": {
"main": {
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"title",
"ingredients",
"instructions",
"createdAt"
],
"properties": {
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 640,
"maxGraphemes": 64
},
"maxLength": 20,
"description": "Free-form tags for the author's own organization."
},
"image": {
"type": "blob",
"accept": [
"image/png",
"image/jpeg",
"image/webp"
],
"maxSize": 2000000,
"description": "Photo of the finished dish."
},
"notes": {
"type": "string",
"maxLength": 15000,
"description": "Additional remarks, substitutions, or variations.",
"maxGraphemes": 1500
},
"title": {
"type": "string",
"maxLength": 1200,
"minLength": 1,
"description": "Name of the recipe; can not be empty.",
"maxGraphemes": 120
},
"yield": {
"type": "string",
"maxLength": 640,
"description": "Free-form yield, for recipes not measured in servings (eg, '24 cookies').",
"maxGraphemes": 64
},
"course": {
"type": "string",
"maxLength": 64,
"description": "Which part of a meal the recipe is for.",
"knownValues": [
"appetizer",
"breakfast",
"brunch",
"lunch",
"dinner",
"side",
"salad",
"soup",
"dessert",
"snack",
"drink",
"sauce",
"bread"
]
},
"rating": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "The author's own rating of the recipe, from 1 to 5 stars."
},
"source": {
"ref": "#source",
"type": "ref",
"description": "Where the recipe came from, if it is not original."
},
"cuisine": {
"type": "string",
"maxLength": 640,
"description": "Culinary tradition the recipe belongs to (eg, 'Japanese').",
"maxGraphemes": 64
},
"cookTime": {
"type": "integer",
"minimum": 0,
"description": "Active cooking time, in minutes."
},
"prepTime": {
"type": "integer",
"minimum": 0,
"description": "Hands-on preparation time, in minutes."
},
"servings": {
"type": "integer",
"minimum": 1,
"description": "Number of servings the recipe yields."
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "Client-declared timestamp when this recipe was first created."
},
"totalTime": {
"type": "integer",
"minimum": 0,
"description": "Total time from start to finish, in minutes. May exceed prepTime plus cookTime when the recipe includes resting or marinating."
},
"updatedAt": {
"type": "string",
"format": "datetime",
"description": "Client-declared timestamp when this recipe was last edited."
},
"difficulty": {
"type": "string",
"maxLength": 64,
"description": "How demanding the recipe is to make.",
"knownValues": [
"easy",
"medium",
"hard"
]
},
"description": {
"type": "string",
"maxLength": 5000,
"description": "Short summary or blurb about the recipe.",
"maxGraphemes": 500
},
"ingredients": {
"type": "array",
"items": {
"ref": "#ingredient",
"type": "ref"
},
"maxLength": 200,
"minLength": 1,
"description": "Ingredients required, in the order they are used."
},
"instructions": {
"type": "array",
"items": {
"ref": "#instructionStep",
"type": "ref"
},
"maxLength": 100,
"minLength": 1,
"description": "Ordered preparation steps."
},
"dietaryLabels": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64,
"knownValues": [
"vegetarian",
"vegan",
"gluten-free",
"dairy-free",
"nut-free",
"egg-free",
"halal",
"kosher",
"low-carb",
"keto",
"paleo"
]
},
"maxLength": 20,
"description": "Dietary properties of the finished dish."
}
}
},
"description": "A cooking recipe stored in the author's repository."
},
"source": {
"type": "object",
"properties": {
"uri": {
"type": "string",
"format": "uri",
"description": "Link to the original recipe."
},
"name": {
"type": "string",
"maxLength": 2000,
"description": "Who or what the recipe came from (eg, a cookbook or person).",
"maxGraphemes": 200
}
},
"description": "Attribution for a recipe adapted from elsewhere."
},
"ingredient": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 1000,
"minLength": 1,
"description": "The ingredient itself (eg, 'all-purpose flour').",
"maxGraphemes": 100
},
"note": {
"type": "string",
"maxLength": 1000,
"description": "Preparation note for this ingredient (eg, 'finely chopped').",
"maxGraphemes": 100
},
"unit": {
"type": "string",
"maxLength": 320,
"description": "Unit of measure for the amount (eg, 'cup', 'g', 'tbsp').",
"maxGraphemes": 32
},
"group": {
"type": "string",
"maxLength": 640,
"description": "Optional heading grouping related ingredients (eg, 'For the sauce').",
"maxGraphemes": 64
},
"amount": {
"type": "string",
"maxLength": 320,
"description": "Quantity as written, kept as a string to allow fractions and ranges (eg, '1 1/2', '2-3').",
"maxGraphemes": 32
},
"optional": {
"type": "boolean",
"description": "Whether this ingredient can be left out."
}
},
"description": "A single ingredient line."
},
"instructionStep": {
"type": "object",
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"maxLength": 10000,
"minLength": 1,
"description": "What to do in this step.",
"maxGraphemes": 1000
},
"group": {
"type": "string",
"maxLength": 640,
"description": "Optional heading grouping related steps (eg, 'Make the dough').",
"maxGraphemes": 64
}
},
"description": "A single step in the preparation."
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}