{
"id": "social.arabica.alpha.brew",
"defs": {
"main": {
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"beanRef",
"createdAt"
],
"properties": {
"pours": {
"type": "array",
"items": {
"ref": "#pour",
"type": "ref"
},
"description": "Array of pour information for multi-pour methods (e.g., V60)"
},
"method": {
"type": "string",
"maxLength": 100,
"description": "Brewing method (e.g., 'Pour Over', 'French Press', 'Espresso')"
},
"rating": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "Rating of the brew from 1 to 10"
},
"beanRef": {
"type": "string",
"format": "at-uri",
"description": "AT-URI reference to the bean record used"
},
"brewerRef": {
"type": "string",
"format": "at-uri",
"description": "AT-URI reference to the brewer/device used"
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "Timestamp when the brew was made"
},
"grindSize": {
"type": "string",
"maxLength": 50,
"description": "Grind size setting (can be numeric like '18' or descriptive like 'Medium')"
},
"recipeRef": {
"type": "string",
"format": "at-uri",
"description": "AT-URI reference to the recipe used for this brew"
},
"grinderRef": {
"type": "string",
"format": "at-uri",
"description": "AT-URI reference to the grinder used"
},
"temperature": {
"type": "integer",
"maximum": 1000,
"minimum": 0,
"description": "Water temperature in tenths of a degree Celsius (e.g., 935 = 93.5°C)"
},
"timeSeconds": {
"type": "integer",
"minimum": 0,
"description": "Total brew time in seconds"
},
"waterAmount": {
"type": "integer",
"minimum": 0,
"description": "Amount of water used in grams or milliliters"
},
"coffeeAmount": {
"type": "integer",
"minimum": 0,
"description": "Amount of coffee used in grams"
},
"tastingNotes": {
"type": "string",
"maxLength": 2000,
"description": "Tasting notes and observations about the brew"
},
"espressoParams": {
"ref": "#espressoParams",
"type": "ref",
"description": "Espresso-specific brewing parameters (optional)"
},
"pouroverParams": {
"ref": "#pouroverParams",
"type": "ref",
"description": "Pour-over-specific brewing parameters (optional)"
}
}
},
"description": "A coffee brewing session with parameters and notes"
},
"pour": {
"type": "object",
"required": [
"waterAmount",
"timeSeconds"
],
"properties": {
"timeSeconds": {
"type": "integer",
"minimum": 0,
"description": "Time of this pour relative to brew start (seconds)"
},
"waterAmount": {
"type": "integer",
"minimum": 0,
"description": "Amount of water in this pour (grams or ml)"
}
},
"description": "Information about a single pour in a multi-pour brewing method"
},
"espressoParams": {
"type": "object",
"properties": {
"pressure": {
"type": "integer",
"minimum": 0,
"description": "Brewing pressure in tenths of a bar (e.g., 90 = 9.0 bar)"
},
"yieldWeight": {
"type": "integer",
"minimum": 0,
"description": "Espresso yield/output weight in tenths of a gram (e.g., 360 = 36.0g)"
},
"preInfusionSeconds": {
"type": "integer",
"minimum": 0,
"description": "Pre-infusion time in seconds"
}
},
"description": "Parameters specific to espresso brewing"
},
"pouroverParams": {
"type": "object",
"properties": {
"filter": {
"type": "string",
"maxLength": 100,
"description": "Type of filter used (e.g. paper, metal, cloth)"
},
"bloomWater": {
"type": "integer",
"minimum": 0,
"description": "Water used for bloom in grams"
},
"bypassWater": {
"type": "integer",
"minimum": 0,
"description": "Bypass water added after brewing in grams"
},
"bloomSeconds": {
"type": "integer",
"minimum": 0,
"description": "Bloom wait time in seconds"
},
"drawdownSeconds": {
"type": "integer",
"minimum": 0,
"description": "Drawdown time in seconds (time after last pour until bed is dry)"
}
},
"description": "Parameters specific to pour-over brewing"
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}