whipdesk 0.0.8 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +193 -0
- package/dist/agent.cjs +8220 -6587
- package/dist/mobile-web/assets/index-C1gDHBib.css +1 -0
- package/dist/mobile-web/assets/index-YSgNjLfG.js +2 -0
- package/dist/mobile-web/assets/index.esm-B3ZTr43m.js +1 -0
- package/dist/mobile-web/assets/index.esm-BgjPHsdM.js +1 -0
- package/dist/mobile-web/assets/index.esm-CmSagqpw.js +1 -0
- package/dist/mobile-web/assets/index.esm-Di8jSGaG.js +4 -0
- package/dist/mobile-web/assets/index.esm-mXKu2C3o.js +1 -0
- package/dist/mobile-web/assets/index.esm-wogdVWd2.js +30 -0
- package/dist/mobile-web/index.html +2 -2
- package/package.json +11 -10
- package/dist/mobile-web/assets/index-7VFGQkgi.css +0 -1
- package/dist/mobile-web/assets/index-ChOsBFZF.js +0 -2
- package/dist/mobile-web/assets/index.esm-B3nnhxdY.js +0 -1144
- package/dist/mobile-web/assets/index.esm-C6Dwpirr.js +0 -16
- package/dist/mobile-web/assets/index.esm-DOt1fDqh.js +0 -1636
- package/dist/mobile-web/assets/index.esm-DYB-Ijb5.js +0 -2287
- package/dist/mobile-web/assets/index.esm-ES8aBvqn.js +0 -599
- package/dist/mobile-web/assets/index.esm2017-B0pGzpCg.js +0 -481
package/README.md
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# WhipDesk
|
|
2
|
+
|
|
3
|
+
> Control your desktop — and the AI coding agents running on it — from any phone browser.
|
|
4
|
+
|
|
5
|
+
[](https://github.com/BinaryBananaLLC/WhipDesk/actions/workflows/ci.yml)
|
|
6
|
+
[](https://github.com/BinaryBananaLLC/WhipDesk/releases/latest)
|
|
7
|
+
[](https://scorecard.dev/viewer/?uri=github.com/BinaryBananaLLC/WhipDesk)
|
|
8
|
+
[](https://github.com/BinaryBananaLLC/WhipDesk/blob/main/LICENSE)
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
WhipDesk turns any mobile browser into a remote control for your dev machine. See the screen,
|
|
12
|
+
move the mouse, type, paste prompts into your AI tools, and get a push notification the moment a
|
|
13
|
+
long-running build or agent job finishes — no app store install, no kernel extension, no agent
|
|
14
|
+
running on your phone.
|
|
15
|
+
|
|
16
|
+
Because it's **screen-level**, it works with *every* AI agent — Claude Code and Codex in a
|
|
17
|
+
terminal, Copilot Chat inside VS Code, Cursor, a browser tab running tests — with **no wrappers
|
|
18
|
+
and no hooks required**: you never change how you launch your tools. CLI-wrapper apps only see
|
|
19
|
+
the one agent they wrap; WhipDesk sees your actual desktop.
|
|
20
|
+
|
|
21
|
+
It's peer-to-peer: an encrypted WebRTC connection that talks **directly** between phone and
|
|
22
|
+
desktop, on your LAN or across the internet. The cloud only brokers the initial handshake — your
|
|
23
|
+
screen and keystrokes never flow through anyone else's server.
|
|
24
|
+
|
|
25
|
+
## Features
|
|
26
|
+
|
|
27
|
+
- **Live screen, tuned for mobile data** — direct H.264, hardware-encoded. When you zoom, the
|
|
28
|
+
host **re-crops the encode to just your phone's viewport**, so a magnified terminal costs a
|
|
29
|
+
fraction of the bandwidth of streaming the whole desktop — full-desktop streamers (RustDesk,
|
|
30
|
+
Parsec, Chrome Remote Desktop) always ship every pixel. A quality ladder steps the bitrate
|
|
31
|
+
down automatically on a lossy cellular link, and encoding pauses entirely while your phone's
|
|
32
|
+
screen is off.
|
|
33
|
+
- **AI-agent monitoring (auto-whips)** — the host detects running agents (Claude Code, Codex,
|
|
34
|
+
Gemini CLI, Aider, Copilot — including Copilot Chat inside VS Code — opencode, Cursor, Amp) by
|
|
35
|
+
observing processes and transcripts, and pings your phone the moment one stops working: waiting
|
|
36
|
+
on you, finished, or crashed. Zero config; optional [agent-native hooks](https://github.com/BinaryBananaLLC/WhipDesk/blob/main/docs/HOOKS.md) make the
|
|
37
|
+
alert instant.
|
|
38
|
+
- **Full input** — mouse, touch, and keyboard injected into the real OS; built for poking at
|
|
39
|
+
AI agents and CLIs from your couch.
|
|
40
|
+
- **Job-done notifications** — a token-authenticated webhook (`POST /api/notify`) or an opt-in
|
|
41
|
+
file watcher fires a notification when a slow task completes; optional background push to a
|
|
42
|
+
closed PWA via FCM.
|
|
43
|
+
- **Private by design** — DTLS-encrypted P2P media, a PIN challenge on **every** connection (the
|
|
44
|
+
PIN itself never crosses the wire), a pairing token underneath, and persistent brute-force
|
|
45
|
+
lockout. Secrets stay on your machine. See [SECURITY.md](https://github.com/BinaryBananaLLC/WhipDesk/blob/main/SECURITY.md) for the threat model.
|
|
46
|
+
- **No account needed on LAN** — cloud (remote access, device dashboard) is strictly opt-in.
|
|
47
|
+
|
|
48
|
+
## Quick start (macOS)
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
npm install
|
|
52
|
+
npm run dev # builds the web controller, then starts the desktop agent
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The agent prints a `http://<lan-ip>:8787/#t=<token>` URL and a QR code. Open it on your phone
|
|
56
|
+
(same Wi-Fi), then grant the launching terminal app **Screen Recording** and **Accessibility**
|
|
57
|
+
in System Settings → Privacy & Security, and restart it. Without those, frames show only the
|
|
58
|
+
wallpaper and input does nothing.
|
|
59
|
+
|
|
60
|
+
Fire a test notification:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
npm run notify -- "Build done" "tsc finished with 0 errors"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
> Tested on macOS (Apple Silicon). The capture/input stack is cross-platform, but Windows and
|
|
67
|
+
> Linux hosts aren't verified yet.
|
|
68
|
+
|
|
69
|
+
## Install a prebuilt agent
|
|
70
|
+
|
|
71
|
+
You don't have to build from source. Every [release](https://github.com/BinaryBananaLLC/WhipDesk/releases/latest)
|
|
72
|
+
ships two ways to run the agent — both built by GitHub Actions straight from the tagged source,
|
|
73
|
+
with [verifiable build provenance](https://github.com/BinaryBananaLLC/WhipDesk/blob/main/docs/VERIFYING-DOWNLOADS.md):
|
|
74
|
+
|
|
75
|
+
**Homebrew (macOS).**
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
brew install --cask BinaryBananaLLC/whipdesk/whipdesk
|
|
79
|
+
whipdesk
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Self-contained download (no Node needed).** Grab the package for your OS:
|
|
83
|
+
|
|
84
|
+
| OS | Asset | Notes |
|
|
85
|
+
| --- | --- | --- |
|
|
86
|
+
| macOS | `whipdesk-<ver>-macos-arm64.pkg` / `-x64.pkg` | Signed with a Developer ID & **notarized** — installs `whipdesk` to your PATH. |
|
|
87
|
+
| Windows | `whipdesk-<ver>-windows-x64.zip` | Unzip and run `whipdesk.exe`. SmartScreen: **More info → Run anyway** (see verification below). |
|
|
88
|
+
| Linux | `whipdesk-<ver>-linux-x64.tar.gz` | Extract and run `./whipdesk` (needs X11). |
|
|
89
|
+
|
|
90
|
+
**npm (if you already have Node ≥ 20):**
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npm install -g whipdesk
|
|
94
|
+
whipdesk
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The npm package is published with [npm provenance](https://docs.npmjs.com/generating-provenance-statements)
|
|
98
|
+
(the verified badge on npmjs.com links back to the exact build).
|
|
99
|
+
|
|
100
|
+
Prebuilt agents keep their pairing/PIN state in `~/.whipdesk`, so updates don't re-pair you.
|
|
101
|
+
**Always verify a download before running it** — see [docs/VERIFYING-DOWNLOADS.md](https://github.com/BinaryBananaLLC/WhipDesk/blob/main/docs/VERIFYING-DOWNLOADS.md).
|
|
102
|
+
|
|
103
|
+
## Setup & permissions (troubleshooting)
|
|
104
|
+
|
|
105
|
+
The agent prints a short reminder for your OS at startup. If the screen shows only your wallpaper,
|
|
106
|
+
or the mouse/keyboard don't respond, it's almost always an OS permission — here's the fix per
|
|
107
|
+
platform:
|
|
108
|
+
|
|
109
|
+
**macOS** — grant the app that *launched* the agent (Terminal, iTerm, or VS Code), not "node":
|
|
110
|
+
|
|
111
|
+
1. **Screen Recording** — System Settings → Privacy & Security → Screen Recording → enable the app.
|
|
112
|
+
Without it, frames show only the wallpaper.
|
|
113
|
+
2. **Accessibility** — System Settings → Privacy & Security → Accessibility → enable the app.
|
|
114
|
+
Without it, mouse and keyboard input do nothing.
|
|
115
|
+
3. **Fully quit and reopen** that app (a plain window-close isn't enough), then run it again.
|
|
116
|
+
|
|
117
|
+
Shortcut to the right pane: `open "x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture"`
|
|
118
|
+
|
|
119
|
+
**Windows** — capture and input work out of the box. If the screen is black or clicks are ignored
|
|
120
|
+
on an elevated window (a UAC prompt or an app "Run as administrator"), relaunch your terminal via
|
|
121
|
+
**Run as administrator** so the agent can see and drive those windows.
|
|
122
|
+
|
|
123
|
+
**Linux** — X11 sessions work out of the box. On **Wayland**, screen capture is gated behind the
|
|
124
|
+
desktop's screen-share portal: install/enable `xdg-desktop-portal` (plus your compositor's backend,
|
|
125
|
+
e.g. `xdg-desktop-portal-wlr` or `-gnome`), or log in under an **X11/Xorg** session instead of
|
|
126
|
+
Wayland. Input injection also needs access to `/dev/uinput` on some setups.
|
|
127
|
+
|
|
128
|
+
If capture is genuinely blocked, the agent also logs step-by-step help and pushes a
|
|
129
|
+
"Screen capture blocked" alert to your phone.
|
|
130
|
+
|
|
131
|
+
## How it works
|
|
132
|
+
|
|
133
|
+
A **desktop agent** (Node) captures the screen, injects input, and serves the **web controller**
|
|
134
|
+
(a framework-light vanilla-TS PWA). They speak one message contract
|
|
135
|
+
([`packages/protocol`](https://github.com/BinaryBananaLLC/WhipDesk/blob/main/packages/protocol)) over WebRTC — one DataChannel for control plus H.264
|
|
136
|
+
video tracks, all DTLS-encrypted — with two ways to broker the handshake:
|
|
137
|
+
|
|
138
|
+
- **LAN** — the agent's own WebSocket swaps the SDP offer/answer; the media flows host-to-host
|
|
139
|
+
on your network, touching nothing else.
|
|
140
|
+
- **Remote** — Firebase Realtime Database swaps the SDP; STUN connects directly, with
|
|
141
|
+
ephemeral-credential TURN as a last-resort relay.
|
|
142
|
+
|
|
143
|
+
Every session goes through the same gate: pairing token → PIN challenge → only then does the
|
|
144
|
+
screen start. Pointer coordinates travel normalized to `[0,1]`, so control is resolution- and
|
|
145
|
+
Retina-independent. See [docs/ARCHITECTURE.md](https://github.com/BinaryBananaLLC/WhipDesk/blob/main/docs/ARCHITECTURE.md) for the design seams.
|
|
146
|
+
|
|
147
|
+
## Cloud (optional)
|
|
148
|
+
|
|
149
|
+
LAN needs nothing. Remote access and the device dashboard run on the **hosted WhipDesk.com
|
|
150
|
+
backend, which is baked into this repo** (`apps/desktop-agent/src/cloud/config.ts`) — so it just
|
|
151
|
+
works out of the box. On startup the agent asks whether to enable secure cloud discovery; answer
|
|
152
|
+
**No** to stay strictly LAN-only, and nothing ever touches Firebase.
|
|
153
|
+
|
|
154
|
+
Those baked-in values are a Firebase **web** config — public by design, the same ones whipdesk.com
|
|
155
|
+
serves in its browser bundle. They are **not** secrets: there's no service-account key, cloud is
|
|
156
|
+
opt-in, and every read/write is locked to your own account by the Firestore/RTDB rules. The agent
|
|
157
|
+
signs in as the real user via passwordless email-link — the same account as the website.
|
|
158
|
+
|
|
159
|
+
**Prefer your own backend?** Point the agent at your own Firebase project + TURN by dropping a web
|
|
160
|
+
config in `.whipdesk/firebase.json` (gitignored) — that file is the only override, and it
|
|
161
|
+
replaces the baked-in default.
|
|
162
|
+
|
|
163
|
+
## Project layout
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
packages/protocol/ Types-only wire contract shared by both apps
|
|
167
|
+
apps/desktop-agent/ Node host: capture, input, server, watchers, cloud
|
|
168
|
+
apps/mobile-web/ Vite PWA controller, served by the agent
|
|
169
|
+
scripts/ notify.mjs + smoke-test harnesses
|
|
170
|
+
docs/ARCHITECTURE.md Design rationale
|
|
171
|
+
docs/HOOKS.md Optional agent-native hooks for instant monitoring alerts
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Contributing
|
|
175
|
+
|
|
176
|
+
PRs welcome. Read [AGENTS.md](https://github.com/BinaryBananaLLC/WhipDesk/blob/main/AGENTS.md) first — it's the operating contract for both humans and
|
|
177
|
+
AI coding agents (where each change goes, the wire-contract-first rule, how to verify). In short:
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
npm run typecheck # tsc --noEmit across workspaces
|
|
181
|
+
npm run test # node --test (auth handshake, pin, monitor states, crypto, protocol contract)
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Security
|
|
185
|
+
|
|
186
|
+
Found a vulnerability? Please open a [security advisory](https://github.com/BinaryBananaLLC/WhipDesk/security/advisories/new)
|
|
187
|
+
rather than a public issue. Good-faith security research is welcome.
|
|
188
|
+
|
|
189
|
+
## License
|
|
190
|
+
|
|
191
|
+
[GNU AGPL-3.0](https://github.com/BinaryBananaLLC/WhipDesk/blob/main/LICENSE). You're free to run, study, modify, and share WhipDesk. If you offer a
|
|
192
|
+
modified version as a network service, the AGPL requires you to publish your source under the
|
|
193
|
+
same license. For commercial licensing, contact BinaryBanana LLC.
|