{
"id": "africa.kandake.asha.recipe.recipe",
"defs": {
"main": {
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"title",
"ingredients",
"instructions",
"createdAt"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Original source URL of the recipe."
},
"image": {
"type": "blob",
"accept": [
"image/png",
"image/jpeg",
"image/webp"
],
"maxSize": 1000000,
"description": "Header image for the recipe."
},
"notes": {
"type": "string",
"maxLength": 10000
},
"title": {
"type": "string",
"maxLength": 512,
"description": "Title of the recipe.",
"maxGraphemes": 128
},
"source": {
"type": "string",
"maxLength": 256,
"description": "Human-readable source name."
},
"servings": {
"type": "integer",
"minimum": 1
},
"createdAt": {
"type": "string",
"format": "datetime"
},
"embedding": {
"type": "bytes",
"maxLength": 8192,
"description": "Packed float32 vector embedding for semantic search."
},
"nutrition": {
"type": "string",
"maxLength": 5000
},
"updatedAt": {
"type": "string",
"format": "datetime"
},
"categories": {
"type": "array",
"items": {
"type": "string",
"maxLength": 128
},
"maxLength": 10,
"description": "Recipe categories for filtering and display."
},
"description": {
"type": "string",
"maxLength": 10000,
"description": "Short description of the recipe."
},
"ingredients": {
"type": "array",
"items": {
"ref": "#ingredient",
"type": "ref"
},
"minLength": 1,
"description": "Structured ingredients list with metric and imperial measurements."
},
"instructions": {
"type": "array",
"items": {
"ref": "#instruction",
"type": "ref"
},
"minLength": 1,
"description": "Ordered preparation steps."
},
"cookTimeMinutes": {
"type": "integer",
"minimum": 0
},
"prepTimeMinutes": {
"type": "integer",
"minimum": 0
},
"totalTimeMinutes": {
"type": "integer",
"minimum": 0
}
}
},
"description": "A recipe record stored in the user's PDS repository."
},
"ingredient": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 256,
"description": "Ingredient name, e.g. 'all-purpose flour'."
},
"notes": {
"type": "string",
"maxLength": 256,
"description": "Preparation notes, e.g. 'freshly ground', 'grated'."
},
"measuredUnit": {
"type": "string",
"maxLength": 32,
"description": "Metric unit, e.g. 'g', 'ml'."
},
"heuristicUnit": {
"type": "string",
"maxLength": 32,
"description": "Imperial/heuristic unit, e.g. 'cup', 'tbsp', 'lb'."
},
"measuredAmount": {
"type": "integer",
"description": "Metric amount in grams or millilitres."
},
"heuristicAmount": {
"type": "integer",
"description": "Imperial/heuristic approximate amount."
}
}
},
"instruction": {
"type": "object",
"required": [
"value"
],
"properties": {
"value": {
"type": "string",
"maxLength": 5000,
"description": "Step instruction text."
},
"waitTimeMinutes": {
"type": "integer",
"minimum": 0,
"description": "Wait/rest time in minutes for visual highlighting."
}
}
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}