{
  "openapi": "3.1.0",
  "info": {
    "title": "alasdairb.com Content API",
    "version": "1.0.0",
    "summary": "Machine-readable content endpoints for the blog of Al Brown.",
    "description": "This static blog exposes its content through the read-only HTTP endpoints documented here. There is no authentication, no rate limiting beyond standard CDN limits, and no write operations. Use llms.txt for agent-oriented guidance or llms-full.txt to fetch all post content in one request."
  },
  "servers": [
    {
      "url": "https://alasdairb.com"
    }
  ],
  "paths": {
    "/rss.xml": {
      "get": {
        "operationId": "getRssFeed",
        "summary": "RSS 2.0 feed of all published posts",
        "responses": {
          "200": {
            "description": "RSS 2.0 XML document",
            "content": {
              "application/rss+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/llms.txt": {
      "get": {
        "operationId": "getLlmsTxt",
        "summary": "Agent guide listing pages and posts",
        "description": "Markdown-formatted index of this site with when-to-use guidance for LLM agents.",
        "responses": {
          "200": {
            "description": "llms.txt document",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/llms-full.txt": {
      "get": {
        "operationId": "getLlmsFullTxt",
        "summary": "Full text of every post in a single document",
        "responses": {
          "200": {
            "description": "Plain-text corpus of all posts",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/sitemap-index.xml": {
      "get": {
        "operationId": "getSitemapIndex",
        "summary": "XML sitemap index of all site URLs",
        "responses": {
          "200": {
            "description": "Sitemap index XML document",
            "content": {
              "application/xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/posts/{postId}": {
      "get": {
        "operationId": "getPost",
        "summary": "A single blog post as HTML",
        "description": "Returns the rendered post page. Post identifiers are stable slugs listed in llms.txt and the RSS feed.",
        "parameters": [
          {
            "name": "postId",
            "in": "path",
            "required": true,
            "description": "URL slug of the post",
            "schema": {
              "type": "string",
              "enum": [
                "is-ai-agent-rust-crate",
                "agent-experience-building-a-cli",
                "building-a-nifi-processor-in-python",
                "200-conversation-at-kafka-summit",
                "keeping-up-with-warpstream",
                "there-is-no-data-engineering-roadmap",
                "the-lacking-future-of-etl",
                "my-take-on-developer-experience",
                "mixing-it-up-with-tinybird-co",
                "introducing-dbt-impala",
                "the-cloudera-innovation-accelerator-me",
                "getting-started-with-nifis-scriptedreader-by-processing-key-value-pairs-part-1",
                "nifi-terminology-basics",
                "installing-nifi-1-14-0-on-linux-non-production",
                "s3-event-notifications-in-nifi",
                "importing-individual-flow-definitions-in-nifi",
                "building-a-simple-rest-api-in-nifi",
                "enriching-records-with-lookuprecord-rest-apis-in-nifi",
                "nifi-in-production-nifi-registry",
                "nifi-resources-for-learning-improving",
                "kafka-with-multiple-listeners-and-sasl",
                "connecting-to-a-secure-impala-via-nifi-with-tls-and-kerberos",
                "moving-the-data-dir-of-mariadb-on-centos7-rhel7"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Rendered HTML page for the post",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "No post with that identifier exists. The 404 response is a real HTTP 404.",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  }
}