{
  "openapi": "3.1.0",
  "info": {
    "title": "Londopy API",
    "version": "1.0.0",
    "summary": "London C.'s projects, writeups, pull requests and posts, as JSON.",
    "description": "Everything on londopy.github.io as JSON: the projects and their writeups, the domains they're grouped by, languages and tags, awards, pull requests to other people's projects, blog posts, and the numbers. Static files, rebuilt with the site on every push and every night; read-only, no key, CORS-open.",
    "contact": {
      "name": "London C.",
      "url": "https://londopy.github.io/contact/"
    }
  },
  "servers": [
    {
      "url": "https://londopy.github.io",
      "description": "GitHub Pages"
    }
  ],
  "externalDocs": {
    "description": "Docs, with a live console",
    "url": "https://londopy.github.io/api/"
  },
  "tags": [
    {
      "name": "Discovery",
      "description": "Where everything is."
    },
    {
      "name": "Profile",
      "description": "Who I am and how to reach me."
    },
    {
      "name": "Projects",
      "description": "The index, one file per project."
    },
    {
      "name": "Taxonomy",
      "description": "Domains, languages and tags."
    },
    {
      "name": "Activity",
      "description": "Pull requests, blog posts and the numbers."
    },
    {
      "name": "Badges",
      "description": "For READMEs."
    },
    {
      "name": "Terminal",
      "description": "Plain text, for curl."
    }
  ],
  "paths": {
    "/api/v1/index.json": {
      "get": {
        "operationId": "getIndex",
        "summary": "Every endpoint, with its URL",
        "description": "Machine-readable table of contents; templated paths list every valid value.",
        "tags": [
          "Discovery"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "meta",
                    "data"
                  ],
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "data": {
                      "$ref": "#/components/schemas/Index"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/openapi.json": {
      "get": {
        "operationId": "getOpenApi",
        "summary": "This API, described in OpenAPI 3.1",
        "description": "Drop it into Swagger UI, Postman or an SDK generator.",
        "tags": [
          "Discovery"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/search.json": {
      "get": {
        "operationId": "getSearchIndex",
        "summary": "Everything searchable, in one small file",
        "description": "Pages, projects, domains and posts with keywords: what the site's command palette (press /) loads.",
        "tags": [
          "Discovery"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "meta",
                    "data"
                  ],
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/SearchItem"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/profile.json": {
      "get": {
        "operationId": "getProfile",
        "summary": "Name, links, contact methods and PGP key",
        "tags": [
          "Profile"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "meta",
                    "data"
                  ],
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "data": {
                      "$ref": "#/components/schemas/Profile"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/now.json": {
      "get": {
        "operationId": "getNow",
        "summary": "What I'm focused on this month",
        "description": "The /now page as data, with the latest post and pushes.",
        "tags": [
          "Profile"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "meta",
                    "data"
                  ],
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "data": {
                      "$ref": "#/components/schemas/Now"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/pgp.asc": {
      "get": {
        "operationId": "getPgpKey",
        "summary": "My PGP public key, ASCII-armored",
        "description": "Encrypt to it with `curl -s https://londopy.github.io/pgp.asc | gpg --import`.",
        "tags": [
          "Profile"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/pgp-keys": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/projects.json": {
      "get": {
        "operationId": "listProjects",
        "summary": "Every project",
        "description": "Live star counts and last-push times, as of the last build.",
        "tags": [
          "Projects"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "meta",
                    "data"
                  ],
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ProjectSummary"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/projects/{name}.json": {
      "get": {
        "operationId": "getProject",
        "summary": "One project, with its full writeup",
        "description": "Adds the writeup (HTML and plain text), an install command for PyPI packages, and related projects.",
        "tags": [
          "Projects"
        ],
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "description": "Project name, exactly as the repo spells it",
            "schema": {
              "type": "string",
              "enum": [
                "nexium",
                "gesture-synth",
                "capture-bypass",
                "HideDesktopApps",
                "clipvault",
                "pc-optimizer",
                "drugdose",
                "vitalscore",
                "Clinical_IQ",
                "akribia",
                "DiresQ",
                "ropesim",
                "apollo-rope-memory",
                "pygeospy",
                "qbit-killswitch",
                "mullvad-wg-monitor",
                "patchnotes",
                "timefuzz",
                "Live_Video_Feed_Facial_Recognition",
                "convo-generator",
                "kto",
                "deadpoint",
                "nxtls",
                "ValoTracker",
                "IEM-Tool-rs",
                "whumpf",
                "filekind",
                "beam",
                "agent-skills",
                "skill-rollcall",
                "mcp-rollcall",
                "settings-effective",
                "git-attribution",
                "statusmith",
                "point-of-origin",
                "the-long-fork"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "meta",
                    "data"
                  ],
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "data": {
                      "$ref": "#/components/schemas/ProjectDetail"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No such name (GitHub Pages' HTML 404 page)"
          }
        }
      }
    },
    "/api/v1/featured.json": {
      "get": {
        "operationId": "listFeatured",
        "summary": "The featured projects",
        "tags": [
          "Projects"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "meta",
                    "data"
                  ],
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ProjectSummary"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/awards.json": {
      "get": {
        "operationId": "listAwards",
        "summary": "Hackathon placings and other awards",
        "tags": [
          "Projects"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "meta",
                    "data"
                  ],
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/AwardEntry"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/in-progress.json": {
      "get": {
        "operationId": "listInProgress",
        "summary": "Names reserved, code brewing",
        "tags": [
          "Projects"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "meta",
                    "data"
                  ],
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/InProgressItem"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clusters.json": {
      "get": {
        "operationId": "listClusters",
        "summary": "The domains projects are grouped by",
        "tags": [
          "Taxonomy"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "meta",
                    "data"
                  ],
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Cluster"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/clusters/{id}.json": {
      "get": {
        "operationId": "getCluster",
        "summary": "One domain, with its projects in full",
        "tags": [
          "Taxonomy"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Domain id",
            "schema": {
              "type": "string",
              "enum": [
                "systems",
                "security",
                "medicine",
                "climbing",
                "geospatial",
                "networking",
                "devtools",
                "claude-tooling",
                "ai",
                "games",
                "audio"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "meta",
                    "data"
                  ],
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "data": {
                      "$ref": "#/components/schemas/ClusterDetail"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No such id (GitHub Pages' HTML 404 page)"
          }
        }
      }
    },
    "/api/v1/languages.json": {
      "get": {
        "operationId": "listLanguages",
        "summary": "Languages, their colours, and the projects using each",
        "tags": [
          "Taxonomy"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "meta",
                    "data"
                  ],
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Language"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tags.json": {
      "get": {
        "operationId": "listTags",
        "summary": "Tags, and the projects carrying each",
        "tags": [
          "Taxonomy"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "meta",
                    "data"
                  ],
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Tag"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/pulls.json": {
      "get": {
        "operationId": "listPulls",
        "summary": "Pull requests to other people's projects",
        "description": "Merged first, then newest. States refresh from GitHub on every build.",
        "tags": [
          "Activity"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "meta",
                    "data"
                  ],
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Pull"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/posts.json": {
      "get": {
        "operationId": "listPosts",
        "summary": "Blog posts, newest first",
        "description": "Read from the blog's RSS feed at build time.",
        "tags": [
          "Activity"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "meta",
                    "data"
                  ],
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Post"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/stats.json": {
      "get": {
        "operationId": "getStats",
        "summary": "The numbers, all in one place",
        "tags": [
          "Activity"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "meta",
                    "data"
                  ],
                  "properties": {
                    "meta": {
                      "$ref": "#/components/schemas/Meta"
                    },
                    "data": {
                      "$ref": "#/components/schemas/Stats"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/badges/{metric}.json": {
      "get": {
        "operationId": "getBadge",
        "summary": "A shields.io endpoint badge",
        "description": "Use with https://img.shields.io/endpoint?url=… — the badge follows the site.",
        "tags": [
          "Badges"
        ],
        "parameters": [
          {
            "name": "metric",
            "in": "path",
            "required": true,
            "description": "Which number",
            "schema": {
              "type": "string",
              "enum": [
                "catalog",
                "projects",
                "domains",
                "stars",
                "pulls",
                "merged",
                "posts"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Badge"
                }
              }
            }
          },
          "404": {
            "description": "No such metric (GitHub Pages' HTML 404 page)"
          }
        }
      }
    },
    "/api/v1/card.txt": {
      "get": {
        "operationId": "getCardText",
        "summary": "A business card for your terminal",
        "tags": [
          "Terminal"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/card.ansi": {
      "get": {
        "operationId": "getCardAnsi",
        "summary": "The same card, in colour (24-bit ANSI)",
        "description": "`curl -s https://londopy.github.io/api/v1/card.ansi`",
        "tags": [
          "Terminal"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Meta": {
        "type": "object",
        "required": [
          "api",
          "version",
          "generated",
          "self",
          "docs"
        ],
        "properties": {
          "api": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "generated": {
            "type": "string",
            "format": "date-time",
            "description": "When the build that wrote this file ran"
          },
          "self": {
            "type": "string",
            "format": "uri"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "count": {
            "type": "integer",
            "minimum": 0,
            "description": "Number of items, on list endpoints"
          },
          "source": {
            "type": "string",
            "format": "uri",
            "description": "Where the data came from, when it isn't this site"
          },
          "note": {
            "type": "string",
            "description": "Anything unusual about this build of the file"
          }
        }
      },
      "Link": {
        "type": "object",
        "required": [
          "label",
          "url"
        ],
        "properties": {
          "label": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Award": {
        "type": "object",
        "required": [
          "place",
          "medal",
          "event",
          "track",
          "url"
        ],
        "properties": {
          "place": {
            "type": "string"
          },
          "medal": {
            "type": "string",
            "enum": [
              "gold",
              "silver",
              "bronze"
            ]
          },
          "event": {
            "type": "string"
          },
          "track": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "url": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "AwardEntry": {
        "type": "object",
        "required": [
          "project",
          "place",
          "medal",
          "event",
          "track",
          "url",
          "project_url"
        ],
        "properties": {
          "project": {
            "type": "string"
          },
          "place": {
            "type": "string"
          },
          "medal": {
            "type": "string",
            "enum": [
              "gold",
              "silver",
              "bronze"
            ]
          },
          "event": {
            "type": "string"
          },
          "track": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "url": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri"
              },
              {
                "type": "null"
              }
            ]
          },
          "project_url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "ClusterRef": {
        "type": "object",
        "required": [
          "id",
          "title"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        }
      },
      "ProjectUrls": {
        "type": "object",
        "required": [
          "page",
          "repo",
          "demo",
          "docs",
          "og_image",
          "api"
        ],
        "properties": {
          "page": {
            "type": "string",
            "format": "uri"
          },
          "repo": {
            "type": "string",
            "format": "uri"
          },
          "demo": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri"
              },
              {
                "type": "null"
              }
            ]
          },
          "docs": {
            "anyOf": [
              {
                "type": "string",
                "format": "uri"
              },
              {
                "type": "null"
              }
            ]
          },
          "og_image": {
            "type": "string",
            "format": "uri"
          },
          "api": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "ProjectSummary": {
        "type": "object",
        "required": [
          "name",
          "tagline",
          "cluster",
          "languages",
          "tags",
          "featured",
          "stars",
          "pushed_at",
          "award",
          "urls",
          "links"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "The repo's name, and the id used in URLs (case-sensitive)"
          },
          "tagline": {
            "type": "string"
          },
          "cluster": {
            "$ref": "#/components/schemas/ClusterRef"
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "featured": {
            "type": "boolean"
          },
          "stars": {
            "type": "integer",
            "minimum": 0
          },
          "pushed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "Last push to the repo"
              },
              {
                "type": "null"
              }
            ]
          },
          "award": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Award"
              },
              {
                "type": "null"
              }
            ]
          },
          "urls": {
            "$ref": "#/components/schemas/ProjectUrls"
          },
          "links": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Link"
            }
          }
        }
      },
      "ProjectDetail": {
        "type": "object",
        "required": [
          "name",
          "tagline",
          "cluster",
          "languages",
          "tags",
          "featured",
          "stars",
          "pushed_at",
          "award",
          "urls",
          "links",
          "install",
          "writeup",
          "related"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "The repo's name, and the id used in URLs (case-sensitive)"
          },
          "tagline": {
            "type": "string"
          },
          "cluster": {
            "$ref": "#/components/schemas/ClusterRef"
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "featured": {
            "type": "boolean"
          },
          "stars": {
            "type": "integer",
            "minimum": 0
          },
          "pushed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "Last push to the repo"
              },
              {
                "type": "null"
              }
            ]
          },
          "award": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Award"
              },
              {
                "type": "null"
              }
            ]
          },
          "urls": {
            "$ref": "#/components/schemas/ProjectUrls"
          },
          "links": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Link"
            }
          },
          "install": {
            "anyOf": [
              {
                "type": "string",
                "description": "Install command, for packages on PyPI"
              },
              {
                "type": "null"
              }
            ]
          },
          "writeup": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "html",
                  "text"
                ],
                "properties": {
                  "html": {
                    "type": "string"
                  },
                  "text": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "related": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Other projects in the same domain"
          }
        }
      },
      "Cluster": {
        "type": "object",
        "required": [
          "id",
          "emoji",
          "title",
          "blurb",
          "count",
          "projects",
          "urls"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "emoji": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "blurb": {
            "type": "string"
          },
          "count": {
            "type": "integer",
            "minimum": 0
          },
          "projects": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "type": "object",
            "required": [
              "page",
              "api"
            ],
            "properties": {
              "page": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "ClusterDetail": {
        "type": "object",
        "required": [
          "id",
          "emoji",
          "title",
          "blurb",
          "count",
          "projects",
          "urls"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "emoji": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "blurb": {
            "type": "string"
          },
          "count": {
            "type": "integer",
            "minimum": 0
          },
          "projects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProjectSummary"
            }
          },
          "urls": {
            "type": "object",
            "required": [
              "page",
              "api"
            ],
            "properties": {
              "page": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      },
      "Language": {
        "type": "object",
        "required": [
          "name",
          "color",
          "count",
          "projects"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "color": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "count": {
            "type": "integer",
            "minimum": 0
          },
          "projects": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "Tag": {
        "type": "object",
        "required": [
          "tag",
          "count",
          "projects"
        ],
        "properties": {
          "tag": {
            "type": "string"
          },
          "count": {
            "type": "integer",
            "minimum": 0
          },
          "projects": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "InProgressItem": {
        "type": "object",
        "required": [
          "name",
          "hint"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "hint": {
            "type": "string"
          }
        }
      },
      "Pull": {
        "type": "object",
        "required": [
          "repo",
          "number",
          "title",
          "state",
          "url",
          "created",
          "repo_stars"
        ],
        "properties": {
          "repo": {
            "type": "string"
          },
          "number": {
            "type": "integer",
            "minimum": 0
          },
          "title": {
            "type": "string"
          },
          "state": {
            "type": "string",
            "enum": [
              "open",
              "closed",
              "merged"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "created": {
            "anyOf": [
              {
                "type": "string",
                "format": "date"
              },
              {
                "type": "null"
              }
            ]
          },
          "repo_stars": {
            "type": "integer",
            "minimum": 0
          }
        }
      },
      "Post": {
        "type": "object",
        "required": [
          "title",
          "url",
          "published",
          "summary"
        ],
        "properties": {
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "published": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "summary": {
            "type": "string"
          }
        }
      },
      "SearchItem": {
        "type": "object",
        "required": [
          "kind",
          "title",
          "subtitle",
          "path",
          "url",
          "keywords"
        ],
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "page",
              "project",
              "domain",
              "post"
            ]
          },
          "title": {
            "type": "string"
          },
          "subtitle": {
            "type": "string"
          },
          "path": {
            "type": "string",
            "description": "Site-relative path, for same-origin links"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "keywords": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "Now": {
        "type": "object",
        "required": [
          "updated",
          "stale",
          "url",
          "sections",
          "lately"
        ],
        "properties": {
          "updated": {
            "type": "string",
            "format": "date"
          },
          "stale": {
            "type": "boolean",
            "description": "True once the list has gone 60 days without an update"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "sections": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "title",
                "items"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "items": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "text",
                      "html"
                    ],
                    "properties": {
                      "text": {
                        "type": "string"
                      },
                      "html": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          },
          "lately": {
            "type": "object",
            "required": [
              "latest_post",
              "recent_pushes"
            ],
            "properties": {
              "latest_post": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Post"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "recent_pushes": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "project",
                    "pushed_at",
                    "url"
                  ],
                  "properties": {
                    "project": {
                      "type": "string"
                    },
                    "pushed_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "Profile": {
        "type": "object",
        "required": [
          "name",
          "handle",
          "headline",
          "summary",
          "focus",
          "certifications",
          "open_to_work",
          "links",
          "contact",
          "pgp"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "handle": {
            "type": "string"
          },
          "headline": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "focus": {
            "type": "string"
          },
          "certifications": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "open_to_work": {
            "type": "object",
            "required": [
              "open",
              "text"
            ],
            "properties": {
              "open": {
                "type": "boolean"
              },
              "text": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            }
          },
          "links": {
            "type": "object",
            "required": [
              "site",
              "blog",
              "api",
              "github",
              "itch"
            ],
            "properties": {
              "site": {
                "type": "string",
                "format": "uri"
              },
              "blog": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "github": {
                "type": "string",
                "format": "uri"
              },
              "itch": {
                "type": "string",
                "format": "uri"
              }
            }
          },
          "contact": {
            "type": "object",
            "required": [
              "form",
              "discord",
              "irc"
            ],
            "properties": {
              "form": {
                "type": "string",
                "format": "uri"
              },
              "discord": {
                "type": "string"
              },
              "irc": {
                "type": "object",
                "required": [
                  "network",
                  "nick",
                  "how",
                  "web_client"
                ],
                "properties": {
                  "network": {
                    "type": "string"
                  },
                  "nick": {
                    "type": "string"
                  },
                  "how": {
                    "type": "string"
                  },
                  "web_client": {
                    "type": "string",
                    "format": "uri"
                  }
                }
              }
            }
          },
          "pgp": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "fingerprint",
                  "key_url",
                  "armored"
                ],
                "properties": {
                  "fingerprint": {
                    "type": "string"
                  },
                  "key_url": {
                    "type": "string",
                    "format": "uri"
                  },
                  "armored": {
                    "type": "string"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "Stats": {
        "type": "object",
        "required": [
          "projects",
          "domains",
          "featured",
          "languages",
          "tags",
          "stars",
          "pull_requests",
          "posts",
          "awards",
          "in_progress",
          "last_push"
        ],
        "properties": {
          "projects": {
            "type": "integer",
            "minimum": 0
          },
          "domains": {
            "type": "integer",
            "minimum": 0
          },
          "featured": {
            "type": "integer",
            "minimum": 0
          },
          "languages": {
            "type": "integer",
            "minimum": 0
          },
          "tags": {
            "type": "integer",
            "minimum": 0
          },
          "stars": {
            "type": "object",
            "required": [
              "total",
              "top"
            ],
            "properties": {
              "total": {
                "type": "integer",
                "minimum": 0
              },
              "top": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "name",
                    "stars"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "stars": {
                      "type": "integer",
                      "minimum": 0
                    }
                  }
                }
              }
            }
          },
          "pull_requests": {
            "type": "object",
            "required": [
              "count",
              "repos",
              "merged",
              "reach"
            ],
            "properties": {
              "count": {
                "type": "integer",
                "minimum": 0
              },
              "repos": {
                "type": "integer",
                "minimum": 0
              },
              "merged": {
                "type": "integer",
                "minimum": 0
              },
              "reach": {
                "type": "integer",
                "minimum": 0,
                "description": "Stars summed across the repos I've sent PRs to"
              }
            }
          },
          "posts": {
            "type": "integer",
            "minimum": 0
          },
          "awards": {
            "type": "integer",
            "minimum": 0
          },
          "in_progress": {
            "type": "integer",
            "minimum": 0
          },
          "last_push": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "project",
                  "at"
                ],
                "properties": {
                  "project": {
                    "type": "string"
                  },
                  "at": {
                    "type": "string",
                    "format": "date-time"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "Badge": {
        "type": "object",
        "description": "A shields.io endpoint badge: https://shields.io/badges/endpoint-badge",
        "required": [
          "schemaVersion",
          "label",
          "message",
          "color"
        ],
        "properties": {
          "schemaVersion": {
            "type": "integer",
            "enum": [
              1
            ]
          },
          "label": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "color": {
            "type": "string"
          }
        }
      },
      "IndexEndpoint": {
        "type": "object",
        "required": [
          "path",
          "url",
          "summary",
          "group",
          "type"
        ],
        "properties": {
          "path": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "A URL template when `params` is present"
          },
          "summary": {
            "type": "string"
          },
          "group": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "params": {
            "type": "object",
            "description": "Every valid value of each path parameter",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "Index": {
        "type": "object",
        "required": [
          "name",
          "description",
          "version",
          "docs",
          "openapi",
          "endpoints"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "endpoints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/IndexEndpoint"
            }
          }
        }
      }
    }
  }
}
