{
  "docVersion": 1,
  "id": "template-lambda-architecture-warehouse",
  "name": "Lambda — batch + speed warehouse",
  "purpose": "Events land in a log; the speed layer serves the freshest minutes approximately while the batch layer recomputes exact gold tables from the lake; a serving API merges both.",
  "nodes": {
    "src": {
      "type": "sdk",
      "label": "Event Sources",
      "x": 0,
      "y": 300,
      "runtime": "apps · services · CDC"
    },
    "log": {
      "type": "stream",
      "label": "Event Log",
      "x": 260,
      "y": 300,
      "runtime": "fan-out to both layers",
      "color": "purple"
    },
    "speed": {
      "type": "worker",
      "label": "Speed Layer",
      "x": 520,
      "y": 130,
      "runtime": "streaming · approximate",
      "color": "amber",
      "notes": "Covers only the window batch hasn't reached yet. Simple aggregates, tolerates small error — it gets overwritten."
    },
    "rtview": {
      "type": "cache",
      "label": "Real-time View",
      "x": 780,
      "y": 130,
      "runtime": "last few hours"
    },
    "bronze": {
      "type": "datalake",
      "label": "Bronze — raw",
      "x": 520,
      "y": 470,
      "runtime": "immutable archive",
      "patterns": [
        "backup"
      ]
    },
    "batch": {
      "type": "spark",
      "label": "Batch Layer",
      "x": 780,
      "y": 470,
      "runtime": "nightly full recompute",
      "color": "blue",
      "notes": "Reads all of bronze, writes silver → gold. Deterministic: rerunning it after a logic fix IS the backfill."
    },
    "gold": {
      "type": "warehouse",
      "label": "Gold Tables",
      "x": 1040,
      "y": 470,
      "runtime": "silver → gold · exact"
    },
    "serve": {
      "type": "bff",
      "label": "Serving Layer",
      "x": 1040,
      "y": 130,
      "runtime": "merge: gold + real-time",
      "notes": "Query-time merge: exact history from gold, the last hours from the real-time view."
    },
    "bi": {
      "type": "analytics",
      "label": "BI / Analysts",
      "x": 1300,
      "y": 300,
      "runtime": "one query surface"
    }
  },
  "edges": {
    "e1": {
      "from": "src",
      "to": "log",
      "fromSide": "right",
      "toSide": "left",
      "label": "events",
      "animated": true
    },
    "e2": {
      "from": "log",
      "to": "speed",
      "fromSide": "right",
      "toSide": "left",
      "label": "stream",
      "style": "dashed",
      "animated": true
    },
    "e3": {
      "from": "log",
      "to": "bronze",
      "fromSide": "right",
      "toSide": "left",
      "label": "archive all",
      "style": "dashed"
    },
    "e4": {
      "from": "speed",
      "to": "rtview",
      "fromSide": "right",
      "toSide": "left",
      "label": "approx aggregates",
      "patterns": [
        "idempotent"
      ]
    },
    "e5": {
      "from": "bronze",
      "to": "batch",
      "fromSide": "right",
      "toSide": "left",
      "label": "full scan"
    },
    "e6": {
      "from": "batch",
      "to": "gold",
      "fromSide": "right",
      "toSide": "left",
      "label": "recompute · overwrite",
      "patterns": [
        "idempotent"
      ]
    },
    "e7": {
      "from": "rtview",
      "to": "serve",
      "fromSide": "right",
      "toSide": "left",
      "label": "fresh slice"
    },
    "e8": {
      "from": "gold",
      "to": "serve",
      "fromSide": "top",
      "toSide": "bottom",
      "label": "exact history"
    },
    "e9": {
      "from": "serve",
      "to": "bi",
      "fromSide": "right",
      "toSide": "left",
      "label": "merged answer",
      "animated": true
    }
  },
  "boxes": {
    "b1": {
      "x": 490,
      "y": 40,
      "w": 560,
      "h": 260,
      "label": "speed layer — fresh, approximate, disposable",
      "color": "amber",
      "opacity": 0.04
    },
    "b2": {
      "x": 490,
      "y": 380,
      "w": 820,
      "h": 280,
      "label": "batch layer — slow, exact, authoritative",
      "color": "blue",
      "opacity": 0.04
    }
  },
  "texts": {
    "t1": {
      "x": 0,
      "y": 120,
      "text": "the lambda trade: two codebases to maintain,\nin exchange for exactness AND freshness.\nkappa is what you get when you refuse the trade.",
      "color": "purple",
      "size": 12
    }
  },
  "meta": {
    "createdAt": "2026-07-13T09:00:00.000Z",
    "modifiedAt": "2026-07-13T09:00:00.000Z"
  }
}