{
  "openapi": "3.1.0",
  "info": {
    "title": "vd7.io",
    "version": "1.0.0",
    "description": "Personal site. Prefer JSON over HTML. Mapped human routes rewrite to JSON unless Accept has text/html. This file is the walk entry. Do not scrape pages."
  },
  "servers": [{ "url": "https://vd7.io" }],
  "paths": {
    "/": {
      "get": {
        "operationId": "root",
        "summary": "JSON unless Accept has text/html. Same body as GET /json.",
        "responses": { "200": { "description": "HTML or OpenAPI 3.1" } }
      }
    },
    "/json": {
      "get": {
        "operationId": "spec",
        "summary": "This document. Canonical entry.",
        "responses": { "200": { "description": "OpenAPI 3.1" } }
      }
    },
    "/openapi.json": {
      "get": {
        "operationId": "specAlias",
        "summary": "Alias of /json.",
        "responses": { "200": { "description": "OpenAPI 3.1" } }
      }
    },
    "/projects": {
      "get": {
        "operationId": "projectsPage",
        "summary": "JSON catalog unless Accept has text/html.",
        "responses": { "200": { "description": "HTML or JSON catalog" } }
      }
    },
    "/projects/json": {
      "get": {
        "operationId": "projects",
        "summary": "Catalog: glance, title, url, json, tags, github, github_meta. Follow json for one project. Next: GET github README.",
        "responses": { "200": { "description": "JSON catalog" } }
      }
    },
    "/projects.json": {
      "get": {
        "operationId": "projectsAlias",
        "summary": "Alias of /projects/json.",
        "responses": { "200": { "description": "JSON catalog" } }
      }
    },
    "/projects/{slug}/json": {
      "get": {
        "operationId": "projectItem",
        "summary": "One catalog row. Always JSON. Same keys as the catalog item.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": { "type": "string" }
          }
        ],
        "responses": { "200": { "description": "JSON project" } }
      }
    },
    "/routes/json": {
      "get": {
        "operationId": "routes",
        "summary": "html→json map for every page.",
        "responses": { "200": { "description": "JSON route map" } }
      }
    },
    "/llms.txt": {
      "get": {
        "operationId": "llms",
        "summary": "Plain-text index of the same catalog.",
        "responses": { "200": { "description": "text/plain" } }
      }
    },
    "/resume/json": {
      "get": {
        "operationId": "resume",
        "summary": "Resume JSON hydrated from static/resume/resume.tex. Not the PDF.",
        "responses": { "200": { "description": "JSON resume" } }
      }
    },
    "/resume.json": {
      "get": {
        "operationId": "resumeAlias",
        "summary": "Alias of /resume/json.",
        "responses": { "200": { "description": "JSON resume" } }
      }
    },
    "/resume": {
      "get": {
        "operationId": "resumePage",
        "summary": "JSON resume unless Accept has text/html. PDF at /resume/resume.pdf.",
        "responses": { "200": { "description": "HTML" } }
      }
    }
  }
}
