This is the developer portal for danielfarina.com. Agents and scripts should start here, not by guessing paths. Every interface is public, read-only, and unauthenticated. There is no signup, no dashboard, and no paid plan.

Quickstart

Three ways in. Pick one:

# 1. Agent index
curl -s https://danielfarina.com/llms.txt

# 2. Markdown of any page
curl -sH 'Accept: text/markdown' https://danielfarina.com/

# 3. Official CLI
npx github:daniel-farina/danielfarina
# or: brew install daniel-farina/tap/danielfarina

API keys

No API keys. Do not send an Authorization header. Do not create a token. GET, HEAD, and OPTIONS are open. POST, PUT, PATCH, and DELETE return HTTP 405 with RFC 9457 application/problem+json. Unknown API paths return HTTP 404 in the same shape — never an HTML app shell.

Documentation

REST API

Base: https://danielfarina.com/api/v1. CORS is *.

Official CLI

Package name danielfarina. Source: github.com/daniel-farina/danielfarina. Homebrew tap: daniel-farina/homebrew-tap.

npx github:daniel-farina/danielfarina
npx github:daniel-farina/danielfarina work
npx github:daniel-farina/danielfarina writing
npx github:daniel-farina/danielfarina --json

brew install daniel-farina/tap/danielfarina
danielfarina llms

Sandbox

The production API is the sandbox. Hit it from this machine — no staging key, no allowlist. Try these and you should get JSON, not HTML:

curl -s https://danielfarina.com/api/v1/site
curl -s https://danielfarina.com/api/v1/work
curl -s -o /dev/null -w '%{http_code}\n' https://danielfarina.com/api/v1/does-not-exist
# expect 404 application/problem+json
curl -s -o /dev/null -w '%{http_code}\n' -X POST https://danielfarina.com/api/v1/site
# expect 405

Errors

Every 4xx and 5xx API response is RFC 9457 application/problem+json. The object always includes type, title, status, detail, instance, code (machine-readable), and resolution. Codes: api_route_not_found, method_not_allowed, rate_limit_exceeded. Agents should branch on code, not on the prose.

Rate limits

120 requests per client IP per 60 seconds on /api/v1/*. Successful and error responses include IETF RateLimit / RateLimit-Policy plus the compatibility headers RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset. A 429 also sends Retry-After. Quota name: catalog.

Versioning and deprecation

Stable operations live under /api/v1. Breaking changes require a new major path (/api/v2). The current major is advertised as the API-Version: v1 response header. Deprecated operations will be announced here and with RFC 9745 Deprecation and Sunset headers at least 90 days before removal. There is no scheduled sunset for v1. See OpenAPI field x-api-lifecycle.

Contact

Bugs and agent-integration questions: [email protected] or the contact form. Consulting for teams: /consulting. Pricing: discovery call is free; see pricing.md.