Skip to content

Getting Started, Plain Version

Plain track. Full technical steps: docs/technical/getting-started.md.

What you need

  • A Windows PC with the .NET 10 SDK installed.
  • Git.
  • Whichever AI CLI tools you actually plan to dispatch jobs to (Claude, Codex, etc.) — you don't need all of them, just the ones you'll use.

The one-time setup

  1. Make a key. Run fleet-dispatch init-key once. This makes a secret file that every job gets signed with. It prints a reminder: copy this file to every other house PC by hand (over SSH), and never let it touch OneDrive — OneDrive is where the jobs travel, and the key must stay somewhere more private than that.
  2. Start the listener. On each PC, fleet-dispatch serve starts the whole thing: it listens for direct jobs, drains the OneDrive queue, watches whether you're gaming or streaming, and scans this PC's repos once a day. For a PC that should always be listening, this gets installed as a Scheduled Task (not a Windows Service — a full walkthrough is in the technical README).

Sending a job

# "Whenever you get to it" — works even if the target PC is off right now:
fleet-dispatch enqueue --targets ANDYGREATROOMPC --kind pwsh --lane WT-0001 --payload "Get-Process pwsh"

# "Right now, wait for the answer" — target PC must be on:
fleet-dispatch send --target ANDYGREATROOMPC --kind claude --lane WT-0001 --payload-file job.md --wait

Every job needs a --lane label (a short tag for what work this belongs to) — it's required, not optional. --targets all sends to every known house PC.

Checking results

fleet-dispatch results --target ANDYGREATROOMPC
fleet-dispatch status

What "it didn't run" usually means

  • Rejected — the signature didn't check out, or the job looked tampered with, or it was a repeat of something already run. Check the reason file next to the rejected job.
  • Deferred — the target PC's usage budget is in a red/critical state and this job wasn't marked urgent.
  • Unavailable / requeued — the target PC is being used for gaming or streaming right now, and this job was heavy enough to be politely told to wait. It'll try again automatically.

None of these are errors in the usual sense — they're the system doing exactly what it's supposed to: protecting a PC that's busy with something else, or a queue that's already been served.