Quickstart

From zero to a signed contract

Pick a side. Both paths assume you already have an AT Protocol identity — a DID and a PDS that will hold your records. The fastest way is with the CLI tools — request-vm-ssh for the requester side and hono-bidder for the provider side — each automates the full flow in one process.

Don't want to run a PDS and watch the firehose yourself? The Gateway service does steps 1–4 behind one XRPC call. See the gateway →
Automated path (recommended)

Run the requester CLI

One command provisions the machine, collects bids, signs the accept, waits for SSH readiness, and drops you into a shell — everything steps 1-4 below, automated.

$ deno run -A jsr:@publicdomainrelay/request-vm-ssh \
    --bid-window-sec 60 \
    --vm-ready-timeout-sec 300

# Or with OAuth (Bluesky handle login):
$ deno run -A jsr:@publicdomainrelay/request-vm-ssh \
    --atproto-oauth \
    --atproto-handle user.bsky.social \
    --bid-window-sec 60

# Or QR-based OAuth (headless, scan with phone):
$ deno run -A jsr:@publicdomainrelay/request-vm-ssh \
    --atproto-oauth-qr \
    --bid-window-sec 60
Options: --bid-window-sec (default 30), --vm-ready-timeout-sec (default 300), --keep-vm (skip cleanup), --exec (run program instead of shell), --user-data (custom cloud-init), --policy-mode only-me|mutuals|tangled-vouch|dynamic, --bidder-dids (allowlist), --deny-bidder-dids (blocklist), --relay-url. Config: CONFIG_PATH_REQUEST_VM_SSH env or config.json.
Step 1 (manual)

Describe the machine

Write a compute.vm record — cpus, mem, disk, network, a role and, if you need it, cloud-init user data.

$ atproto record create \
    --collection com.publicdomainrelay.temp.compute.vm \
    --record vm.yaml

cpus: 2
mem: 4G
disk: 40G
role: ml-inference-worker
Step 2 (manual)

Publish the RFP

Wrap a strong reference to the VM record in a market.rfp and publish it. The firehose carries it to every provider watching.

$ atproto record create \
    --collection com.publicdomainrelay.temp.market.rfp \
    --record rfp.yaml

payload:
  uri: at://did:plc:you/compute.vm/3mm3d
  cid: bafyrei...vm
Step 3 (manual)

Wait, score, accept

Let the bid window run, apply your policy (lowest cost by default), then sign a market.accept and call the winning provider's endpoint.

$ atproto record create \
    --collection com.publicdomainrelay.temp.market.accept \
    --record accept.yaml

$ curl -X POST https://bob.example/xrpc/submitAccept \
    -d @accept.yaml
Step 4 (manual)

Get your receipt

The provider provisions the machine and mints a market.receipt anchoring the whole chain. That's your proof of settlement.

Verify any receipt yourself — check the NSID, the author DID, and that the CIDs bind straight through.

Need the field-by-field detail?

Every record type and validation rule is written up in the docs.

Read the docs