CBCK-R1
Title: Curried by Chef's Kitchen Recipe Standard
Author: Jeevi's Chef's Kitchen Private Limited
Status: Final
Created: 2026-01-01
Website: https://curriedfoods.com
CBCK-R1
Curried by Chef's Kitchen Recipe Standard
Table of Contents
1. Abstract
CBCK-R1 is a machine-readable, hash-verified specification for representing Indian food recipes published by Jeevi's Chef's Kitchen Private Limited (“Curried by Chef's Kitchen”, “CBCK”). Each CBCK-R1 document encodes provenance, ingredients, step-by-step technique, nutrition, regulatory compliance, and explicit links to CBCK product SKUs that can replace or accelerate steps in the recipe.
A CBCK-R1 document is uniquely identified by a namespaced ID (e.g. cbck:ambur-biryani:v1) and integrity-protected by a SHA-256 hash of its canonical JSON representation (excluding the hash field itself).
2. Motivation
Recipe representation in the food industry suffers from several well-known problems:
- Recipes are prose — difficult to parse, validate, or version-control.
- No standard linking between a recipe step and the commercial product that can replace it.
- Nutritional and compliance data are often absent or unverifiable.
- Provenance and tradition are rarely recorded.
CBCK-R1 addresses all four. It is inspired by the Ethereum Improvement Proposal (EIP) process: a formal, numbered specification with a defined schema, versioned IDs, and cryptographic integrity. The collapsed_by_sku field on each step is CBCK-R1's equivalent of a smart-contract call — it explicitly declares that a given step's labour can be replaced by opening a Curried by Chef's Kitchen product.
3. Specification
A CBCK-R1 document MUST be a valid JSON object conforming to the JSON Schema published at https://curriedfoods.com/schemas/cbck-r1.json. Key constraints:
idMUST match the pattern^cbck:[a-z0-9-]+:v[0-9]+$hashMUST be the lowercase hex SHA-256 of the canonical JSON of the document with thehashfield omitted. Canonical JSON is defined as RFC 8785 (JCS) — keys sorted lexicographically, no whitespace.compliance.fssaiandcompliance.preservative_freeMUST both be the boolean literaltrue.steps[].techniqueMUST be one of the definedTechniqueenum values.steps[].collapsed_by_sku, when present, MUST reference a valid slug in the CBCK product catalog.
4. Field Reference
| Field | Type | Description |
|---|---|---|
| id | string | Namespaced unique identifier cbck:<slug>:v<n> |
| hash | string | SHA-256 hex of canonical JSON (hash field excluded) |
| name | string | Human-readable recipe name |
| provenance | object | region, tradition, optional era |
| cuisine | string | Culinary tradition label |
| course | enum | main | breakfast | dessert | gravy-base | snack |
| yields | object | servings (int) and total grams (number) |
| inputs[].ingredient | string | Ingredient name |
| inputs[].grams | number | Weight in grams |
| inputs[].curried_sku | string? | Optional CBCK product slug for this ingredient |
| steps[].order | integer | 1-indexed step sequence |
| steps[].action | string | Human-readable step description |
| steps[].technique | Technique | Controlled vocabulary technique tag |
| steps[].minutes | number | Expected duration |
| steps[].temp_c | number? | Optional temperature in Celsius |
| steps[].collapsed_by_sku | string? | SKU that replaces this step |
| nutrition | object | kcal, protein_g, carbs_g, fat_g, fiber_g (per serving) |
| compliance.fssai | true | Must be literal true |
| compliance.allergens | string[] | FSSAI-category allergen list |
| compliance.preservative_free | true | Must be literal true |
| pairs_with | string[] | Other CBCK-R1 ids that complement this dish |
| curried_skus | string[] | All CBCK product slugs referenced in this recipe |
5. Rationale
The choice of SHA-256 over a simpler checksum provides collision resistance suitable for a public recipe registry. Canonical JSON (RFC 8785) ensures that hash values are reproducible across implementations and languages regardless of key insertion order.
The collapsed_by_sku mechanism was designed to be non-prescriptive: a recipe remains fully executable without any CBCK product; the field merely signals that a commercial shortcut exists. This preserves authenticity while creating clear commercial linkage.
6. Reference Implementation
The canonical TypeScript implementation is published in lib/recipe-schema.ts and uses the Web Crypto API (crypto.subtle.digest) for SHA-256 — available in all modern browsers and Node.js 18+.
Example CBCK-R1 document (abbreviated):
{
"id": "cbck:ambur-biryani:v1",
"hash": "a1b2c3d4e5f6...{sha256}",
"name": "Ambur Biryani",
"provenance": {
"region": "Ambur, Vellore District, Tamil Nadu",
"tradition": "Nawabi / Arcot Muslim",
"era": "18th century"
},
"cuisine": "South Indian – Tamil Muslim",
"course": "main",
"yields": {
"servings": 6,
"grams": 1800
},
"inputs": [
{
"ingredient": "Seeraga Samba rice",
"grams": 600
},
{
"ingredient": "Ambur Biryani Gravy",
"grams": 250,
"curried_sku": "rtc-ambur-biryani-gravy"
}
],
"steps": [
{
"order": 1,
"action": "Marinate mutton in yoghurt 30 min.",
"technique": "marinate",
"minutes": 30
},
{
"order": 2,
"action": "Sauté mutton; add Ambur Biryani Gravy.",
"technique": "saute",
"minutes": 25,
"collapsed_by_sku": "rtc-ambur-biryani-gravy"
}
],
"techniques": [
"marinate",
"saute",
"simmer",
"dum"
],
"nutrition": {
"kcal": 620,
"protein_g": 38,
"carbs_g": 72,
"fat_g": 18,
"fiber_g": 3
},
"compliance": {
"fssai": true,
"allergens": [
"dairy"
],
"preservative_free": true
},
"pairs_with": [
"cbck:chettinad-gravy:v1"
],
"curried_skus": [
"rtc-ambur-biryani-gravy"
]
}Full JSON Schema:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://curriedfoods.com/schemas/cbck-r1.json",
"title": "CBCK-R1 Recipe Standard",
"version": "1.0.0",
"type": "object",
"required": [
"id",
"hash",
"name",
"provenance",
"cuisine",
"course",
"yields",
"inputs",
"steps",
"techniques",
"nutrition",
"compliance",
"pairs_with",
"curried_skus"
],
"properties": {
"id": {
"type": "string",
"pattern": "^cbck:[a-z0-9-]+:v[0-9]+$"
},
"hash": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"name": {
"type": "string"
},
"provenance": {
"type": "object",
"required": [
"region",
"tradition"
],
"properties": {
"region": {
"type": "string"
},
"tradition": {
"type": "string"
},
"era": {
"type": "string"
}
}
},
"cuisine": {
"type": "string"
},
"course": {
"type": "string",
"enum": [
"main",
"breakfast",
"dessert",
"gravy-base",
"snack"
]
},
"yields": {
"type": "object",
"required": [
"servings",
"grams"
],
"properties": {
"servings": {
"type": "integer",
"minimum": 1
},
"grams": {
"type": "number",
"minimum": 0
}
}
},
"inputs": {
"type": "array",
"items": {
"type": "object",
"required": [
"ingredient",
"grams"
],
"properties": {
"ingredient": {
"type": "string"
},
"grams": {
"type": "number"
},
"substitutes": {
"type": "array",
"items": {
"type": "string"
}
},
"curried_sku": {
"type": "string"
}
}
}
},
"steps": {
"type": "array",
"items": {
"type": "object",
"required": [
"order",
"action",
"technique",
"minutes"
],
"properties": {
"order": {
"type": "integer"
},
"action": {
"type": "string"
},
"technique": {
"type": "string",
"enum": [
"retort",
"freeze-dry",
"temper",
"dum",
"saute",
"simmer",
"grind",
"marinate",
"rest",
"bake",
"fry"
]
},
"minutes": {
"type": "number"
},
"temp_c": {
"type": "number"
},
"collapsed_by_sku": {
"type": "string"
}
}
}
},
"techniques": {
"type": "array",
"items": {
"type": "string"
}
},
"nutrition": {
"type": "object",
"required": [
"kcal",
"protein_g",
"carbs_g",
"fat_g",
"fiber_g"
],
"properties": {
"kcal": {
"type": "number"
},
"protein_g": {
"type": "number"
},
"carbs_g": {
"type": "number"
},
"fat_g": {
"type": "number"
},
"fiber_g": {
"type": "number"
}
}
},
"compliance": {
"type": "object",
"required": [
"fssai",
"allergens",
"preservative_free"
],
"properties": {
"fssai": {
"const": true
},
"allergens": {
"type": "array",
"items": {
"type": "string"
}
},
"preservative_free": {
"const": true
}
}
},
"pairs_with": {
"type": "array",
"items": {
"type": "string"
}
},
"curried_skus": {
"type": "array",
"items": {
"type": "string"
}
}
}
}7. Security Considerations
The SHA-256 hash in hash provides tamper-evidence but not authentication. A recipe document with a valid hash may still be from an unauthorised publisher. Future versions of CBCK-R1 may add an Ed25519 signature field for publisher authentication.
Consumers MUST re-compute the hash on receipt and MUST NOT serve or act on a document where the computed hash does not match the hash field. Callers that skip this check are outside the scope of this specification.
Allergen and compliance data in CBCK-R1 documents is informational only. End users MUST verify allergen information against current product labelling before consumption.
8. Copyright
Copyright © 2026 Jeevi's Chef's Kitchen Private Limited. All rights reserved. The CBCK-R1 specification is published for informational purposes. Recipe documents published under this standard by Curried by Chef's Kitchen are proprietary and may not be reproduced without permission.