+ Commands - grouped reads, waits, actions, selectors,
+ and global flags
+
+
+ Architecture - client/daemon model, sessions, sockets,
+ and support boundary
+
+
+ Runtime contract - stable JSON fields, errors,
+ and best-effort text behavior
+
Links
+
+ The repo is the source of truth for the CLI, the skill, and the release
+ assets.
+
+
GitHub
diff --git a/site/src/pages/installation.mdx b/site/src/pages/installation.mdx
index ed4e737..2f13ac3 100644
--- a/site/src/pages/installation.mdx
+++ b/site/src/pages/installation.mdx
@@ -6,19 +6,38 @@ toc: true
# Installation
-## Default install
+Install the public `deskctl` command first, then validate the desktop runtime
+with `deskctl doctor` before trying to automate anything.
+
+## Recommended path
```sh
npm install -g deskctl
+deskctl doctor
```
`deskctl` is the default install path. It installs the command by
downloading the matching GitHub Release asset for the supported runtime target.
-The repo skill lives under `skills/deskctl`, so `skills` can install it
-directly from this GitHub repo. It is designed around the same observe -> wait
--> act -> verify loop as the CLI. `-g` installs it globally; omit that flag if
-you want a project-local install.
+This path does not require a Rust toolchain. The installed command is always
+`deskctl`, even though the release asset itself is target-specific.
+
+## Quick try without a global install
+
+```sh
+npx deskctl --help
+```
+
+This is useful when you only need a temporary run or want to smoke-test a
+machine before deciding how to install it permanently.
+
+## What the npm install does
+
+- downloads the matching GitHub Release asset for the current supported target
+- exposes the public command as `deskctl`
+- keeps the install path operator-friendly: no source build, no manual rename
+
+Today the npm distribution is aimed at Linux x64 X11 environments.
## Other install paths
@@ -43,6 +62,17 @@ Source builds on Linux require:
- `pkg-config`
- X11 development libraries such as `libx11-dev` and `libxtst-dev`
+## Skill install
+
+The repo skill lives under `skills/deskctl`, so `skills` can install it
+directly from this GitHub repo. It is designed around the same observe -> wait
+-> act -> verify loop as the CLI. `-g` installs it globally; omit that flag if
+you want a project-local install.
+
+```sh
+npx skills add harivansh-afk/deskctl -s deskctl
+```
+
## Runtime requirements
- Linux with an active X11 session
@@ -53,8 +83,13 @@ Source builds on Linux require:
The binary itself only depends on the standard Linux glibc runtime.
-If setup fails, run:
+## First troubleshooting step
+
+If setup fails, start here:
```sh
deskctl doctor
```
+
+`doctor` checks X11 connectivity, window enumeration, screenshot viability, and
+daemon/socket health before normal command execution.
diff --git a/site/src/pages/quick-start.mdx b/site/src/pages/quick-start.mdx
index 10f3ec0..ac51600 100644
--- a/site/src/pages/quick-start.mdx
+++ b/site/src/pages/quick-start.mdx
@@ -6,7 +6,10 @@ toc: true
# Quick start
-## Install and diagnose
+The fastest way to use `deskctl` is to follow the same four-step loop every
+time: observe, wait, act, verify.
+
+## 1. Install and diagnose
```sh
npm install -g deskctl
@@ -16,7 +19,7 @@ deskctl doctor
Use `deskctl doctor` first. It checks X11 connectivity, basic enumeration,
screenshot viability, and socket health before you start driving the desktop.
-## Observe
+## 2. Observe the desktop
```sh
deskctl snapshot --annotate
@@ -29,7 +32,7 @@ Use `snapshot` when you want a screenshot artifact plus window refs. Use
`list-windows` when you only need the current window tree without writing a
screenshot.
-## Target windows cleanly
+## 3. Pick selectors that stay readable
Prefer explicit selectors when you need deterministic targeting:
@@ -44,7 +47,7 @@ focused
Legacy refs such as `@w1` still work after `snapshot` or `list-windows`. Bare
strings like `firefox` are fuzzy matches and now fail on ambiguity.
-## Wait, act, verify
+## 4. Wait, act, verify
The core loop is:
@@ -69,7 +72,7 @@ deskctl snapshot
The wait commands return the matched window payload on success, so they compose
cleanly into the next action.
-## Use `--json` when parsing matters
+## 5. Use `--json` when parsing matters
Every command supports `--json` and uses the same top-level envelope:
diff --git a/site/src/pages/runtime-contract.mdx b/site/src/pages/runtime-contract.mdx
index 4fca14c..e33e999 100644
--- a/site/src/pages/runtime-contract.mdx
+++ b/site/src/pages/runtime-contract.mdx
@@ -11,7 +11,7 @@ This page defines the current public output contract for `deskctl`.
It is intentionally scoped to the current Linux X11 runtime surface. It does
not promise stability for future Wayland or window-manager-specific features.
-## JSON envelope
+## Stable top-level envelope
Every command supports `--json` and uses the same top-level envelope:
@@ -32,7 +32,7 @@ Stable top-level fields:
If `success` is `false`, the command exits non-zero in both text mode and JSON
mode.
-## Stable window fields
+## Stable window payload
Whenever a response includes a window payload, these fields are stable:
diff --git a/site/src/styles/base.css b/site/src/styles/base.css
index cd569a9..74aa728 100644
--- a/site/src/styles/base.css
+++ b/site/src/styles/base.css
@@ -224,34 +224,88 @@ hr {
}
}
-nav {
+.breadcrumbs {
max-width: 50rem;
margin: 0 auto;
padding: 1.5rem clamp(1.25rem, 5vw, 3rem) 0;
font-size: 0.9rem;
}
-nav a {
+.breadcrumbs a {
color: inherit;
text-decoration: none;
opacity: 0.6;
transition: opacity 0.15s;
}
-nav a:hover {
+.breadcrumbs a:hover {
opacity: 1;
}
-nav .title {
+.breadcrumbs .title {
font-weight: 500;
opacity: 1;
}
-nav .sep {
+.breadcrumbs .sep {
opacity: 0.3;
margin: 0 0.5em;
}
+.docs-nav {
+ max-width: 50rem;
+ margin: 0 auto;
+ padding: 1rem clamp(1.25rem, 5vw, 3rem) 0;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 1rem 1.5rem;
+ font-size: 0.92rem;
+}
+
+.docs-nav-section {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 0.5rem 0.75rem;
+}
+
+.docs-nav-title {
+ opacity: 0.45;
+ font-size: 0.82rem;
+ text-transform: uppercase;
+ letter-spacing: 0.06em;
+}
+
+.docs-nav-links {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+}
+
+.docs-nav-link {
+ color: inherit;
+ text-decoration: none;
+ padding: 0.2rem 0.5rem;
+ border-radius: 999px;
+ opacity: 0.68;
+ transition:
+ opacity 0.15s,
+ background 0.15s;
+}
+
+.docs-nav-link:hover,
+.docs-nav-link.active {
+ opacity: 1;
+ background: #ebebeb;
+}
+
+@media (prefers-color-scheme: dark) {
+ .docs-nav-link:hover,
+ .docs-nav-link.active {
+ background: #222222;
+ }
+}
+
.toc-nav {
position: fixed;
top: 6.5rem;