Dorf
A control plane for durable AI workers on infrastructure you control.
Dorf gives an AI worker a durable identity, an isolated Room, and an explicit Job. Start work, leave, reconnect, inspect what changed, steer it, or clean it up without treating one terminal or client process as the source of truth.
Workers do Jobs in Rooms. A Worker is the durable harness identity, a Room is its isolated execution boundary, a Job is a pinned goal with its own conversation and evidence, and an Assignment records which Worker and Room own that Job.
[!IMPORTANT] Dorf is alpha software. The current verified path is Codex in local Incus VMs on x86_64 Linux, with automatic host convergence reviewed on Arch Linux. No other harness or Room backend is supported yet. The official public Room image has not been published, so the fresh-machine
dorf setuppath is not complete in this release.
Why Dorf
- Durable work, replaceable processes. Worker and Job identity outlive a CLI invocation, controller restart, or disconnected client.
- Owned isolation. Work runs in a private VM Room instead of sharing the host Docker socket or an unbounded host shell.
- Detached by default. Admit a message once, leave, and later inspect the same Worker or Job rather than babysitting a token stream.
- Explicit lifecycle. Recovery and cleanup operate on recorded Worker, Room, Job, and Assignment identity; failures remain visible and retryable.
- A composable runtime. The control plane owns mechanisms. Applications own workflow policy, acceptance, and presentation.
The product direction is broader than the first adapter pair, but the support claim is deliberately narrow. Dorf adds another harness or Room backend only after a real implementation validates the seam. See the North Star for the destination and Runtime Surface for what exists now.
Available today
| Layer | Current support |
|---|---|
| Runtime | Durable Workers, Rooms, Jobs, Assignments, message admission, inspection, recovery, evidence, and cleanup |
| Agent harness | Codex app-server |
| Room backend | Local Incus virtual machines |
| Model access | Named ChatGPT-subscription and OpenAI API-key connections through the local Provider Gateway |
| Host setup | x86_64 Arch Linux convergence; other x86_64 Linux hosts may work with an already usable Incus installation |
| Dogfood application | Coding-to-PR, including isolated clones, repo-owned checks, review, follow-up, and PR proposal |
Multiple harnesses, alternative sandbox providers, remote Room backends, Worker pools, scheduling, and cross-Worker reassignment are direction—not current capabilities.
Install the alpha CLI
Install from PyPI with:
uv tool install dorf
dorf --version
dorf --help
Installing the CLI does not yet provide the complete fresh-machine Worker path described in the North Star. Until the official Room image is published, use Dorf on a configured development host or explore the runtime and CLI surfaces without provisioning a Worker.
To work from source:
git clone https://github.com/aphronio/dorf.git
cd dorf
uv sync --all-groups
uv run pytest
uv run ruff check .
uv run dorf --help
Core loop
On a configured host, create a Worker and assign a Job with a complete goal:
dorf worker spawn ada
dorf job assign checkout-perf \
--to ada \
--goal "Make checkout feel instant and leave evidence"
Message and inspect the Worker or its Job independently:
dorf worker message ada "What can you help with?"
dorf worker wait ada
dorf worker inspect ada
dorf job message checkout-perf "Profile the API first"
dorf job wait checkout-perf
dorf job inspect checkout-perf
dorf job inspect checkout-perf --timeline
dorf job inspect checkout-perf --evidence
Enter the current Room when direct takeover is useful:
dorf worker attach ada
End the Job before ending its Worker. Cleanup is bound to the exact recorded resources:
dorf job end checkout-perf
dorf worker end ada
The same authority is available in process through the typed Python facade:
from dorf import Dorf
with Dorf.open() as dorf:
inspection = dorf.inspect_worker("ada")
receipt = dorf.message_worker(
"ada",
"Profile the API first",
action_id="caller-stable-action-id",
)
Run dorf worker --help and dorf job --help for the complete current command surface.
Coding-to-PR showcase
Coding-to-PR is Dorf's current dogfood application, not the runtime's identity. One coding task composes one goal-backed Job, Assignment, isolated clone, branch, and PR proposal:
dorf start "Implement the task" --provider-connection personal-chatgpt
dorf status JOB
dorf verify JOB
dorf publish JOB
dorf complete JOB
Repositories declare deterministic setup, check, smoke, and review commands in .dorf.toml. Git
and GitHub remain authoritative for branches, commits, and PR state; the harness remains
authoritative for its native conversation history.
Architecture boundary
dorf.runtime portable Worker, Room, Job, and Assignment mechanisms
dorf.sdk in-process facade used by the CLI and host applications
dorf.adapters current Codex and Incus integrations
dorf.workflows coding-to-PR policy composed over the runtime
Runtime code does not import coding, GitHub, Incus, or Codex policy. Remote Rooms remain an adapter concern; Dorf does not need to become a hosted service merely because an adapter controls remote infrastructure.
Documentation
- North Star — approved product direction
- Principles — product and engineering judgment
- Runtime Surface — current portable boundary
- Decision Log — accepted choices and reconsideration triggers
- Provider Gateway — model connection and scoped route boundary
- Setup support — current host support and diagnostics
- Contributing — development workflow and DCO sign-off
- Security policy — private vulnerability reporting
Dorf is licensed under the
Apache License 2.0. The runtime and Python SDK
remain experimental and do not yet carry a third-party compatibility promise. Material under
docs/research/ is archival and non-normative.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dorf-0.1.0.tar.gz.
File metadata
- Download URL: dorf-0.1.0.tar.gz
- Upload date:
- Size: 136.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6a424f4297984c70e01005ba4a16946d30426627ba1d780f72a2a0b61ec18a42
|
|
| MD5 |
54cbaaeeced17a0b4c73a6501370854e
|
|
| BLAKE2b-256 |
20d9887d1dc00696ed420a38be146c7e5ecc68edf17287a6c9995bf1ad52f4e4
|
Provenance
The following attestation bundles were made for dorf-0.1.0.tar.gz:
Publisher:
publish-python.yml on aphronio/dorf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dorf-0.1.0.tar.gz -
Subject digest:
6a424f4297984c70e01005ba4a16946d30426627ba1d780f72a2a0b61ec18a42 - Sigstore transparency entry: 2337330376
- Sigstore integration time:
-
Permalink:
aphronio/dorf@b2d97489588f247226464a16a733c5cfba78565b -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/aphronio
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-python.yml@b2d97489588f247226464a16a733c5cfba78565b -
Trigger Event:
release
-
Statement type:
File details
Details for the file dorf-0.1.0-py3-none-any.whl.
File metadata
- Download URL: dorf-0.1.0-py3-none-any.whl
- Upload date:
- Size: 157.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ff32fa02874808c282c55a22a0d8dcad967281b4be10c3d1ed2bea2d10b9ce01
|
|
| MD5 |
76a2db3ddca4f6fc08b1563614db956d
|
|
| BLAKE2b-256 |
12c7d7fd889f15fdd4a06d27429482dcce775eaf8b5164c46ba3aebf80973d12
|
Provenance
The following attestation bundles were made for dorf-0.1.0-py3-none-any.whl:
Publisher:
publish-python.yml on aphronio/dorf
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dorf-0.1.0-py3-none-any.whl -
Subject digest:
ff32fa02874808c282c55a22a0d8dcad967281b4be10c3d1ed2bea2d10b9ce01 - Sigstore transparency entry: 2337330395
- Sigstore integration time:
-
Permalink:
aphronio/dorf@b2d97489588f247226464a16a733c5cfba78565b -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/aphronio
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-python.yml@b2d97489588f247226464a16a733c5cfba78565b -
Trigger Event:
release
-
Statement type: