Developers

bshp.io is a personal portfolio. These surfaces exist so agents and tooling can read projects, articles, and stack data without scraping HTML. This is not a multi-tenant product: no API keys, no sandbox, no MCP server, no webhooks.

Fetch public JSON under /api/v1/, read /llms.txt for a site map, or load /openapi.json for the schema. All of that is built at deploy time from the same content collections as the HTML pages.

  • Plain-text map of the site for agents: summary, human pages, and machine URLs. Lists stay current with content collections at build time.

  • OpenAPI 3.1 document for the public GET endpoints under /api/v1/. Contact is described only as out of scope for integrations.

  • Static JSON: projects, published articles, and stack. No auth. Detail routes include markdown bodies; list routes are metadata only. Built as *.json files; extensionless paths rewrite on Cloudflare Pages.

  • Projects and published articles as an Atom/RSS feed.

  • Crawl map generated by @astrojs/sitemap at build time.

  • GET /api/v1

    Endpoint index. Static file: /api/v1.json Extensionless path rewrites on Cloudflare Pages only.

  • GET /api/v1/projects

    Project list. Static file: /api/v1/projects.json Extensionless path rewrites on Cloudflare Pages only.

  • GET /api/v1/projects/{slug}

    Project detail + body. Static file: /api/v1/projects/{slug}.json Extensionless path rewrites on Cloudflare Pages only.

  • GET /api/v1/articles

    Published articles only. Static file: /api/v1/articles.json Extensionless path rewrites on Cloudflare Pages only.

  • GET /api/v1/articles/{slug}

    Article detail + body. Static file: /api/v1/articles/{slug}.json Extensionless path rewrites on Cloudflare Pages only.

  • GET /api/v1/stack

    Models and tools. Static file: /api/v1/stack.json Extensionless path rewrites on Cloudflare Pages only.

Absolute base: https://bshp.io/api/v1 (or /api/v1.json )

The form at /contact posts to POST /api/contact. That route is origin-restricted and rate-limited for human messages. Do not treat it as a public write API. Prefer email via the form, or GitHub for project issues.