{
  "components": {
    "schemas": {
      "ArchivePost": {
        "properties": {
          "api_url": {
            "format": "uri",
            "type": "string"
          },
          "published": {
            "format": "date-time",
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "slug",
          "title",
          "published",
          "url",
          "api_url"
        ],
        "type": "object"
      },
      "ArchiveYear": {
        "properties": {
          "count": {
            "type": "integer"
          },
          "months": {
            "items": {
              "properties": {
                "count": {
                  "type": "integer"
                },
                "month": {
                  "pattern": "^[0-9]{4}-[0-9]{2}$",
                  "type": "string"
                },
                "posts": {
                  "items": {
                    "$ref": "#/components/schemas/ArchivePost"
                  },
                  "type": "array"
                }
              },
              "required": [
                "month",
                "count",
                "posts"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "year": {
            "type": "integer"
          }
        },
        "required": [
          "year",
          "count",
          "months"
        ],
        "type": "object"
      },
      "Badge": {
        "properties": {
          "color": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "schemaVersion": {
            "const": 1,
            "type": "integer"
          }
        },
        "required": [
          "schemaVersion",
          "label",
          "message",
          "color"
        ],
        "type": "object"
      },
      "Cover": {
        "properties": {
          "alt": {
            "type": "string"
          },
          "height": {
            "type": "integer"
          },
          "url": {
            "format": "uri",
            "type": "string"
          },
          "width": {
            "type": "integer"
          }
        },
        "required": [
          "url",
          "width",
          "height",
          "alt"
        ],
        "type": "object"
      },
      "Endpoint": {
        "properties": {
          "group": {
            "type": "string"
          },
          "params": {
            "additionalProperties": {
              "type": "string"
            },
            "type": "object"
          },
          "path": {
            "description": "URL path on the host, e.g. /blog/api/v1/posts.json",
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "type": {
            "description": "Media type of the response.",
            "type": "string"
          },
          "url": {
            "description": "Absolute URL; templated paths keep their {placeholder}.",
            "type": "string"
          }
        },
        "required": [
          "group",
          "path",
          "url",
          "summary",
          "type"
        ],
        "type": "object"
      },
      "Envelope": {
        "properties": {
          "data": {},
          "meta": {
            "$ref": "#/components/schemas/Meta"
          }
        },
        "required": [
          "meta",
          "data"
        ],
        "type": "object"
      },
      "Heading": {
        "properties": {
          "id": {
            "type": "string"
          },
          "level": {
            "maximum": 6,
            "minimum": 2,
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "level",
          "id",
          "title",
          "url"
        ],
        "type": "object"
      },
      "Image": {
        "properties": {
          "height": {
            "type": "integer"
          },
          "is_cover": {
            "type": "boolean"
          },
          "name": {
            "type": "string"
          },
          "url": {
            "format": "uri",
            "type": "string"
          },
          "width": {
            "type": "integer"
          }
        },
        "required": [
          "name",
          "url",
          "width",
          "height",
          "is_cover"
        ],
        "type": "object"
      },
      "Index": {
        "properties": {
          "description": {
            "type": "string"
          },
          "docs": {
            "format": "uri",
            "type": "string"
          },
          "endpoints": {
            "items": {
              "$ref": "#/components/schemas/Endpoint"
            },
            "type": "array"
          },
          "name": {
            "type": "string"
          },
          "openapi": {
            "format": "uri",
            "type": "string"
          },
          "related": {
            "properties": {
              "portfolio_api": {
                "format": "uri",
                "type": "string"
              }
            },
            "type": "object"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "description",
          "version",
          "docs",
          "openapi",
          "endpoints"
        ],
        "type": "object"
      },
      "JSONFeed": {
        "properties": {
          "authors": {
            "items": {
              "$ref": "#/components/schemas/JSONFeedAuthor"
            },
            "type": "array"
          },
          "description": {
            "type": "string"
          },
          "favicon": {
            "format": "uri",
            "type": "string"
          },
          "feed_url": {
            "format": "uri",
            "type": "string"
          },
          "home_page_url": {
            "format": "uri",
            "type": "string"
          },
          "icon": {
            "format": "uri",
            "type": "string"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/JSONFeedItem"
            },
            "type": "array"
          },
          "language": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "version": {
            "const": "https://jsonfeed.org/version/1.1",
            "type": "string"
          }
        },
        "required": [
          "version",
          "title",
          "items"
        ],
        "type": "object"
      },
      "JSONFeedAuthor": {
        "properties": {
          "name": {
            "type": "string"
          },
          "url": {
            "format": "uri",
            "type": "string"
          }
        },
        "type": "object"
      },
      "JSONFeedItem": {
        "properties": {
          "authors": {
            "items": {
              "$ref": "#/components/schemas/JSONFeedAuthor"
            },
            "type": "array"
          },
          "content_html": {
            "type": "string"
          },
          "date_modified": {
            "format": "date-time",
            "type": "string"
          },
          "date_published": {
            "format": "date-time",
            "type": "string"
          },
          "id": {
            "type": "string"
          },
          "image": {
            "format": "uri",
            "type": "string"
          },
          "language": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "tags": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "id",
          "url",
          "title",
          "content_html",
          "date_published"
        ],
        "type": "object"
      },
      "Meta": {
        "properties": {
          "api": {
            "const": "londopy-blog",
            "type": "string"
          },
          "docs": {
            "format": "uri",
            "type": "string"
          },
          "generated": {
            "description": "When this file was built (UTC).",
            "format": "date-time",
            "type": "string"
          },
          "self": {
            "description": "This file's URL.",
            "format": "uri",
            "type": "string"
          },
          "version": {
            "description": "The API version (semver).",
            "type": "string"
          }
        },
        "required": [
          "api",
          "version",
          "generated",
          "self",
          "docs"
        ],
        "type": "object"
      },
      "Post": {
        "allOf": [
          {
            "$ref": "#/components/schemas/PostSummary"
          },
          {
            "properties": {
              "code": {
                "properties": {
                  "blocks": {
                    "type": "integer"
                  },
                  "languages": {
                    "items": {
                      "type": "string"
                    },
                    "type": "array"
                  }
                },
                "required": [
                  "blocks",
                  "languages"
                ],
                "type": "object"
              },
              "content_html": {
                "description": "The rendered post, with every src and href made absolute.",
                "type": "string"
              },
              "content_text": {
                "type": "string"
              },
              "headings": {
                "items": {
                  "$ref": "#/components/schemas/Heading"
                },
                "type": "array"
              },
              "images": {
                "items": {
                  "$ref": "#/components/schemas/Image"
                },
                "type": "array"
              },
              "license": {
                "properties": {
                  "code": {
                    "const": "MIT",
                    "type": "string"
                  },
                  "writing": {
                    "const": "CC-BY-4.0",
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "links": {
                "properties": {
                  "external": {
                    "items": {
                      "format": "uri",
                      "type": "string"
                    },
                    "type": "array"
                  },
                  "internal": {
                    "items": {
                      "format": "uri",
                      "type": "string"
                    },
                    "type": "array"
                  }
                },
                "required": [
                  "internal",
                  "external"
                ],
                "type": "object"
              },
              "newer": {
                "description": "The post published after this one.",
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/PostRef"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "older": {
                "description": "The post published before this one.",
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/PostRef"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "source": {
                "properties": {
                  "history": {
                    "format": "uri",
                    "type": "string"
                  },
                  "markdown": {
                    "format": "uri",
                    "type": "string"
                  },
                  "raw": {
                    "format": "uri",
                    "type": "string"
                  }
                },
                "type": "object"
              }
            },
            "required": [
              "content_html",
              "content_text",
              "headings",
              "code",
              "links",
              "images",
              "older",
              "newer",
              "license",
              "source"
            ],
            "type": "object"
          }
        ]
      },
      "PostDate": {
        "properties": {
          "published": {
            "format": "date-time",
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "slug",
          "title",
          "published",
          "url"
        ],
        "type": "object"
      },
      "PostRef": {
        "properties": {
          "api_url": {
            "format": "uri",
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "slug",
          "title",
          "url",
          "api_url"
        ],
        "type": "object"
      },
      "PostSummary": {
        "properties": {
          "api_url": {
            "format": "uri",
            "type": "string"
          },
          "cover": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Cover"
              },
              {
                "type": "null"
              }
            ]
          },
          "description": {
            "description": "The author's one-paragraph description.",
            "type": "string"
          },
          "published": {
            "format": "date-time",
            "type": "string"
          },
          "reading_time_minutes": {
            "type": "integer"
          },
          "slug": {
            "type": "string"
          },
          "summary": {
            "description": "The opening of the post, as plain text.",
            "type": "string"
          },
          "tags": {
            "items": {
              "$ref": "#/components/schemas/TagRef"
            },
            "type": "array"
          },
          "title": {
            "type": "string"
          },
          "updated": {
            "description": "Last change (from git), never before published.",
            "format": "date-time",
            "type": "string"
          },
          "url": {
            "description": "The post on the blog (the canonical URL).",
            "format": "uri",
            "type": "string"
          },
          "word_count": {
            "type": "integer"
          }
        },
        "required": [
          "slug",
          "title",
          "description",
          "summary",
          "url",
          "api_url",
          "published",
          "updated",
          "tags",
          "reading_time_minutes",
          "word_count",
          "cover"
        ],
        "type": "object"
      },
      "PostWords": {
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "format": "uri",
            "type": "string"
          },
          "words": {
            "type": "integer"
          }
        },
        "required": [
          "slug",
          "title",
          "words",
          "url"
        ],
        "type": "object"
      },
      "SearchItem": {
        "properties": {
          "keywords": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "kind": {
            "enum": [
              "page",
              "post",
              "tag"
            ],
            "type": "string"
          },
          "path": {
            "description": "URL path on the host.",
            "type": "string"
          },
          "published": {
            "description": "Posts only.",
            "format": "date-time",
            "type": "string"
          },
          "subtitle": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "title",
          "subtitle",
          "path",
          "url",
          "keywords"
        ],
        "type": "object"
      },
      "Site": {
        "properties": {
          "author": {
            "properties": {
              "name": {
                "type": "string"
              },
              "url": {
                "format": "uri",
                "type": "string"
              }
            },
            "type": "object"
          },
          "counts": {
            "properties": {
              "posts": {
                "type": "integer"
              },
              "tags": {
                "type": "integer"
              }
            },
            "type": "object"
          },
          "images": {
            "additionalProperties": {
              "format": "uri",
              "type": "string"
            },
            "type": "object"
          },
          "language": {
            "type": "string"
          },
          "license": {
            "properties": {
              "code": {
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "url": {
                    "format": "uri",
                    "type": "string"
                  }
                },
                "type": "object"
              },
              "writing": {
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "url": {
                    "format": "uri",
                    "type": "string"
                  }
                },
                "type": "object"
              }
            },
            "type": "object"
          },
          "links": {
            "additionalProperties": {
              "format": "uri",
              "type": "string"
            },
            "type": "object"
          },
          "publishing": {
            "properties": {
              "canonical": {
                "type": "string"
              },
              "rebuilds": {
                "type": "string"
              },
              "schedule": {
                "type": "string"
              },
              "timezone": {
                "type": "string"
              }
            },
            "type": "object"
          },
          "tagline": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "title",
          "tagline",
          "author",
          "language",
          "url",
          "links",
          "license",
          "publishing",
          "images",
          "counts"
        ],
        "type": "object"
      },
      "Stats": {
        "properties": {
          "average_words": {
            "type": "integer"
          },
          "code_blocks": {
            "type": "integer"
          },
          "code_languages": {
            "additionalProperties": {
              "type": "integer"
            },
            "description": "Code blocks per language.",
            "type": "object"
          },
          "first_post": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PostDate"
              },
              {
                "type": "null"
              }
            ]
          },
          "images": {
            "type": "integer"
          },
          "latest_post": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PostDate"
              },
              {
                "type": "null"
              }
            ]
          },
          "longest_post": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PostWords"
              },
              {
                "type": "null"
              }
            ]
          },
          "posts": {
            "type": "integer"
          },
          "posts_per_month": {
            "additionalProperties": {
              "type": "integer"
            },
            "description": "Posts per month, keyed YYYY-MM.",
            "type": "object"
          },
          "reading_minutes": {
            "type": "integer"
          },
          "shortest_post": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/PostWords"
              },
              {
                "type": "null"
              }
            ]
          },
          "tags": {
            "type": "integer"
          },
          "words": {
            "type": "integer"
          }
        },
        "required": [
          "posts",
          "words",
          "reading_minutes",
          "average_words",
          "tags",
          "code_blocks",
          "code_languages",
          "images",
          "posts_per_month",
          "first_post",
          "latest_post",
          "longest_post",
          "shortest_post"
        ],
        "type": "object"
      },
      "Tag": {
        "properties": {
          "api_url": {
            "format": "uri",
            "type": "string"
          },
          "count": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "posts": {
            "description": "Slugs of the posts carrying this tag, newest first.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "slug": {
            "type": "string"
          },
          "url": {
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "name",
          "slug",
          "count",
          "url",
          "api_url",
          "posts"
        ],
        "type": "object"
      },
      "TagRef": {
        "properties": {
          "api_url": {
            "format": "uri",
            "type": "string"
          },
          "name": {
            "description": "The tag as written in the post.",
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "url": {
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "name",
          "slug",
          "url",
          "api_url"
        ],
        "type": "object"
      },
      "TagWithPosts": {
        "properties": {
          "api_url": {
            "format": "uri",
            "type": "string"
          },
          "count": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "posts": {
            "items": {
              "$ref": "#/components/schemas/PostSummary"
            },
            "type": "array"
          },
          "slug": {
            "type": "string"
          },
          "url": {
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "name",
          "slug",
          "count",
          "url",
          "api_url",
          "posts"
        ],
        "type": "object"
      }
    }
  },
  "externalDocs": {
    "description": "Docs, with examples",
    "url": "https://londopy.github.io/blog/api/"
  },
  "info": {
    "contact": {
      "name": "Londopy",
      "url": "https://londopy.github.io/blog/contact/"
    },
    "description": "Static, read-only files, rebuilt with the blog on every push and daily at 17:30 UTC. No key, CORS-open. Only published posts appear; a scheduled post joins the API with the build that publishes it. Every endpoint wraps its payload in an envelope, {meta, data}, except the standard formats: the JSON Feed, the shields.io badges, RSS and posts.txt.",
    "license": {
      "name": "Posts CC BY 4.0, code MIT",
      "url": "https://github.com/Londopy/blog#license"
    },
    "summary": "Every post on londopy.github.io/blog as JSON.",
    "title": "Londopy Blog API",
    "version": "1.0.0"
  },
  "openapi": "3.1.0",
  "paths": {
    "/api/openapi.json": {
      "get": {
        "operationId": "getOpenAPI",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            },
            "description": "This document."
          }
        },
        "summary": "This API, described in OpenAPI 3.1",
        "tags": [
          "Discovery"
        ]
      }
    },
    "/api/v1/archive.json": {
      "get": {
        "operationId": "getArchive",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "properties": {
                        "data": {
                          "items": {
                            "$ref": "#/components/schemas/ArchiveYear"
                          },
                          "type": "array"
                        }
                      }
                    }
                  ]
                }
              }
            },
            "description": "Years newest first; months newest first within each."
          }
        },
        "summary": "Posts grouped by year and month",
        "tags": [
          "Taxonomy"
        ]
      }
    },
    "/api/v1/badges/{metric}.json": {
      "get": {
        "description": "Use with https://img.shields.io/endpoint?url=<this URL>. No envelope.",
        "externalDocs": {
          "url": "https://shields.io/badges/endpoint-badge"
        },
        "operationId": "getBadge",
        "parameters": [
          {
            "in": "path",
            "name": "metric",
            "required": true,
            "schema": {
              "enum": [
                "posts",
                "words",
                "latest",
                "updated"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Badge"
                }
              }
            },
            "description": "The badge."
          }
        },
        "summary": "A shields.io endpoint badge",
        "tags": [
          "Badges"
        ]
      }
    },
    "/api/v1/feed.json": {
      "get": {
        "externalDocs": {
          "url": "https://www.jsonfeed.org/version/1.1/"
        },
        "operationId": "getJSONFeed",
        "responses": {
          "200": {
            "content": {
              "application/feed+json": {
                "schema": {
                  "$ref": "#/components/schemas/JSONFeed"
                }
              }
            },
            "description": "The newest posts as a JSON Feed. No envelope."
          }
        },
        "summary": "JSON Feed 1.1, with full post content",
        "tags": [
          "Feeds"
        ]
      }
    },
    "/api/v1/index.json": {
      "get": {
        "operationId": "getIndex",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/Index"
                        }
                      }
                    }
                  ]
                }
              }
            },
            "description": "The endpoint catalog."
          }
        },
        "summary": "Every endpoint, with its URL",
        "tags": [
          "Discovery"
        ]
      }
    },
    "/api/v1/latest.json": {
      "get": {
        "operationId": "getLatestPost",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "properties": {
                        "data": {
                          "oneOf": [
                            {
                              "$ref": "#/components/schemas/Post"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      }
                    }
                  ]
                }
              }
            },
            "description": "The newest post, or null before the first one."
          }
        },
        "summary": "The newest post, in full",
        "tags": [
          "Posts"
        ]
      }
    },
    "/api/v1/posts.json": {
      "get": {
        "operationId": "listPosts",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "properties": {
                        "data": {
                          "items": {
                            "$ref": "#/components/schemas/PostSummary"
                          },
                          "type": "array"
                        }
                      }
                    }
                  ]
                }
              }
            },
            "description": "Post summaries. Follow api_url for a post in full."
          }
        },
        "summary": "Every published post, newest first",
        "tags": [
          "Posts"
        ]
      }
    },
    "/api/v1/posts.txt": {
      "get": {
        "operationId": "getPostsText",
        "responses": {
          "200": {
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "One post per entry, date, title and URL, newest first."
          }
        },
        "summary": "The post list, for curl",
        "tags": [
          "Terminal"
        ]
      }
    },
    "/api/v1/posts/{slug}.json": {
      "get": {
        "operationId": "getPost",
        "parameters": [
          {
            "description": "A post's slug, from posts.json.",
            "in": "path",
            "name": "slug",
            "required": true,
            "schema": {
              "examples": [
                "gitattributes"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/Post"
                        }
                      }
                    }
                  ]
                }
              }
            },
            "description": "The post."
          },
          "404": {
            "description": "No published post has that slug. GitHub Pages answers with its HTML 404 page."
          }
        },
        "summary": "One post in full, with its text, headings, code, links and images",
        "tags": [
          "Posts"
        ]
      }
    },
    "/api/v1/search.json": {
      "get": {
        "operationId": "getSearch",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "properties": {
                        "data": {
                          "items": {
                            "$ref": "#/components/schemas/SearchItem"
                          },
                          "type": "array"
                        }
                      }
                    }
                  ]
                }
              }
            },
            "description": "Search items, pages first, then posts newest first, then tags."
          }
        },
        "summary": "Every post, page and tag, in one small file for search",
        "tags": [
          "Discovery"
        ]
      }
    },
    "/api/v1/site.json": {
      "get": {
        "operationId": "getSite",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/Site"
                        }
                      }
                    }
                  ]
                }
              }
            },
            "description": "The blog itself."
          }
        },
        "summary": "Title, tagline, links, license and publishing schedule",
        "tags": [
          "Site"
        ]
      }
    },
    "/api/v1/stats.json": {
      "get": {
        "operationId": "getStats",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/Stats"
                        }
                      }
                    }
                  ]
                }
              }
            },
            "description": "Counts and records across every published post."
          }
        },
        "summary": "The numbers, all in one place",
        "tags": [
          "Activity"
        ]
      }
    },
    "/api/v1/tags.json": {
      "get": {
        "operationId": "listTags",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "properties": {
                        "data": {
                          "items": {
                            "$ref": "#/components/schemas/Tag"
                          },
                          "type": "array"
                        }
                      }
                    }
                  ]
                }
              }
            },
            "description": "Tags, each with the slugs of its posts."
          }
        },
        "summary": "Tags, most used first, with the posts carrying each",
        "tags": [
          "Taxonomy"
        ]
      }
    },
    "/api/v1/tags/{tag}.json": {
      "get": {
        "operationId": "getTag",
        "parameters": [
          {
            "description": "A tag's slug, from tags.json.",
            "in": "path",
            "name": "tag",
            "required": true,
            "schema": {
              "examples": [
                "git"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/TagWithPosts"
                        }
                      }
                    }
                  ]
                }
              }
            },
            "description": "The tag, with its posts newest first."
          },
          "404": {
            "description": "No published post carries that tag."
          }
        },
        "summary": "One tag, with its posts",
        "tags": [
          "Taxonomy"
        ]
      }
    },
    "/index.xml": {
      "get": {
        "operationId": "getRSS",
        "responses": {
          "200": {
            "content": {
              "application/rss+xml": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "The same posts as RSS 2.0."
          }
        },
        "summary": "RSS 2.0, with full post content",
        "tags": [
          "Feeds"
        ]
      }
    }
  },
  "servers": [
    {
      "description": "GitHub Pages",
      "url": "https://londopy.github.io/blog"
    }
  ],
  "tags": [
    {
      "name": "Discovery"
    },
    {
      "name": "Site"
    },
    {
      "name": "Posts"
    },
    {
      "name": "Taxonomy"
    },
    {
      "name": "Activity"
    },
    {
      "name": "Feeds"
    },
    {
      "name": "Badges"
    },
    {
      "name": "Terminal"
    }
  ]
}