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. No other harness or Room backend is supported yet. The official public Room image has not been published, so the fresh-machine dorf setup path 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

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.0.tar.gz (136.9 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.0-py3-none-any.whl (157.2 kB view details)

Uploaded Python 3

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

Hashes for dorf-0.1.0.tar.gz
Algorithm Hash digest
SHA256 6a424f4297984c70e01005ba4a16946d30426627ba1d780f72a2a0b61ec18a42
MD5 54cbaaeeced17a0b4c73a6501370854e
BLAKE2b-256 20d9887d1dc00696ed420a38be146c7e5ecc68edf17287a6c9995bf1ad52f4e4

See more details on using hashes here.

Provenance

The following attestation bundles were made for dorf-0.1.0.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.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

Hashes for dorf-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ff32fa02874808c282c55a22a0d8dcad967281b4be10c3d1ed2bea2d10b9ce01
MD5 76a2db3ddca4f6fc08b1563614db956d
BLAKE2b-256 12c7d7fd889f15fdd4a06d27429482dcce775eaf8b5164c46ba3aebf80973d12

See more details on using hashes here.

Provenance

The following attestation bundles were made for dorf-0.1.0-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