{
 "openapi": "3.1.0",
 "info": {
  "title": "sshh.io read API",
  "version": "1.0.0",
  "description": "Read-only, unauthenticated JSON API for Shrivu Shankar's personal site. Free tier: everything, forever — no API keys, no signup, no sandbox needed (production is safe to explore; all endpoints are read-only). Versioning: the API is versioned in the URL path (/api/v1/); breaking changes will ship as /api/v2/ and v1 responses will carry Sunset and Deprecation headers for at least 90 days before removal. Rate limits: generous CDN-level limits, disclosed via RateLimit-Policy response headers; on 429 honor Retry-After. Errors: unknown paths return HTTP 404 with application/problem+json (RFC 9457) when JSON is requested. For richer interactions (blog search, full post text) use the MCP server at https://sshh.io/mcp (Streamable HTTP, no auth). Markdown mirrors of site pages: append .md or send Accept: text/markdown; agent guide at /llms.txt.",
  "contact": {
   "name": "Shrivu Shankar",
   "url": "https://sshh.io/contact"
  }
 },
 "servers": [
  {
   "url": "https://sshh.io"
  }
 ],
 "paths": {
  "/api/v1/projects.json": {
   "get": {
    "operationId": "listProjects",
    "summary": "List all public projects",
    "description": "Structured metadata for 100 software projects: title, tagline, language, domain, tags, coolness (1-10), start date, and links. Also served unversioned at /projects.json.",
    "responses": {
     "200": {
      "description": "Project list",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ProjectList"
        }
       }
      }
     },
     "404": {
      "description": "Not found",
      "content": {
       "application/problem+json": {
        "schema": {
         "$ref": "#/components/schemas/Problem"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/posts.json": {
   "get": {
    "operationId": "listPosts",
    "summary": "List all blog posts (metadata + canonical URLs)",
    "description": "Metadata for every blog post: title, subtitle, date, description, slug, and canonical blog.sshh.io URL. Full post text is available via the MCP get_post tool or /llms-full.txt. Also served unversioned at /posts.json.",
    "responses": {
     "200": {
      "description": "Post list",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/PostList"
        }
       }
      }
     },
     "404": {
      "description": "Not found",
      "content": {
       "application/problem+json": {
        "schema": {
         "$ref": "#/components/schemas/Problem"
        }
       }
      }
     }
    }
   }
  }
 },
 "components": {
  "schemas": {
   "Problem": {
    "type": "object",
    "description": "RFC 9457 problem details",
    "properties": {
     "type": {
      "type": "string",
      "format": "uri"
     },
     "title": {
      "type": "string"
     },
     "status": {
      "type": "integer"
     },
     "detail": {
      "type": "string"
     },
     "instance": {
      "type": "string"
     }
    },
    "required": [
     "title",
     "status"
    ]
   },
   "Project": {
    "type": "object",
    "properties": {
     "title": {
      "type": "string"
     },
     "tagline": {
      "type": "string"
     },
     "language": {
      "type": "string"
     },
     "domain": {
      "type": "string"
     },
     "tags": {
      "type": "string"
     },
     "coolness": {
      "type": "integer",
      "minimum": 1,
      "maximum": 10
     },
     "start": {
      "type": "string"
     },
     "github": {
      "type": "string",
      "format": "uri"
     },
     "url": {
      "type": "string",
      "format": "uri"
     },
     "article": {
      "type": "string",
      "format": "uri"
     },
     "desc": {
      "type": "array",
      "items": {
       "type": "string"
      }
     }
    },
    "required": [
     "title",
     "tagline",
     "language",
     "domain",
     "coolness",
     "start"
    ]
   },
   "ProjectList": {
    "type": "object",
    "properties": {
     "source": {
      "type": "string",
      "format": "uri"
     },
     "generated": {
      "type": "string",
      "format": "date"
     },
     "count": {
      "type": "integer"
     },
     "projects": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Project"
      }
     }
    },
    "required": [
     "count",
     "projects"
    ]
   },
   "Post": {
    "type": "object",
    "properties": {
     "slug": {
      "type": "string"
     },
     "title": {
      "type": "string"
     },
     "subtitle": {
      "type": "string"
     },
     "date": {
      "type": "string",
      "format": "date-time"
     },
     "url": {
      "type": "string",
      "format": "uri",
      "description": "Canonical blog.sshh.io URL — cite this"
     },
     "description": {
      "type": "string"
     }
    },
    "required": [
     "slug",
     "title",
     "date",
     "url"
    ]
   },
   "PostList": {
    "type": "array",
    "items": {
     "$ref": "#/components/schemas/Post"
    }
   }
  }
 },
 "externalDocs": {
  "description": "Developer & agent portal",
  "url": "https://sshh.io/developers"
 }
}