{
  "version": 2,
  "site": {
    "name": "sudohulk",
    "url": "https://sudohulk.com",
    "description": "Vignesh Kumar A, a database engineer at Zoho, keeps a write-ahead log of what he learns: database internals and computer science, written down plainly and corrected in the open.",
    "author": {
      "name": "Vignesh Kumar A",
      "url": "https://sudohulk.com",
      "email": "vignesh@sudohulk.com",
      "knowsAbout": [
        "PostgreSQL internals",
        "Database storage engines",
        "Write-ahead logging and logical decoding",
        "Distributed transactions and two-phase commit",
        "Sharding and distributed query execution"
      ]
    },
    "licence": {
      "name": "CC BY 4.0",
      "url": "https://creativecommons.org/licenses/by/4.0/"
    },
    "llms": "https://sudohulk.com/llms.txt",
    "llmsFull": "https://sudohulk.com/llms-full.txt",
    "feeds": {
      "rss": "https://sudohulk.com/rss.xml",
      "json": "https://sudohulk.com/feed.json",
      "everything": "https://sudohulk.com/writing/rss.xml",
      "notes": "https://sudohulk.com/notes/rss.xml",
      "tracks": "https://sudohulk.com/tracks/rss.xml",
      "streams": {
        "tech": "https://sudohulk.com/tech/rss.xml",
        "meta": "https://sudohulk.com/meta/rss.xml"
      }
    },
    "agentApi": "https://sudohulk.com/for-ai",
    "mcp": {
      "endpoint": "https://sudohulk.com/mcp",
      "transport": "streamable-http",
      "serverCard": "https://sudohulk.com/.well-known/mcp/server-card.json"
    },
    "a2a": {
      "endpoint": "https://sudohulk.com/a2a",
      "protocolBinding": "JSONRPC",
      "agentCard": "https://sudohulk.com/.well-known/agent-card.json"
    },
    "apiCatalog": "https://sudohulk.com/.well-known/api-catalog",
    "openapi": "https://sudohulk.com/openapi.json",
    "skills": "https://sudohulk.com/.well-known/agent-skills/index.json",
    "aiCatalog": "https://sudohulk.com/.well-known/ai-catalog.json",
    "negotiation": {
      "accept": "text/markdown",
      "twin": "<path>.md",
      "home": "https://sudohulk.com/index.md"
    }
  },
  "streams": [
    {
      "id": "tech",
      "label": "Tech",
      "description": "Computer science, databases first: storage, transactions and recovery, then operating systems, networks, languages and algorithms.",
      "url": "https://sudohulk.com/tech",
      "markdown": "https://sudohulk.com/tech.md",
      "count": 4
    },
    {
      "id": "meta",
      "label": "Meta",
      "description": "About this site and why it exists.",
      "url": "https://sudohulk.com/meta",
      "markdown": "https://sudohulk.com/meta.md",
      "count": 1
    }
  ],
  "count": 12,
  "items": [
    {
      "type": "essay",
      "stream": "tech",
      "id": "postgres-cache-invalidation",
      "title": "How PostgreSQL tells every connection its cache is stale",
      "description": "Each PostgreSQL connection caches the catalog for itself. How a change is announced to all of them at commit through a shared ring, and what happens to a connection that falls behind.",
      "url": "https://sudohulk.com/writing/postgres-cache-invalidation",
      "markdown": "https://sudohulk.com/writing/postgres-cache-invalidation.md",
      "tags": [
        "postgresql",
        "databases",
        "performance"
      ],
      "track": {
        "id": "pg-internals-simply",
        "title": "PostgreSQL internals, explained simply",
        "part": 5
      },
      "published": "2026-10-17",
      "minutes": 19,
      "words": 3818,
      "format": "md"
    },
    {
      "type": "note",
      "stream": "tech",
      "maturity": "evergreen",
      "id": "full-page-writes-and-torn-pages",
      "title": "Full-page writes and torn pages",
      "description": "Why the first change to a page after a checkpoint carries the whole 8 KB page in WAL.",
      "url": "https://sudohulk.com/writing/full-page-writes-and-torn-pages",
      "markdown": "https://sudohulk.com/writing/full-page-writes-and-torn-pages.md",
      "tags": [
        "postgresql",
        "databases"
      ],
      "published": "2026-09-22",
      "minutes": 1,
      "words": 189,
      "format": "md"
    },
    {
      "type": "note",
      "stream": "tech",
      "maturity": "seedling",
      "id": "lazy-xid-assignment",
      "title": "Lazy transaction id assignment",
      "description": "A transaction does not get an xid at BEGIN; it gets one the first time it writes.",
      "url": "https://sudohulk.com/writing/lazy-xid-assignment",
      "markdown": "https://sudohulk.com/writing/lazy-xid-assignment.md",
      "tags": [
        "postgresql"
      ],
      "published": "2026-09-22",
      "minutes": 1,
      "words": 133,
      "format": "md"
    },
    {
      "type": "essay",
      "stream": "meta",
      "id": "hello-sudohulk",
      "title": "Hi, I'm Vignesh. Start here",
      "description": "I'm a database engineer at Zoho, working on database internals. Why I write here in public, and how to use the site.",
      "url": "https://sudohulk.com/writing/hello-sudohulk",
      "markdown": "https://sudohulk.com/writing/hello-sudohulk.md",
      "tags": [
        "meta",
        "career"
      ],
      "track": {
        "id": "building-sudohulk",
        "title": "Building sudohulk.com",
        "part": 1
      },
      "published": "2026-09-21",
      "updated": "2026-10-17",
      "minutes": 3,
      "words": 550,
      "format": "md"
    },
    {
      "type": "note",
      "stream": "tech",
      "maturity": "budding",
      "id": "pd-lsn-vs-record-lsn",
      "title": "pd_lsn vs record LSN",
      "description": "Two LSNs that are easy to mix up, and the rule recovery uses to compare them.",
      "url": "https://sudohulk.com/writing/pd-lsn-vs-record-lsn",
      "markdown": "https://sudohulk.com/writing/pd-lsn-vs-record-lsn.md",
      "tags": [
        "postgresql"
      ],
      "published": "2026-09-21",
      "minutes": 1,
      "words": 113,
      "format": "md"
    },
    {
      "type": "project",
      "id": "p2p-network",
      "title": "Decentralized P2P Network",
      "description": "A peer-to-peer messaging network in Rust on libp2p: messages arrive in under 50 ms across 100+ nodes, with Ed25519 peer identity and Noise-protocol encryption.",
      "url": "https://sudohulk.com/projects/p2p-network",
      "markdown": "https://sudohulk.com/projects/p2p-network.md",
      "tags": [
        "rust",
        "libp2p",
        "ed25519",
        "noise"
      ],
      "status": "paused",
      "format": "md"
    },
    {
      "type": "project",
      "id": "hybrid-storage-engine",
      "title": "Hybrid Storage Engine",
      "description": "A key-value engine in C that keeps values in an append-only log and keys in a B-tree, so rewriting a large value does not churn the index around it.",
      "url": "https://sudohulk.com/projects/hybrid-storage-engine",
      "markdown": "https://sudohulk.com/projects/hybrid-storage-engine.md",
      "tags": [
        "c"
      ],
      "status": "paused",
      "format": "md"
    },
    {
      "type": "project",
      "id": "smart-video-analysis",
      "title": "Smart Video Analysis",
      "description": "Event-processing microservices for video analysis events over Kafka and PostgreSQL, deployed with Docker, Terraform and GitHub Actions.",
      "url": "https://sudohulk.com/projects/smart-video-analysis",
      "markdown": "https://sudohulk.com/projects/smart-video-analysis.md",
      "tags": [
        "kafka",
        "postgresql",
        "docker",
        "terraform",
        "github actions"
      ],
      "status": "paused",
      "format": "md"
    },
    {
      "type": "project",
      "id": "learn-rust",
      "title": "learn-rust",
      "description": "My working notes and exercises while reading The Rust Programming Language, chapter by chapter.",
      "url": "https://sudohulk.com/projects/learn-rust",
      "markdown": "https://sudohulk.com/projects/learn-rust.md",
      "tags": [
        "rust"
      ],
      "status": "paused",
      "format": "md"
    },
    {
      "type": "project",
      "id": "grokking-algorithms",
      "title": "grokking-algorithms",
      "description": "Practice problems worked through while reading Grokking Algorithms, in Java.",
      "url": "https://sudohulk.com/projects/grokking-algorithms",
      "markdown": "https://sudohulk.com/projects/grokking-algorithms.md",
      "tags": [
        "java"
      ],
      "status": "done",
      "format": "md"
    },
    {
      "type": "project",
      "id": "distributed-postgresql",
      "title": "Distributed PostgreSQL",
      "description": "The internals of a horizontally scalable distributed PostgreSQL: sharding, distributed query execution, two-phase commit, and moving shards while the cluster serves.",
      "url": "https://sudohulk.com/projects/distributed-postgresql",
      "markdown": "https://sudohulk.com/projects/distributed-postgresql.md",
      "tags": [
        "c",
        "postgresql",
        "libpq",
        "distributed systems"
      ],
      "status": "active",
      "format": "md"
    },
    {
      "type": "project",
      "id": "zohopos-sync-platform",
      "title": "ZohoPOS sync platform",
      "description": "The server side that keeps offline point-of-sale registers consistent with a finance platform, which I worked on for four years.",
      "url": "https://sudohulk.com/projects/zohopos-sync-platform",
      "markdown": "https://sudohulk.com/projects/zohopos-sync-platform.md",
      "tags": [
        "java",
        "kafka",
        "redis",
        "mysql",
        "websocket"
      ],
      "status": "done",
      "format": "md"
    }
  ],
  "tracks": [
    {
      "id": "pg-internals-simply",
      "title": "PostgreSQL internals, explained simply",
      "description": "One mechanism per post, in the order a change flows through the server. Analogy first, then the real thing, then the gotchas.",
      "stream": "tech",
      "kind": "series",
      "unit": "part",
      "status": "active",
      "started": "2026-10-17",
      "privateCount": 0,
      "lastActivity": "2026-10-17",
      "minutes": 0,
      "items": [
        {
          "title": "WAL, explained simply",
          "state": "todo",
          "posts": []
        },
        {
          "title": "What actually happens between BEGIN and COMMIT",
          "state": "todo",
          "posts": []
        },
        {
          "title": "Checkpoints and the redo point",
          "state": "todo",
          "posts": []
        },
        {
          "title": "Two-phase commit in vanilla PostgreSQL",
          "state": "todo",
          "posts": []
        },
        {
          "title": "How PostgreSQL tells every connection its cache is stale",
          "state": "done",
          "on": "2026-10-17",
          "posts": [
            {
              "title": "How PostgreSQL tells every connection its cache is stale",
              "url": "https://sudohulk.com/writing/postgres-cache-invalidation"
            }
          ]
        }
      ],
      "log": [],
      "along": [],
      "tags": [
        "postgresql",
        "databases"
      ],
      "url": "https://sudohulk.com/tracks/pg-internals-simply",
      "markdown": "https://sudohulk.com/tracks/pg-internals-simply.md",
      "feed": "https://sudohulk.com/tracks/pg-internals-simply/rss.xml",
      "progress": {
        "done": 1,
        "total": 5,
        "percent": 20
      }
    },
    {
      "id": "building-sudohulk",
      "title": "Building sudohulk.com",
      "description": "Why this site exists, and the story behind it.",
      "stream": "meta",
      "kind": "series",
      "unit": "part",
      "status": "active",
      "started": "2026-09-21",
      "privateCount": 0,
      "lastActivity": "2026-09-21",
      "minutes": 0,
      "items": [
        {
          "title": "Hi, I'm Vignesh. Start here",
          "state": "done",
          "on": "2026-09-21",
          "posts": [
            {
              "title": "Hi, I'm Vignesh. Start here",
              "url": "https://sudohulk.com/writing/hello-sudohulk"
            }
          ]
        }
      ],
      "log": [],
      "along": [],
      "tags": [
        "meta"
      ],
      "url": "https://sudohulk.com/tracks/building-sudohulk",
      "markdown": "https://sudohulk.com/tracks/building-sudohulk.md",
      "feed": "https://sudohulk.com/tracks/building-sudohulk/rss.xml",
      "progress": {
        "done": 1,
        "total": 1,
        "percent": 100
      }
    }
  ]
}