{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Engineering Playbook",
  "description": "Decision notes on building production software — durable patterns and project retrospectives.",
  "home_page_url": "http://localhost:4321/",
  "feed_url": "http://localhost:4321/feed.json",
  "language": "en",
  "authors": [
    {
      "name": "Suraj Maurya",
      "url": "http://localhost:4321"
    }
  ],
  "items": [
    {
      "id": "http://localhost:4321/notes/redis-singleflight",
      "url": "http://localhost:4321/notes/redis-singleflight",
      "title": "TIL — Redis SET NX as a poor-man's singleflight",
      "summary": "A 4-line pattern for de-duplicating expensive computations across processes when you don't need a full distributed lock.",
      "content_text": "A 4-line pattern for de-duplicating expensive computations across processes when you don't need a full distributed lock.",
      "date_published": "2026-04-30T00:00:00.000Z",
      "date_modified": "2026-04-30T00:00:00.000Z",
      "tags": [
        "redis",
        "caching",
        "til"
      ]
    },
    {
      "id": "http://localhost:4321/playbook/caching",
      "url": "http://localhost:4321/playbook/caching",
      "title": "Caching — the cheapest way to lose a weekend",
      "summary": "Cache layers, TTL vs invalidation, stampede protection, key hygiene, and the case for not caching at all.",
      "content_text": "Cache layers, TTL vs invalidation, stampede protection, key hygiene, and the case for not caching at all.",
      "date_published": "2026-04-25T00:00:00.000Z",
      "date_modified": "2026-04-25T00:00:00.000Z",
      "tags": [
        "caching",
        "performance",
        "architecture"
      ]
    },
    {
      "id": "http://localhost:4321/playbook/api-design",
      "url": "http://localhost:4321/playbook/api-design",
      "title": "API design — the decisions that age well",
      "summary": "Resource shape, error envelopes, idempotency, pagination, and versioning. What I pick, why, and the failure mode each choice prevents.",
      "content_text": "Resource shape, error envelopes, idempotency, pagination, and versioning. What I pick, why, and the failure mode each choice prevents.",
      "date_published": "2026-04-12T00:00:00.000Z",
      "date_modified": "2026-04-12T00:00:00.000Z",
      "tags": [
        "api",
        "architecture",
        "rest"
      ]
    },
    {
      "id": "http://localhost:4321/case-studies/prolearning",
      "url": "http://localhost:4321/case-studies/prolearning",
      "title": "ProLearning — what shipping a learning platform taught me about scope",
      "summary": "A retro on building ProLearning end-to-end. What worked, what I'd redo, and the one decision that mattered most.",
      "content_text": "A retro on building ProLearning end-to-end. What worked, what I'd redo, and the one decision that mattered most.",
      "date_published": "2026-03-18T00:00:00.000Z",
      "date_modified": "2026-03-18T00:00:00.000Z",
      "tags": [
        "retro",
        "edtech",
        "product"
      ]
    }
  ]
}