whipdesk 0.0.9 → 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 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
+ [![CI](https://github.com/BinaryBananaLLC/WhipDesk/actions/workflows/ci.yml/badge.svg)](https://github.com/BinaryBananaLLC/WhipDesk/actions/workflows/ci.yml)
6
+ [![Release](https://img.shields.io/github/v/release/BinaryBananaLLC/WhipDesk)](https://github.com/BinaryBananaLLC/WhipDesk/releases/latest)
7
+ [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/BinaryBananaLLC/WhipDesk/badge)](https://scorecard.dev/viewer/?uri=github.com/BinaryBananaLLC/WhipDesk)
8
+ [![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](https://github.com/BinaryBananaLLC/WhipDesk/blob/main/LICENSE)
9
+ ![Node](https://img.shields.io/badge/node-%3E%3D20-brightgreen)
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.
package/dist/agent.cjs CHANGED
@@ -27693,7 +27693,7 @@ function isPackaged() {
27693
27693
  }
27694
27694
 
27695
27695
  // src/version.ts
27696
- var AGENT_VERSION = "0.0.9";
27696
+ var AGENT_VERSION = "0.1.1";
27697
27697
 
27698
27698
  // src/config.ts
27699
27699
  var here = (0, import_node_path2.dirname)((0, import_node_url2.fileURLToPath)(__whipdesk_meta_url));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "whipdesk",
3
- "version": "0.0.9",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "description": "WhipDesk desktop host: screen capture, input injection, notification hub, and the HTTP/WebSocket server that serves the mobile client.",
6
6
  "license": "AGPL-3.0",
@@ -15,7 +15,8 @@
15
15
  },
16
16
  "files": [
17
17
  "dist/agent.cjs",
18
- "dist/mobile-web"
18
+ "dist/mobile-web",
19
+ "README.md"
19
20
  ],
20
21
  "engines": {
21
22
  "node": ">=20"