by YV17labs
Give any AI agent a full desktop — it sees the screen, clicks, types, and runs apps like a human. Automate anything with a UI: browsers, legacy software, internal tools. No API needed. One Docker command.
# Add to your Claude Code skills
git clone https://github.com/YV17labs/GhostDeskLast scanned: 5/30/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-05-30T16:34:34.602Z",
"npmAuditRan": true,
"pipAuditRan": true
}See how GhostDesk compares with popular alternatives.
GhostDesk is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by YV17labs. Give any AI agent a full desktop — it sees the screen, clicks, types, and runs apps like a human. Automate anything with a UI: browsers, legacy software, internal tools. No API needed. One Docker command. It has 153 GitHub stars.
Yes. GhostDesk passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/YV17labs/GhostDesk" and add it to your Claude Code skills directory (see the Installation section above).
GhostDesk is primarily written in Rust. It is open-source under YV17labs on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh GhostDesk against similar tools.
No comments yet. Be the first to share your thoughts!
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
One binary, one MCP endpoint, three desktops. The tool surface is the same
everywhere — an agent calls mouse_click and app_launch without knowing
which desktop it is on.
| Linux | macOS | Windows | |
|---|---|---|---|
| How it runs | the Docker container, in one command | a native binary | a native binary |
| The desktop it drives | a virtual one, shipped inside the image | the Mac in front of you | the PC in front of you |
| Sandboxed | yes — disposable, one per agent | no | no |
| Driven through | zwlr_virtual_pointer_v1, Sway IPC, grim |
Quartz Event Services, Accessibility, screencapture |
SendInput, GDI, EnumWindows |
Linux is the server. The container is the deployment this README shows unless it says otherwise, and the only one of the three with a sandbox around it. macOS and Windows run the very same server against a real desk — no container, and therefore no isolation. Jump to macOS or Windows, or read what differs between the three.
One command, plain HTTP, no password. Fine for kicking the tires on a laptop you trust — not fit for anything beyond that. Ready to harden it? Jump to Secure local run.
docker run -d --name ghostdesk-demo \
--shm-size 2g \
-p 3000:3000 \
-p 6080:6080 \
ghcr.io/yv17labs/ghostdesk:latest
The latest image ships with Firefox, the foot terminal, mousepad
(text editor), galculator, and passwordless sudo for the agent user —
enough to demo a browsing + note-taking workflow out of the box. Need a
different app set? Build your own on top of base — see Custom
image.
The container boots in the dev posture: plain HTTP on both ports, every auth gate disarmed on purpose. You'll see warnings in the logs reminding you of that — they go away once you follow the secured path below.
GhostDesk speaks MCP over the Streamable
HTTP transport — any MCP-compatible client can drive it. Point the one you
already work from at http://localhost:3000/mcp: no headers, no auth, that is
the whole demo posture.
Claude Code / Claude Desktop
{
"mcpServers": {
"ghostdesk": {
"type": "http",
"url": "http://localhost:3000/mcp"
}
}
}
Hermes Agent, OpenCode, or whatever you already drive your agents with — same URL, and it works very well.
SpecterChat — the chat client
we build for this, open source. Most chat UIs drop the image an MCP tool
returns — they render it or they forward it to the model, rarely both — and a
screen_shot() the model never sees is the whole product missing. SpecterChat
displays it inline and sends it back as base64. It talks to any
OpenAI-compatible endpoint (llama.cpp, vLLM, Ollama, LM Studio), so it takes
either side of the next step; macOS, Linux and Windows builds are on its
releases page.
The client is settled; the model behind it is a choice, and neither answer is mandatory.
In the cloud — Claude, GPT, Gemini and the other frontier models drive GhostDesk out of the box: no header, nothing to install, the key your client already holds. If that is you, the setup is done — go to step 4.
On your machine — Ollama is the recommended path: one installer, one model to pull, nothing to build and nothing to tune. Windows, macOS or Linux. No API bill, and no screenshot of your desktop leaving your network.
Install Ollama from ollama.com/download — the official app, downloaded like any other. Once installed it runs in the background, so there is no server to start.
Pull the model. In a terminal:
ollama pull qwen3.8:27b
On Apple Silicon, pull
qwen3.8:27b-mlx instead.
Point your client at it. Endpoint http://localhost:11434/v1, the tag
you pulled as the model name, and the GhostDesk-Model-Space: 1000 header
on every MCP request — the Qwen family needs it, and the JSON for it is
under Coordinate space.
That is the whole setup. qwen3.8:27b
is the default because it is the strongest — best reasoning, best capability,
and on desktop control a step the agent gets wrong costs more than the tokens
it saves. When speed is what you need,
qwen3.6:35b (on Apple Silicon,
qwen3.6:35b-mlx) is the fast
one: 35B parameters with only 3B active per token
(Qwen3.6-35B-A3B), so tokens
per second is what you feel. All four tags are tested with GhostDesk, and the
verdict is the same on every backend on this page. Want the flags in your own
hands? That is Your own inference
server.
Open http://localhost:6080/ in your browser to see the virtual desktop in
real time. No password prompt — the dev posture skips it.
| Service | URL |
|---|---|
| MCP server | http://localhost:3000/mcp |
| noVNC (browser) | http://localhost:6080/ |
| Health probes | http://localhost:3000/health/{live,ready,startup} |
The probes are what the container's HEALTHCHECK reads, and they answer about
the desktop rather than about the processes: ready goes down when the
compositor stops answering the window seam, live when the connection behind
the virtual pointer and keyboard is gone — a state in which every tool still
replies and none of them does anything.
Give your agent a first prompt to confirm the wiring is right:
"Take a screenshot of the desktop, list the installed applications, then open Firefox and go to wikipedia.org."
You should see Firefox launch in the noVNC tab, the URL bar fill in, and the page load — all under your agent's control.
docker stop ghostdesk-demo && docker rm ghostdesk-demo
The demo run creates no named volume, so this leaves nothing behind.
Fourteen tools, named verb_noun, and this is the whole surface — no hidden
endpoint, no second protocol. Defaults are in parentheses, ? marks an
optional parameter, and every coordinate is a pixel offset in the last
screen_shot() — measured from that capture's own corner, so a capture taken
with a region is answered in coordinates that only mean anything when the
same region travels to the act using them. The moment the screen changes,
coordinates computed from the previous capture are stale.
| Tool | Parameters | Returns |
|---|---|---|
screen_shot |
region? — {x, y, width, height}, cropped at native resolution · format "webp" | "png" (webp) · stabilize bool (true) — wait up to 5 s for the screen to settle · quality 1–100 (50, WebP only; raise it for fine fonts or design surfaces) |
one image block — {"type": "image", "data": "<base64>", "mimeType": "image/webp"}. A region capture is preceded by a text |