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.
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
--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.
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
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
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
Get your receipt
The provider provisions the machine and mints a market.receipt anchoring the whole chain. That's your proof of settlement.