{
  "docVersion": 1,
  "id": "blog-raft-0001",
  "name": "Raft — leader-based consensus",
  "purpose": "How a 5-node Raft cluster replicates a write: client → leader → AppendEntries to followers → committed on majority ack.",
  "nodes": {
    "client": {
      "type": "browser",
      "label": "Client",
      "x": 30,
      "y": 250
    },
    "leader": {
      "type": "server",
      "label": "Node A",
      "x": 290,
      "y": 250,
      "runtime": "LEADER · term 7",
      "color": "green"
    },
    "f1": {
      "type": "server",
      "label": "Node B",
      "x": 620,
      "y": 30,
      "runtime": "follower"
    },
    "f2": {
      "type": "server",
      "label": "Node C",
      "x": 620,
      "y": 180,
      "runtime": "follower"
    },
    "f3": {
      "type": "server",
      "label": "Node D",
      "x": 620,
      "y": 330,
      "runtime": "follower"
    },
    "f4": {
      "type": "server",
      "label": "Node E",
      "x": 620,
      "y": 480,
      "runtime": "follower"
    }
  },
  "edges": {
    "e1": {
      "from": "client",
      "to": "leader",
      "fromSide": "right",
      "toSide": "left",
      "label": "write x=5"
    },
    "e2": {
      "from": "leader",
      "to": "f1",
      "fromSide": "right",
      "toSide": "left",
      "label": "AppendEntries · log + heartbeat"
    },
    "e3": {
      "from": "leader",
      "to": "f2",
      "fromSide": "right",
      "toSide": "left"
    },
    "e4": {
      "from": "leader",
      "to": "f3",
      "fromSide": "right",
      "toSide": "left"
    },
    "e5": {
      "from": "leader",
      "to": "f4",
      "fromSide": "right",
      "toSide": "left",
      "label": "slow — still catching up",
      "style": "dashed"
    }
  },
  "boxes": {
    "b1": {
      "x": 250,
      "y": -30,
      "w": 570,
      "h": 650,
      "label": "raft cluster — one leader per term",
      "color": "blue",
      "opacity": 0.04
    }
  },
  "texts": {
    "t1": {
      "x": 30,
      "y": 420,
      "text": "commit rule: entry is committed once a\nMAJORITY (3 of 5) has appended it —\nNode E lagging doesn't block the write",
      "color": "green",
      "size": 12
    },
    "t2": {
      "x": 30,
      "y": 560,
      "text": "no heartbeat within election timeout →\nfollower becomes candidate, term++,\nrequests votes (majority wins)",
      "color": "amber",
      "size": 12
    }
  },
  "meta": {
    "createdAt": "2026-07-12T09:00:00.000Z",
    "modifiedAt": "2026-07-12T09:00:00.000Z"
  }
}