---
title: "Daniel Farina developer portal · Daniel Farina"
description: "Agent harnesses, evals, and the layer around the model."
canonical: https://danielfarina.com/developers/
last-updated: "2026-08-30"
---

# Daniel Farina developer portal · Daniel Farina

Source: https://danielfarina.com/developers/

# Developer portal

I build the layer around the model — sandbox, tools, evals, control plane — and publish what actually breaks.

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

 - [OpenAPI 3.1](https://danielfarina.com/openapi.json) — machine-readable description of /api/v1
 - [RFC 9727 API catalog](https://danielfarina.com/.well-known/api-catalog)
 - [llms.txt](https://danielfarina.com/llms.txt) — when to use this site, plus links
 - [llms-full.txt](https://danielfarina.com/llms-full.txt) — longer dump of essays and work
 - [sitemap.xml](https://danielfarina.com/sitemap.xml) · [RSS](https://danielfarina.com/rss.xml)
 - Pages speak Markdown: send Accept: text/markdown. Responses set Content-Type: text/markdown; charset=utf-8 and Vary: Accept, Accept-Encoding. Unsupported types get 406.

## REST API

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

 - [GET /api/v1/site](https://danielfarina.com/api/v1/site) — identity, CLI, index URLs
 - [GET /api/v1/work](https://danielfarina.com/api/v1/work) — selected work
 - [GET /api/v1/posts](https://danielfarina.com/api/v1/posts) — writing index

## Official CLI

Package name `danielfarina`. Source: [github.com/daniel-farina/danielfarina](https://github.com/daniel-farina/danielfarina). Homebrew tap: [daniel-farina/homebrew-tap](https://github.com/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: [elchileno@gmail.com](mailto:elchileno@gmail.com) or the [contact form](https://danielfarina.com/contact). Consulting for teams: [/consulting](https://danielfarina.com/consulting). Pricing: discovery call is free; see [pricing.md](https://danielfarina.com/pricing.md).
