Harner
A coding harness as a service. Submit a task over HTTP and get a sandbox with a full Linux toolchain that writes code, installs packages, runs commands and researches the web — then stream its progress, answer its questions, and collect its files.
It is built for agents. A LangGraph or Google ADK agent calls Harner on a user's behalf, follows the work as it happens, answers anything the harness needs to ask, and keeps going across many turns.
API
https://api.harner.dev
Every endpoint takes a bearer token except /v1/health, which is open
so probes can use it.
curl -s -X POST https://api.harner.dev/v1/tasks \
-H "Authorization: Bearer $HARNER_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"prompt":"write a python script that prints the first 10 primes and run it"}'
Or from Python, where the client handles the whole conversation — including the case where the harness stops to ask something:
from harner_client import HarnerClient
harner = HarnerClient("https://api.harner.dev", KEY)
result = harner.run(
"scaffold a fastapi app; ask before picking a database",
on_question=lambda q: "postgres", # your agent decides here
)
print(result.text)
How it works
- Each task gets its own container: Node, Python, git, build tools, and the Pi coding agent.
- Every event the agent emits is numbered and written to disk before anyone sees it, so a dropped WebSocket, a restarted gateway and a slow client are all the same recoverable situation — reconnect with a cursor and replay.
- Results outlive their sandbox: the text, the returned files and the transcript of what the agent actually did are kept after the container is gone.
- Sandboxes are isolated from each other — each on its own network, with raw sockets denied and resource limits applied.
Status
The service reports its own health at api.harner.dev/v1/health, and the full OpenAPI schema is at /openapi.json.