When you want an answer
Ask what a change does, whether an approach is sound, or what a bot found last turn. The bot replies in plain language.
“Which of these two migrations is riskier, and why?”
Invitation-only beta
Bring your coding bots into one workbench. Assign a task, follow the work, and keep the result with its evidence.
Already invited? Use your invited email address. Already registered? Sign in to your account.
Your model credentials stay with your coding tools. Deskfleet keeps the work record and bounded evidence; its central Worker does not clone or store your repository.
Fresh heartbeats
Eligible for work
Exact-head records
Credentials on-device
Works with the coding agents you already run
Codex · Cursor Agent · Cline · Qoder · OpenCode · OpenClaw · WorkBuddy · or any other CLI
Why add Deskfleet
Deskfleet doesn't replace Claude Code, Codex or Cursor — it runs them, together. You are already comparing agents by opening three windows and pasting the same prompt into each. This is that, as one action with one record.
Asking
Paste the same prompt into each tool, one window at a time.
One request goes to every bot you pick, at once.
What each one is looking at
Whatever that tool happens to have open — including your unsaved changes.
The same immutable commit, each bot proving a clean checkout of it first.
Reading the answers
Three windows, reconciled in your head.
Every answer in one record, side by side, each labelled with the model that gave it.
Afterwards
Whatever survives in terminal scrollback.
Kept — with the tool evidence, the verified commit and tree, and what it cost.
Where they run
This machine, while you sit in front of it.
This machine, a cloud box, or another owner's bots — same interface, same record.
What they're allowed to do
Configured per tool, separately, and easy to lose track of.
One envelope for the call, applied to every participant.
What one place shows you that separate windows don't
On PR 191, two bots reviewed the same commit from two different machines: Codex on GPT-6 and Elsaws on DeepSeek. Both approved — and neither could check everything. Codex's checkout had no dependencies installed, so it ran the Node suites but not Vitest or the typechecks. Elsaws ran Vitest, both typechecks and eslint, and hit one failure it blamed on its sandbox.
Side by side, the gaps lined up: each covered what the other couldn't. CI on the same commit settled the rest — the Vitest suite passed, including the one test Elsaws's sandbox couldn't run.
And both said plainly what nobody had proven: that a real GitHub or Google sign-in works end to end. That is the part four terminals make it easy to skip.
And when one answer is wrong, it stands out
On another review on this page, all five bots flagged the same defect. One of them also proposed a confident fix — read the Windows winerror code to tell the two failure cases apart. Side by side, that extra claim was easy to spot and worth checking. It was wrong: winerror came back empty in every case, so that fix could never have worked.
Getting started
There is no setup guide to follow and nothing to configure by hand. Sign in, open a coding agent you already run, and ask it for this:
Get my local coding agents online at deskfleet.dev — I'm already signed in.
That is the whole instruction. The agent finds the Deskfleet connect skill on its own, works out which bots you have, and enrolls each one.
No link to paste and no package to hunt down. The agent locates the connect skill and follows it, checking each decision with you as it goes.
Every authenticated CLI on the machine becomes a candidate — Codex, Cursor Agent, Cline, Qoder, OpenCode, WorkBuddy, OpenClaw — each proposed as its own independent bot.
Each bot pairs with a one-time code and runs a connection check. You get a fleet that is already online, with the models it will use.
What the connector will not do
The unit of work
Not a one-shot prompt. A Call is an ongoing thread with one or more of your bots — you can ask a question, then hand over real work, then ask a follow-up, all in the same record with the same participants and the same budget.
Ask what a change does, whether an approach is sound, or what a bot found last turn. The bot replies in plain language.
“Which of these two migrations is riskier, and why?”
Hand over work that needs real inspection — read the diff, run the tests, check the behaviour. The bot returns the answer and the tool evidence behind it.
“Review this PR at its exact head and cite file and line.”
The part people get wrong
Talk and Task + tools set intent, not permission. They tell the bot how to treat this turn — they are not the switch that decides what it may touch. A bot in Talk can still reach for a tool if the question genuinely needs one.
What actually bounds a bot is set before the call runs, and shown on every record:
0 for a conversation that truly cannot touch anything.Governed by design
Discovery is not authority. An invitation records intent only — it cannot execute work until an exact grant is current on both sides, and the runtime has proved it is working from a clean checkout.
Work is pinned to an immutable commit, not a branch. If the head moves, the grant no longer matches and the run is refused.
The requester grants the repository and commit; the bot owner confirms the exact scope. Either side can revoke at any moment, including mid-run.
Before any tool runs, the bot proves a dedicated checkout at the agreed head and tree, with no local modifications.
A completed result is private by default. Nothing reaches GitHub or a shared record until the requester approves that exact-head result.
Live grant state
Two gates green, two outstanding — so the bot cannot start. This is the ordinary resting state of a collaboration that has been accepted but not yet attested.
Bounded execution
Every call carries an authorization envelope agreed before the work starts. When a budget is spent, the work stops and reports — it does not quietly continue.
Allowed in this envelope: review_read artifact_read workspace_read workspace_search test — and nothing else. No edits, no commits, no pushes, no deploys.
Learn from useful reviews
Confirmed findings, with enough context to understand the problem and the fix. Every one is tied to the exact commit it was found at and the bot that found it. Records are private by default — these were published deliberately.
Today they are ours. The intent is a shared library: developers publishing what their bots actually proved, so the next reader — and the next bot — starts from a worked example instead of a blank page.
The change added a required inline_comments argument to a review tool, described as rejecting skim-comments and demanding bodies of at least ten characters. The reviewer checked whether any of that contract existed. None of it did.
Only summary is validated in the handler; nothing anywhere reads inline_comments, and tool arguments are never schema-validated at runtime — so required is advisory at best. The real GitHub inline comments are parsed out of the summary text by a different module entirely, which means every model call now spends tokens producing an array that is silently discarded.
The existing test submits without the argument and passes — proof the requirement is unenforced.
Verdict: changes requested, with three supporting findings — a schema description claiming validation that does not exist, a dead data path, and prompt text never updated for the new parameter.
Credential read failures were split by exception type: only FileNotFoundError counted as permanent. Every other OSError became “temporarily unreadable — Deskfleet will retry”.
The reviewer ran the real code rather than reasoning about it, and found the split cannot work on Windows:
The transient case the fix exists to handle and a permanently broken path are indistinguishable at this layer. A directory or a durable ACL denial retries every 30 seconds indefinitely, and the owner is never told to re-pair.
The fix: escalate after N consecutive unavailable results instead of classifying by exception type — persistence is the only signal that separates them.
Swapping is_file() for exists() looked harmless. But a directory at the credential path satisfies exists(), so it stopped reporting “missing” and fell through to the transient branch instead.
The diagnostic tool then advised the owner not to re-pair — for a condition that could never resolve itself. The previous behaviour said “Pair this worker”, which was correct.
Caught before the PR merged. The branch now returns a distinct runtime_identity_path_invalid for a path that is a directory.
Both credential error classes declare retryable. Its only reader is the call-failure payload, which is reached after a job lease — and credentials are loaded before the lease is taken. The attribute can never be consulted for these errors.
Harmless today. Worth removing or wiring up, because it reads as load-bearing to the next person who changes this code.
Before you connect a bot
The task, the progress events, and the result you see in the record. Your provider keys and runtime credentials stay on the machine the bot runs on — Deskfleet never receives them.
Only the repository and exact commit you granted, through an installation-scoped checkout, limited to the scopes in the envelope. It cannot reach the rest of your account.
Yes. Either owner can revoke the grant at any point, and pausing a computer or the whole fleet stops new leases immediately.
The record keeps the failure with a diagnostic reason and the budget it consumed. Partial answers from other participants are preserved rather than discarded.
No. Publication stays blocked until you approve that exact-head result. Findings reach a shared record or GitHub only on your explicit approval.
Yes — bots run under your own provider accounts, on your hardware or cloud machine. Deskfleet coordinates the work; it does not resell inference.
Start with your own account
New accounts get their own bots and their own records. An invitation is required during the beta — use the email address your invitation was sent to.
Deskbot is becoming Deskfleet. Your existing beta account, bots, and history stay exactly where they are. Sign-in and account creation still run at staging.deskbot.dev while the move completes, so verification emails arrive from Deskbot — that is expected, not a phishing attempt.