Skip to main content

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 and Ubuntu 24.04 LTS. No other harness or Room backend is supported yet.

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 and Ubuntu 24.04 LTS 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
dorf setup

dorf setup inspects the host, guides supported Incus installation, downloads the immutable Codex-harness VM image attached to the Dorf release, connects an AI model provider, and proves one real disposable Worker turn before reporting ready.

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 my-worker
dorf job assign checkout-perf \
  --to my-worker \
  --goal "Make checkout feel instant and leave evidence"

Message and inspect the Worker or its Job independently:

dorf worker message my-worker "What can you help with?"
dorf worker wait my-worker
dorf worker inspect my-worker

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 my-worker

End the Job before ending its Worker. Cleanup is bound to the exact recorded resources:

dorf job end checkout-perf
dorf worker end my-worker

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("my-worker")
    receipt = dorf.message_worker(
        "my-worker",
        "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

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

dorf-0.1.1.tar.gz (139.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dorf-0.1.1-py3-none-any.whl (159.3 kB view details)

Uploaded Python 3

File details

Details for the file dorf-0.1.1.tar.gz.

File metadata

  • Download URL: dorf-0.1.1.tar.gz
  • Upload date:
  • Size: 139.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for dorf-0.1.1.tar.gz
Algorithm Hash digest
SHA256 0d4fecedfdfe6393d68f5ce75f0e6d484f77d52c181a37684783d1e8883bd6ab
MD5 01d19b4bd29fbf23c2e2bf39d5a911ab
BLAKE2b-256 c14518f11a410127f800ee084a40c5f9382cdce9a1693c4fb5d70d4e8ddedf38

See more details on using hashes here.

Provenance

The following attestation bundles were made for dorf-0.1.1.tar.gz:

Publisher: publish-python.yml on aphronio/dorf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dorf-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: dorf-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 159.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for dorf-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a42b8d205a9811c8787eb2a2dac880c935fa07aa90da861be8b623bff641ba49
MD5 aa8772d2efac18a43d2e9b5a8c6731d9
BLAKE2b-256 a2cc616eb1d678f24eead790830ae2f760a7500ad1462bf7b464270b442e2ee0

See more details on using hashes here.

Provenance

The following attestation bundles were made for dorf-0.1.1-py3-none-any.whl:

Publisher: publish-python.yml on aphronio/dorf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page