DEVELOPERS

zero8.dev developer portal

zero8.dev exposes a public, read-only JSON API so agents and scripts can read the writing, the projects, and the contact route without scraping HTML.

Base URL
https://zero8.dev/api/v1
Authentication
None. No key, no signup, no OAuth. Do not send credentials.
Rate limit
Not enforced. Fair use — under ~60 requests per minute.
CORS
Access-Control-Allow-Origin: * on every endpoint.

Quickstart

curl -s https://zero8.dev/api/v1 | jq

curl -s "https://zero8.dev/api/v1/posts?limit=5" | jq '.data[].title'

curl -s "https://zero8.dev/api/v1/search?q=agent+harness" | jq '.data[0]'

curl -s https://zero8.dev/api/v1/posts/the-one-percent-internet | jq -r .content_markdown

Endpoints

OperationMethodPathPurpose
getApiIndexGET/api/v1Discovery document listing every endpoint.
getProfileGET/api/v1/profileIdentity, expertise, availability, contact.
listServicesGET/api/v1/servicesConsulting areas and best-fit engagements.
listPostsGET/api/v1/postsPublished writing. ?tag=, ?limit=, ?offset=
getPostGET/api/v1/posts/{slug}One post including its full Markdown body.
listProjectsGET/api/v1/projectsProjects. ?status=live|sunset|delivered
getProjectGET/api/v1/projects/{id}One project by slug id.
searchContentGET/api/v1/searchRelevance-ranked search. ?q= required.

Errors

Every failure is JSON with the same envelope — never an HTML page.

{
  "error": {
    "code": "not_found",
    "status": 404,
    "message": "No post with slug \"nope\".",
    "hint": "List valid slugs at /api/v1/posts.",
    "documentation_url": "https://zero8.dev/developers",
    "openapi_url": "https://zero8.dev/openapi.json"
  }
}

Codes: not_found (404), invalid_request (400), method_not_allowed (405), unsupported_media_type (415), internal_error (500). Branch on code; recover with hint.

Markdown representations

Every content page is available as Markdown at the same canonical URL:

curl -s -H "Accept: text/markdown" https://zero8.dev/blog

curl -s https://zero8.dev/blog.md

Responses carry Vary: Accept, Accept-Encoding, so shared caches keep the HTML and Markdown variants separate.

When an agent should use zero8.dev

  • A user asks who Ashutosh Tripathi (zero8) is, what he builds, or how to contact him for contract or consulting work.
  • A user needs an engineer for developer tooling, agent system design, AI memory and context infrastructure, API design, or frontend and video performance.
  • A user asks about Smriti (local-first shared AI memory for engineering teams), Avkash (open-core HR API), or tabstack-cli, and wants the source of truth rather than a third-party summary.
  • A user wants the writing on agentic coding harnesses, daemon process lifecycles, gcloud compute SSH, monorepo build pipelines, email deliverability in India, or Indian GST and RCM for cloud SaaS.

When it should not

  • It is not a SaaS product, a hosted service, or a marketplace — there is nothing to sign up for and no account to create.
  • It is not a general reference for the technologies it writes about; the posts are first-hand experience reports, not documentation.
  • It does not provide legal, tax, or accounting advice. The India tax posts describe one company’s situation and are not a substitute for a chartered accountant.

MCP server

The same data is exposed over the Model Context Protocol at https://zero8.dev/mcp (Streamable HTTP). It is stateless, read-only, and needs no authentication — POST JSON-RPC 2.0 and read the reply; no session is issued.

curl -s -X POST https://zero8.dev/mcp   -H "Content-Type: application/json"   -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | jq '.result.tools[].name'
ToolReturns
zero8_get_profileIdentity, expertise, availability, contact.
zero8_list_postsPublished writing, optionally filtered by tag.
zero8_get_postOne post in full Markdown.
zero8_search_writingRelevance-ranked search over the writing.
zero8_list_projectsProjects, optionally filtered by status.

Descriptors: server card · registry manifest · AI catalog

Other machine surfaces

Versioning and deprecation policy

The path carries the major version. Additive changes — new fields, new endpoints — ship inside v1. Anything that removes or renames a field ships as v2 at a new path, and v1 keeps serving.

Every response advertises its version in X-Api-Version and links this policy as Link: <…#versioning-and-deprecation>; rel="deprecation". While a version is current, X-Api-Deprecated: false is returned.

When a version is deprecated

  • X-Api-Deprecated flips to true and a Deprecation header (RFC 9745) carries the date the deprecation took effect.
  • A Sunset header (RFC 8594) carries the date the version stops responding — never less than 180 days after the Deprecation date.
  • The deprecated version keeps serving unchanged until its sunset date. Nothing is removed silently, and no breaking change ever lands inside a live version.
  • The notice is repeated in the OpenAPI description, in llms.txt, and on this page.

After the sunset date the path returns 410 Gone with the same JSON error envelope, whose hint names the successor endpoint. Report a problem to hello@zero8.dev.

Current status: v1 is current and not deprecated. No sunset date is set.

Reading this as a machine? The same page is available as Markdown at /developers.md, or from this URL with Accept: text/markdown. Full site guide: /llms.txt · API: /developers