Curried

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

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:

  • id MUST match the pattern ^cbck:[a-z0-9-]+:v[0-9]+$
  • hash MUST be the lowercase hex SHA-256 of the canonical JSON of the document with the hash field omitted. Canonical JSON is defined as RFC 8785 (JCS) — keys sorted lexicographically, no whitespace.
  • compliance.fssai and compliance.preservative_free MUST both be the boolean literal true.
  • steps[].technique MUST be one of the defined Technique enum values.
  • steps[].collapsed_by_sku, when present, MUST reference a valid slug in the CBCK product catalog.

4. Field Reference

FieldTypeDescription
idstringNamespaced unique identifier cbck:<slug>:v<n>
hashstringSHA-256 hex of canonical JSON (hash field excluded)
namestringHuman-readable recipe name
provenanceobjectregion, tradition, optional era
cuisinestringCulinary tradition label
courseenummain | breakfast | dessert | gravy-base | snack
yieldsobjectservings (int) and total grams (number)
inputs[].ingredientstringIngredient name
inputs[].gramsnumberWeight in grams
inputs[].curried_skustring?Optional CBCK product slug for this ingredient
steps[].orderinteger1-indexed step sequence
steps[].actionstringHuman-readable step description
steps[].techniqueTechniqueControlled vocabulary technique tag
steps[].minutesnumberExpected duration
steps[].temp_cnumber?Optional temperature in Celsius
steps[].collapsed_by_skustring?SKU that replaces this step
nutritionobjectkcal, protein_g, carbs_g, fat_g, fiber_g (per serving)
compliance.fssaitrueMust be literal true
compliance.allergensstring[]FSSAI-category allergen list
compliance.preservative_freetrueMust be literal true
pairs_withstring[]Other CBCK-R1 ids that complement this dish
curried_skusstring[]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.

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.