volatouch 1.0.0__tar.gz
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.
- volatouch-1.0.0/LICENSE +21 -0
- volatouch-1.0.0/MANIFEST.in +4 -0
- volatouch-1.0.0/PKG-INFO +246 -0
- volatouch-1.0.0/README.md +207 -0
- volatouch-1.0.0/assets/banner.jpg +0 -0
- volatouch-1.0.0/assets/logo.jpg +0 -0
- volatouch-1.0.0/pyproject.toml +52 -0
- volatouch-1.0.0/setup.cfg +4 -0
- volatouch-1.0.0/setup.py +54 -0
- volatouch-1.0.0/volatouch/__init__.py +7 -0
- volatouch-1.0.0/volatouch/__main__.py +4 -0
- volatouch-1.0.0/volatouch/cli.py +19 -0
- volatouch-1.0.0/volatouch/config.py +26 -0
- volatouch-1.0.0/volatouch/input_controller.py +197 -0
- volatouch-1.0.0/volatouch/main.py +348 -0
- volatouch-1.0.0/volatouch/screen_streamer.py +195 -0
- volatouch-1.0.0/volatouch/web/assets/index-BXTjDq8n.css +1 -0
- volatouch-1.0.0/volatouch/web/assets/index-TBT2cyha.js +215 -0
- volatouch-1.0.0/volatouch/web/index.html +18 -0
- volatouch-1.0.0/volatouch.egg-info/PKG-INFO +246 -0
- volatouch-1.0.0/volatouch.egg-info/SOURCES.txt +23 -0
- volatouch-1.0.0/volatouch.egg-info/dependency_links.txt +1 -0
- volatouch-1.0.0/volatouch.egg-info/entry_points.txt +2 -0
- volatouch-1.0.0/volatouch.egg-info/requires.txt +6 -0
- volatouch-1.0.0/volatouch.egg-info/top_level.txt +1 -0
volatouch-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Uğur Türker Kebeci
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
volatouch-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: volatouch
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Ultra-low latency mobile air control & wireless trackpad for PC over local Wi-Fi.
|
|
5
|
+
Home-page: https://github.com/ugurturkerkebeci/volatouch
|
|
6
|
+
Author: Uğur Türker Kebeci
|
|
7
|
+
Author-email: Uğur Türker Kebeci <167927605+ugurturkerkebeci@users.noreply.github.com>
|
|
8
|
+
License: MIT
|
|
9
|
+
Project-URL: Homepage, https://github.com/ugurturkerkebeci/volatouch
|
|
10
|
+
Project-URL: Repository, https://github.com/ugurturkerkebeci/volatouch
|
|
11
|
+
Project-URL: Issues, https://github.com/ugurturkerkebeci/volatouch/issues
|
|
12
|
+
Keywords: remote-desktop,trackpad,air-control,mouse,keyboard,low-latency,screen-stream,fastapi,websockets
|
|
13
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
24
|
+
Classifier: Topic :: System :: Hardware
|
|
25
|
+
Classifier: Topic :: Multimedia :: Graphics :: Capture
|
|
26
|
+
Requires-Python: >=3.8
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
License-File: LICENSE
|
|
29
|
+
Requires-Dist: fastapi>=0.100.0
|
|
30
|
+
Requires-Dist: uvicorn[standard]>=0.22.0
|
|
31
|
+
Requires-Dist: websockets>=11.0
|
|
32
|
+
Requires-Dist: mss>=9.0.0
|
|
33
|
+
Requires-Dist: opencv-python>=4.8.0
|
|
34
|
+
Requires-Dist: pynput>=1.7.6
|
|
35
|
+
Dynamic: author
|
|
36
|
+
Dynamic: home-page
|
|
37
|
+
Dynamic: license-file
|
|
38
|
+
Dynamic: requires-python
|
|
39
|
+
|
|
40
|
+
<p align="center">
|
|
41
|
+
<img src="https://raw.githubusercontent.com/ugurturkerkebeci/volatouch/main/assets/banner.jpg" alt="Volatouch Banner" width="100%" />
|
|
42
|
+
</p>
|
|
43
|
+
|
|
44
|
+
<p align="center">
|
|
45
|
+
<img src="https://raw.githubusercontent.com/ugurturkerkebeci/volatouch/main/assets/logo.jpg" alt="Volatouch Logo" width="120" style="border-radius: 24px;" />
|
|
46
|
+
</p>
|
|
47
|
+
|
|
48
|
+
<h1 align="center">VOLATOUCH</h1>
|
|
49
|
+
|
|
50
|
+
<p align="center">
|
|
51
|
+
<strong>Ultra-Low Latency Mobile Air Control & Wireless Trackpad for PC over Wi-Fi</strong>
|
|
52
|
+
</p>
|
|
53
|
+
|
|
54
|
+
<p align="center">
|
|
55
|
+
<a href="https://pypi.org/project/volatouch/"><img src="https://img.shields.io/pypi/v/volatouch.svg?color=6366f1&style=for-the-badge" alt="PyPI version" /></a>
|
|
56
|
+
<a href="https://pypi.org/project/volatouch/"><img src="https://img.shields.io/pypi/pyversions/volatouch.svg?color=06b6d4&style=for-the-badge" alt="Python Versions" /></a>
|
|
57
|
+
<a href="https://github.com/ugurturkerkebeci/volatouch/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-MIT-emerald.svg?style=for-the-badge" alt="License: MIT" /></a>
|
|
58
|
+
<a href="https://github.com/ugurturkerkebeci/volatouch/stargazers"><img src="https://img.shields.io/github/stars/ugurturkerkebeci/volatouch?style=for-the-badge&color=eab308" alt="GitHub Stars" /></a>
|
|
59
|
+
<a href="https://github.com/ugurturkerkebeci/volatouch/issues"><img src="https://img.shields.io/github/issues/ugurturkerkebeci/volatouch?style=for-the-badge&color=ec4899" alt="GitHub Issues" /></a>
|
|
60
|
+
<img src="https://img.shields.io/badge/Platform-Windows-0284c7.svg?style=for-the-badge&logo=windows" alt="Platform: Windows" />
|
|
61
|
+
</p>
|
|
62
|
+
|
|
63
|
+
<p align="center">
|
|
64
|
+
<a href="#-quick-start-pypi">⚡ Quick Start</a> •
|
|
65
|
+
<a href="#-key-features">✨ Features</a> •
|
|
66
|
+
<a href="#-gesture--touch-cheatsheet">📱 Gestures</a> •
|
|
67
|
+
<a href="#-architecture">🏗️ Architecture</a> •
|
|
68
|
+
<a href="#-security--sandbox">🛡️ Security</a> •
|
|
69
|
+
<a href="#-settings--diagnostics">⚙️ Settings</a> •
|
|
70
|
+
<a href="#-t%C3%BCrk%C3%A7e-rehber">🇹🇷 Türkçe Rehber</a>
|
|
71
|
+
</p>
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## ⚡ Quick Start (PyPI)
|
|
76
|
+
|
|
77
|
+
Install and launch Volatouch with a single command from your terminal:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# 1. Install Volatouch via pip
|
|
81
|
+
pip install volatouch
|
|
82
|
+
|
|
83
|
+
# 2. Launch the server
|
|
84
|
+
volatouch
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Once started, the console displays your local server address (e.g., `http://192.168.1.5:8000`).
|
|
88
|
+
Open this URL in **Safari** or **Chrome** on your phone (connected to the same Wi-Fi) — **no mobile app installation required!**
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## ✨ Key Features
|
|
93
|
+
|
|
94
|
+
- **🚀 Ultra-Low Latency Binary Video Streaming:**
|
|
95
|
+
- Screen capture powered by `mss` delivering hardware-level **60 FPS**.
|
|
96
|
+
- Direct 4-channel BGRA JPEG compression via OpenCV (`cv2.imencode`), skipping CPU color-space conversions.
|
|
97
|
+
- Raw binary ArrayBuffer transmission over WebSockets with 8-byte high-precision double timestamp headers for sub-millisecond round-trip profiling.
|
|
98
|
+
- Zero-delay, single-slot subscriber queues (`asyncio.Queue(maxsize=1)`) prevent buffer bloat and queue lag.
|
|
99
|
+
|
|
100
|
+
- **🎯 Dual Input Modes (Direct Target & Relative Trackpad):**
|
|
101
|
+
- **Direct Mode:** Tap anywhere on your phone's screen to navigate the cursor directly to that coordinate on your desktop display.
|
|
102
|
+
- **Relative Trackpad Mode:** Precision multi-touch trackpad navigation with acceleration and configurable sensitivity.
|
|
103
|
+
|
|
104
|
+
- **🏝️ Draggable Floating Action Island:**
|
|
105
|
+
- **L-Click / R-Click:** Dedicated, ergonomic primary action buttons.
|
|
106
|
+
- **Hold / Drag Lock:** One-tap persistent mouse hold with tactile haptic feedback for window movement and drag-and-drop.
|
|
107
|
+
- **Scroll Up / Down:** Instant micro-step vertical scrolling without needing two-finger gestures.
|
|
108
|
+
- **Collapsible Mini-Pill:** Compact mode keeps 100% of your screen visible when not interacting.
|
|
109
|
+
- **Auto Boundary Clamping:** Widgets automatically re-align to stay safely within the viewport across orientation changes and fullscreen toggles.
|
|
110
|
+
|
|
111
|
+
- **⌨️ Comprehensive Built-In Virtual Keyboard:**
|
|
112
|
+
- Full **QWERTY layout** with smart dynamic Caps / Shift character switching.
|
|
113
|
+
- **Sticky Modifier Keys:** `Ctrl`, `Shift`, `Alt`, and `Win (Super)` lock on tap (highlighted in indigo) for seamless desktop combos (e.g., `Ctrl` + `C`).
|
|
114
|
+
- Dedicated **F1–F12 function row**, navigation keys (`Esc`, `Tab`, `Home`, `End`, Arrows), and **Voice / Text input drawer**.
|
|
115
|
+
|
|
116
|
+
- **📱 Landscape Edge-to-Edge Fill Mode:**
|
|
117
|
+
- Switch between **Fit (Aspect Ratio)** and **Fill (Full Screen Stretch)** modes to eliminate black side bars on widescreen mobile displays.
|
|
118
|
+
|
|
119
|
+
- **🌐 Bilingual UI (English & Türkçe):**
|
|
120
|
+
- Instant toggle between English and Turkish directly from Settings, remembered via `localStorage`.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 📱 Gesture & Touch Cheatsheet
|
|
125
|
+
|
|
126
|
+
| Gesture / Action | Relative Mode | Direct Mode |
|
|
127
|
+
| :--- | :--- | :--- |
|
|
128
|
+
| **1-Finger Drag** | Relative Mouse Cursor Movement | Direct Mouse Cursor Positioning |
|
|
129
|
+
| **1-Finger Tap** | Left Click (Mouse 1) | Left Click at Tap Point |
|
|
130
|
+
| **2-Finger Tap** | Right Click (Mouse 2) | Right Click at Tap Point |
|
|
131
|
+
| **2-Finger Scroll** | Smooth Vertical Mouse Wheel Scroll | Smooth Vertical Mouse Wheel Scroll |
|
|
132
|
+
| **Long Press (>350ms)** | Drag & Drop (Left Mouse Down) | Drag & Drop at Point |
|
|
133
|
+
| **Island `[ HOLD ]`** | Toggles Left Button Lock | Toggles Left Button Lock |
|
|
134
|
+
| **Island `[ UP/DOWN ]`**| Mouse Scroll Wheel Increment | Mouse Scroll Wheel Increment |
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## 🏗️ Architecture
|
|
139
|
+
|
|
140
|
+
```mermaid
|
|
141
|
+
flowchart TD
|
|
142
|
+
subgraph Host ["Desktop Host (Windows)"]
|
|
143
|
+
MSS["mss (Screen Capture 60 FPS)"] --> BGRA["Direct BGRA Frame (No cvtColor)"]
|
|
144
|
+
BGRA --> CV2["cv2.imencode (JPEG Compression)"]
|
|
145
|
+
CV2 --> TIME["Timestamp Header (8-Byte Double)"]
|
|
146
|
+
TIME --> ASYNC["Zero-Copy Queue (asyncio.Queue)"]
|
|
147
|
+
ASYNC --> WS_STREAM["/ws/stream (Binary WebSocket)"]
|
|
148
|
+
|
|
149
|
+
WS_INPUT["/ws/input (JSON WebSocket)"] --> CTRL["InputController (pynput)"]
|
|
150
|
+
CTRL --> OS_INPUT["Windows OS Hardware Emulation"]
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
subgraph Client ["Mobile Client (Browser / PWA)"]
|
|
154
|
+
WS_STREAM --> BITMAP["createImageBitmap (Worker-like GPU decode)"]
|
|
155
|
+
BITMAP --> RAF["requestAnimationFrame() -> HTML5 Canvas"]
|
|
156
|
+
|
|
157
|
+
TOUCH["Multi-Touch Engine (Direct & Relative)"] --> WS_INPUT
|
|
158
|
+
KB["Virtual Keyboard & Sticky Modifiers"] --> WS_INPUT
|
|
159
|
+
ACTIONS["Floating Island (Click, Hold, Scroll)"] --> WS_INPUT
|
|
160
|
+
end
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 🛡️ Security & Sandbox
|
|
166
|
+
|
|
167
|
+
Volatouch implements defense-in-depth security to protect your workstation on shared Wi-Fi networks:
|
|
168
|
+
|
|
169
|
+
1. **Subnet Verification (RFC-1918):** Only clients within the identical `/24` private local subnet as the host machine can access endpoints or initiate WebSocket handshakes. External and non-local requests receive an immediate `403 Forbidden`.
|
|
170
|
+
2. **Strict Origin & CSP Isolation:** Rejects unauthorized origin headers; enforces modern `Content-Security-Policy`, `X-Frame-Options: DENY`, and strict frame-ancestors restrictions.
|
|
171
|
+
3. **Whitelisted Hardware Commands:** Only explicit, sanitized commands (`mouse_move`, `mouse_click`, `key_tap`, etc.) are processed. Arbitrary shell commands are impossible.
|
|
172
|
+
4. **Failsafe Key Release:** Whenever a WebSocket connection drops, all pressed keys and mouse buttons are instantly released via `input_ctrl.release_all()` to prevent stuck keys on your PC.
|
|
173
|
+
5. **Private Console Telemetry:** No third-party tracking, no external web calls, and silenced debug logs. The host console only shows an active connection counter.
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## ⚙️ Settings & Diagnostics
|
|
178
|
+
|
|
179
|
+
Tap the floating gear icon to access:
|
|
180
|
+
- **JPEG Quality Slider (15% – 95%):** Dynamically tune bandwidth usage vs. visual clarity in real time.
|
|
181
|
+
- **Resolution Scale Slider (30% – 100%):** Downscale resolution for ultra-high FPS over congested Wi-Fi channels.
|
|
182
|
+
- **Cursor Speed & Acceleration:** Fine-tune trackpad velocity and exponential sensitivity curves.
|
|
183
|
+
- **Real-time Latency & FPS Badge:** Monitor live stream frame rates and hardware round-trip ping in milliseconds.
|
|
184
|
+
- **Language Selector:** Seamlessly switch between **English** and **Türkçe**.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## 💻 Running From Source
|
|
189
|
+
|
|
190
|
+
If you prefer building and developing Volatouch locally:
|
|
191
|
+
|
|
192
|
+
### Prerequisites
|
|
193
|
+
- Python 3.8+ (Recommended: Python 3.10+)
|
|
194
|
+
- Node.js 18+ (for building the frontend)
|
|
195
|
+
|
|
196
|
+
### Setup
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
# 1. Clone repository
|
|
200
|
+
git clone https://github.com/ugurturkerkebeci/volatouch.git
|
|
201
|
+
cd volatouch
|
|
202
|
+
|
|
203
|
+
# 2. Install Python dependencies
|
|
204
|
+
pip install -r backend/requirements.txt
|
|
205
|
+
|
|
206
|
+
# 3. Build React frontend
|
|
207
|
+
cd frontend
|
|
208
|
+
npm install
|
|
209
|
+
npm run build
|
|
210
|
+
cd ..
|
|
211
|
+
|
|
212
|
+
# 4. Run application
|
|
213
|
+
python run.py
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## 🇹🇷 Türkçe Rehber
|
|
219
|
+
|
|
220
|
+
Volatouch, aynı yerel Wi-Fi ağına bağlı bilgisayarınızı mobil cihazınızın web tarayıcısı üzerinden sıfıra yakın gecikmeyle (ultra-low latency) yönetmenizi sağlayan yüksek performanslı bir uzaktan kontrol ve hava trackpad sistemidir.
|
|
221
|
+
|
|
222
|
+
### Hızlı Kurulum (PyPI):
|
|
223
|
+
```bash
|
|
224
|
+
pip install volatouch
|
|
225
|
+
volatouch
|
|
226
|
+
```
|
|
227
|
+
Konsolda yazan adresi (örn. `http://192.168.1.5:8000`) telefonunuzun tarayıcısında açmanız yeterlidir.
|
|
228
|
+
|
|
229
|
+
### Başlıca Özellikler:
|
|
230
|
+
- **Sıfır Gecikme:** `mss` ve `OpenCV` tabanlı binary JPEG akışı, doğrudan GPU'da çizilen HTML5 Canvas ile tear veya kare düşmesi yaşatmaz.
|
|
231
|
+
- **Doğrudan ve Bağıl Mod:** İster ekrana dokunup imleci doğrudan oraya yönlendirin (Direct), ister dizüstü bilgisayar trackpad'i gibi kullanın (Relative).
|
|
232
|
+
- **Yüzen Fonksiyon Adası:** Sol tık, sağ tık, dosya sürüklemek için sol tık kilidi (`HOLD`), ve hassas kaydırma (`UP`/`DOWN`) butonları.
|
|
233
|
+
- **Dahili Türkçe/İngilizce QWERTY Klavye:** `Ctrl`, `Alt`, `Shift` gibi niteleyici tuşları basılı tutma desteği, F1–F12 tuşları ve ses/metin aktarım çekmecesi.
|
|
234
|
+
- **Yerel Ağ Güvenliği:** Yalnızca aynı yerel Wi-Fi alt ağındaki (subnet) cihazların bağlanmasına izin verir.
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## 📄 License
|
|
239
|
+
|
|
240
|
+
Distributed under the **MIT License**. See [`LICENSE`](./LICENSE) for full details.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
<p align="center">
|
|
245
|
+
Crafted with ❤️ by <a href="https://github.com/ugurturkerkebeci">Uğur Türker Kebeci</a>
|
|
246
|
+
</p>
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/ugurturkerkebeci/volatouch/main/assets/banner.jpg" alt="Volatouch Banner" width="100%" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<img src="https://raw.githubusercontent.com/ugurturkerkebeci/volatouch/main/assets/logo.jpg" alt="Volatouch Logo" width="120" style="border-radius: 24px;" />
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
<h1 align="center">VOLATOUCH</h1>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<strong>Ultra-Low Latency Mobile Air Control & Wireless Trackpad for PC over Wi-Fi</strong>
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
<p align="center">
|
|
16
|
+
<a href="https://pypi.org/project/volatouch/"><img src="https://img.shields.io/pypi/v/volatouch.svg?color=6366f1&style=for-the-badge" alt="PyPI version" /></a>
|
|
17
|
+
<a href="https://pypi.org/project/volatouch/"><img src="https://img.shields.io/pypi/pyversions/volatouch.svg?color=06b6d4&style=for-the-badge" alt="Python Versions" /></a>
|
|
18
|
+
<a href="https://github.com/ugurturkerkebeci/volatouch/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-MIT-emerald.svg?style=for-the-badge" alt="License: MIT" /></a>
|
|
19
|
+
<a href="https://github.com/ugurturkerkebeci/volatouch/stargazers"><img src="https://img.shields.io/github/stars/ugurturkerkebeci/volatouch?style=for-the-badge&color=eab308" alt="GitHub Stars" /></a>
|
|
20
|
+
<a href="https://github.com/ugurturkerkebeci/volatouch/issues"><img src="https://img.shields.io/github/issues/ugurturkerkebeci/volatouch?style=for-the-badge&color=ec4899" alt="GitHub Issues" /></a>
|
|
21
|
+
<img src="https://img.shields.io/badge/Platform-Windows-0284c7.svg?style=for-the-badge&logo=windows" alt="Platform: Windows" />
|
|
22
|
+
</p>
|
|
23
|
+
|
|
24
|
+
<p align="center">
|
|
25
|
+
<a href="#-quick-start-pypi">⚡ Quick Start</a> •
|
|
26
|
+
<a href="#-key-features">✨ Features</a> •
|
|
27
|
+
<a href="#-gesture--touch-cheatsheet">📱 Gestures</a> •
|
|
28
|
+
<a href="#-architecture">🏗️ Architecture</a> •
|
|
29
|
+
<a href="#-security--sandbox">🛡️ Security</a> •
|
|
30
|
+
<a href="#-settings--diagnostics">⚙️ Settings</a> •
|
|
31
|
+
<a href="#-t%C3%BCrk%C3%A7e-rehber">🇹🇷 Türkçe Rehber</a>
|
|
32
|
+
</p>
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## ⚡ Quick Start (PyPI)
|
|
37
|
+
|
|
38
|
+
Install and launch Volatouch with a single command from your terminal:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# 1. Install Volatouch via pip
|
|
42
|
+
pip install volatouch
|
|
43
|
+
|
|
44
|
+
# 2. Launch the server
|
|
45
|
+
volatouch
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Once started, the console displays your local server address (e.g., `http://192.168.1.5:8000`).
|
|
49
|
+
Open this URL in **Safari** or **Chrome** on your phone (connected to the same Wi-Fi) — **no mobile app installation required!**
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## ✨ Key Features
|
|
54
|
+
|
|
55
|
+
- **🚀 Ultra-Low Latency Binary Video Streaming:**
|
|
56
|
+
- Screen capture powered by `mss` delivering hardware-level **60 FPS**.
|
|
57
|
+
- Direct 4-channel BGRA JPEG compression via OpenCV (`cv2.imencode`), skipping CPU color-space conversions.
|
|
58
|
+
- Raw binary ArrayBuffer transmission over WebSockets with 8-byte high-precision double timestamp headers for sub-millisecond round-trip profiling.
|
|
59
|
+
- Zero-delay, single-slot subscriber queues (`asyncio.Queue(maxsize=1)`) prevent buffer bloat and queue lag.
|
|
60
|
+
|
|
61
|
+
- **🎯 Dual Input Modes (Direct Target & Relative Trackpad):**
|
|
62
|
+
- **Direct Mode:** Tap anywhere on your phone's screen to navigate the cursor directly to that coordinate on your desktop display.
|
|
63
|
+
- **Relative Trackpad Mode:** Precision multi-touch trackpad navigation with acceleration and configurable sensitivity.
|
|
64
|
+
|
|
65
|
+
- **🏝️ Draggable Floating Action Island:**
|
|
66
|
+
- **L-Click / R-Click:** Dedicated, ergonomic primary action buttons.
|
|
67
|
+
- **Hold / Drag Lock:** One-tap persistent mouse hold with tactile haptic feedback for window movement and drag-and-drop.
|
|
68
|
+
- **Scroll Up / Down:** Instant micro-step vertical scrolling without needing two-finger gestures.
|
|
69
|
+
- **Collapsible Mini-Pill:** Compact mode keeps 100% of your screen visible when not interacting.
|
|
70
|
+
- **Auto Boundary Clamping:** Widgets automatically re-align to stay safely within the viewport across orientation changes and fullscreen toggles.
|
|
71
|
+
|
|
72
|
+
- **⌨️ Comprehensive Built-In Virtual Keyboard:**
|
|
73
|
+
- Full **QWERTY layout** with smart dynamic Caps / Shift character switching.
|
|
74
|
+
- **Sticky Modifier Keys:** `Ctrl`, `Shift`, `Alt`, and `Win (Super)` lock on tap (highlighted in indigo) for seamless desktop combos (e.g., `Ctrl` + `C`).
|
|
75
|
+
- Dedicated **F1–F12 function row**, navigation keys (`Esc`, `Tab`, `Home`, `End`, Arrows), and **Voice / Text input drawer**.
|
|
76
|
+
|
|
77
|
+
- **📱 Landscape Edge-to-Edge Fill Mode:**
|
|
78
|
+
- Switch between **Fit (Aspect Ratio)** and **Fill (Full Screen Stretch)** modes to eliminate black side bars on widescreen mobile displays.
|
|
79
|
+
|
|
80
|
+
- **🌐 Bilingual UI (English & Türkçe):**
|
|
81
|
+
- Instant toggle between English and Turkish directly from Settings, remembered via `localStorage`.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## 📱 Gesture & Touch Cheatsheet
|
|
86
|
+
|
|
87
|
+
| Gesture / Action | Relative Mode | Direct Mode |
|
|
88
|
+
| :--- | :--- | :--- |
|
|
89
|
+
| **1-Finger Drag** | Relative Mouse Cursor Movement | Direct Mouse Cursor Positioning |
|
|
90
|
+
| **1-Finger Tap** | Left Click (Mouse 1) | Left Click at Tap Point |
|
|
91
|
+
| **2-Finger Tap** | Right Click (Mouse 2) | Right Click at Tap Point |
|
|
92
|
+
| **2-Finger Scroll** | Smooth Vertical Mouse Wheel Scroll | Smooth Vertical Mouse Wheel Scroll |
|
|
93
|
+
| **Long Press (>350ms)** | Drag & Drop (Left Mouse Down) | Drag & Drop at Point |
|
|
94
|
+
| **Island `[ HOLD ]`** | Toggles Left Button Lock | Toggles Left Button Lock |
|
|
95
|
+
| **Island `[ UP/DOWN ]`**| Mouse Scroll Wheel Increment | Mouse Scroll Wheel Increment |
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 🏗️ Architecture
|
|
100
|
+
|
|
101
|
+
```mermaid
|
|
102
|
+
flowchart TD
|
|
103
|
+
subgraph Host ["Desktop Host (Windows)"]
|
|
104
|
+
MSS["mss (Screen Capture 60 FPS)"] --> BGRA["Direct BGRA Frame (No cvtColor)"]
|
|
105
|
+
BGRA --> CV2["cv2.imencode (JPEG Compression)"]
|
|
106
|
+
CV2 --> TIME["Timestamp Header (8-Byte Double)"]
|
|
107
|
+
TIME --> ASYNC["Zero-Copy Queue (asyncio.Queue)"]
|
|
108
|
+
ASYNC --> WS_STREAM["/ws/stream (Binary WebSocket)"]
|
|
109
|
+
|
|
110
|
+
WS_INPUT["/ws/input (JSON WebSocket)"] --> CTRL["InputController (pynput)"]
|
|
111
|
+
CTRL --> OS_INPUT["Windows OS Hardware Emulation"]
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
subgraph Client ["Mobile Client (Browser / PWA)"]
|
|
115
|
+
WS_STREAM --> BITMAP["createImageBitmap (Worker-like GPU decode)"]
|
|
116
|
+
BITMAP --> RAF["requestAnimationFrame() -> HTML5 Canvas"]
|
|
117
|
+
|
|
118
|
+
TOUCH["Multi-Touch Engine (Direct & Relative)"] --> WS_INPUT
|
|
119
|
+
KB["Virtual Keyboard & Sticky Modifiers"] --> WS_INPUT
|
|
120
|
+
ACTIONS["Floating Island (Click, Hold, Scroll)"] --> WS_INPUT
|
|
121
|
+
end
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 🛡️ Security & Sandbox
|
|
127
|
+
|
|
128
|
+
Volatouch implements defense-in-depth security to protect your workstation on shared Wi-Fi networks:
|
|
129
|
+
|
|
130
|
+
1. **Subnet Verification (RFC-1918):** Only clients within the identical `/24` private local subnet as the host machine can access endpoints or initiate WebSocket handshakes. External and non-local requests receive an immediate `403 Forbidden`.
|
|
131
|
+
2. **Strict Origin & CSP Isolation:** Rejects unauthorized origin headers; enforces modern `Content-Security-Policy`, `X-Frame-Options: DENY`, and strict frame-ancestors restrictions.
|
|
132
|
+
3. **Whitelisted Hardware Commands:** Only explicit, sanitized commands (`mouse_move`, `mouse_click`, `key_tap`, etc.) are processed. Arbitrary shell commands are impossible.
|
|
133
|
+
4. **Failsafe Key Release:** Whenever a WebSocket connection drops, all pressed keys and mouse buttons are instantly released via `input_ctrl.release_all()` to prevent stuck keys on your PC.
|
|
134
|
+
5. **Private Console Telemetry:** No third-party tracking, no external web calls, and silenced debug logs. The host console only shows an active connection counter.
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## ⚙️ Settings & Diagnostics
|
|
139
|
+
|
|
140
|
+
Tap the floating gear icon to access:
|
|
141
|
+
- **JPEG Quality Slider (15% – 95%):** Dynamically tune bandwidth usage vs. visual clarity in real time.
|
|
142
|
+
- **Resolution Scale Slider (30% – 100%):** Downscale resolution for ultra-high FPS over congested Wi-Fi channels.
|
|
143
|
+
- **Cursor Speed & Acceleration:** Fine-tune trackpad velocity and exponential sensitivity curves.
|
|
144
|
+
- **Real-time Latency & FPS Badge:** Monitor live stream frame rates and hardware round-trip ping in milliseconds.
|
|
145
|
+
- **Language Selector:** Seamlessly switch between **English** and **Türkçe**.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 💻 Running From Source
|
|
150
|
+
|
|
151
|
+
If you prefer building and developing Volatouch locally:
|
|
152
|
+
|
|
153
|
+
### Prerequisites
|
|
154
|
+
- Python 3.8+ (Recommended: Python 3.10+)
|
|
155
|
+
- Node.js 18+ (for building the frontend)
|
|
156
|
+
|
|
157
|
+
### Setup
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# 1. Clone repository
|
|
161
|
+
git clone https://github.com/ugurturkerkebeci/volatouch.git
|
|
162
|
+
cd volatouch
|
|
163
|
+
|
|
164
|
+
# 2. Install Python dependencies
|
|
165
|
+
pip install -r backend/requirements.txt
|
|
166
|
+
|
|
167
|
+
# 3. Build React frontend
|
|
168
|
+
cd frontend
|
|
169
|
+
npm install
|
|
170
|
+
npm run build
|
|
171
|
+
cd ..
|
|
172
|
+
|
|
173
|
+
# 4. Run application
|
|
174
|
+
python run.py
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## 🇹🇷 Türkçe Rehber
|
|
180
|
+
|
|
181
|
+
Volatouch, aynı yerel Wi-Fi ağına bağlı bilgisayarınızı mobil cihazınızın web tarayıcısı üzerinden sıfıra yakın gecikmeyle (ultra-low latency) yönetmenizi sağlayan yüksek performanslı bir uzaktan kontrol ve hava trackpad sistemidir.
|
|
182
|
+
|
|
183
|
+
### Hızlı Kurulum (PyPI):
|
|
184
|
+
```bash
|
|
185
|
+
pip install volatouch
|
|
186
|
+
volatouch
|
|
187
|
+
```
|
|
188
|
+
Konsolda yazan adresi (örn. `http://192.168.1.5:8000`) telefonunuzun tarayıcısında açmanız yeterlidir.
|
|
189
|
+
|
|
190
|
+
### Başlıca Özellikler:
|
|
191
|
+
- **Sıfır Gecikme:** `mss` ve `OpenCV` tabanlı binary JPEG akışı, doğrudan GPU'da çizilen HTML5 Canvas ile tear veya kare düşmesi yaşatmaz.
|
|
192
|
+
- **Doğrudan ve Bağıl Mod:** İster ekrana dokunup imleci doğrudan oraya yönlendirin (Direct), ister dizüstü bilgisayar trackpad'i gibi kullanın (Relative).
|
|
193
|
+
- **Yüzen Fonksiyon Adası:** Sol tık, sağ tık, dosya sürüklemek için sol tık kilidi (`HOLD`), ve hassas kaydırma (`UP`/`DOWN`) butonları.
|
|
194
|
+
- **Dahili Türkçe/İngilizce QWERTY Klavye:** `Ctrl`, `Alt`, `Shift` gibi niteleyici tuşları basılı tutma desteği, F1–F12 tuşları ve ses/metin aktarım çekmecesi.
|
|
195
|
+
- **Yerel Ağ Güvenliği:** Yalnızca aynı yerel Wi-Fi alt ağındaki (subnet) cihazların bağlanmasına izin verir.
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## 📄 License
|
|
200
|
+
|
|
201
|
+
Distributed under the **MIT License**. See [`LICENSE`](./LICENSE) for full details.
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
<p align="center">
|
|
206
|
+
Crafted with ❤️ by <a href="https://github.com/ugurturkerkebeci">Uğur Türker Kebeci</a>
|
|
207
|
+
</p>
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "volatouch"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Ultra-low latency mobile air control & wireless trackpad for PC over local Wi-Fi."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
authors = [
|
|
11
|
+
{ name = "Uğur Türker Kebeci", email = "167927605+ugurturkerkebeci@users.noreply.github.com" }
|
|
12
|
+
]
|
|
13
|
+
license = { text = "MIT" }
|
|
14
|
+
keywords = ["remote-desktop", "trackpad", "air-control", "mouse", "keyboard", "low-latency", "screen-stream", "fastapi", "websockets"]
|
|
15
|
+
classifiers = [
|
|
16
|
+
"Development Status :: 5 - Production/Stable",
|
|
17
|
+
"Intended Audience :: Developers",
|
|
18
|
+
"Intended Audience :: End Users/Desktop",
|
|
19
|
+
"License :: OSI Approved :: MIT License",
|
|
20
|
+
"Operating System :: Microsoft :: Windows",
|
|
21
|
+
"Programming Language :: Python :: 3",
|
|
22
|
+
"Programming Language :: Python :: 3.8",
|
|
23
|
+
"Programming Language :: Python :: 3.9",
|
|
24
|
+
"Programming Language :: Python :: 3.10",
|
|
25
|
+
"Programming Language :: Python :: 3.11",
|
|
26
|
+
"Programming Language :: Python :: 3.12",
|
|
27
|
+
"Topic :: System :: Hardware",
|
|
28
|
+
"Topic :: Multimedia :: Graphics :: Capture",
|
|
29
|
+
]
|
|
30
|
+
requires-python = ">=3.8"
|
|
31
|
+
dependencies = [
|
|
32
|
+
"fastapi>=0.100.0",
|
|
33
|
+
"uvicorn[standard]>=0.22.0",
|
|
34
|
+
"websockets>=11.0",
|
|
35
|
+
"mss>=9.0.0",
|
|
36
|
+
"opencv-python>=4.8.0",
|
|
37
|
+
"pynput>=1.7.6",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
[project.urls]
|
|
41
|
+
Homepage = "https://github.com/ugurturkerkebeci/volatouch"
|
|
42
|
+
Repository = "https://github.com/ugurturkerkebeci/volatouch"
|
|
43
|
+
Issues = "https://github.com/ugurturkerkebeci/volatouch/issues"
|
|
44
|
+
|
|
45
|
+
[project.scripts]
|
|
46
|
+
volatouch = "volatouch.cli:main"
|
|
47
|
+
|
|
48
|
+
[tool.setuptools]
|
|
49
|
+
packages = ["volatouch"]
|
|
50
|
+
|
|
51
|
+
[tool.setuptools.package-data]
|
|
52
|
+
volatouch = ["web/**/*", "web/*"]
|
volatouch-1.0.0/setup.py
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
from setuptools import setup, find_packages
|
|
2
|
+
import os
|
|
3
|
+
|
|
4
|
+
with open("README.md", "r", encoding="utf-8") as fh:
|
|
5
|
+
long_description = fh.read()
|
|
6
|
+
|
|
7
|
+
setup(
|
|
8
|
+
name="volatouch",
|
|
9
|
+
version="1.0.0",
|
|
10
|
+
author="Uğur Türker Kebeci",
|
|
11
|
+
author_email="167927605+ugurturkerkebeci@users.noreply.github.com",
|
|
12
|
+
description="Ultra-low latency mobile air control & wireless trackpad for PC over local Wi-Fi.",
|
|
13
|
+
long_description=long_description,
|
|
14
|
+
long_description_content_type="text/markdown",
|
|
15
|
+
url="https://github.com/ugurturkerkebeci/volatouch",
|
|
16
|
+
project_urls={
|
|
17
|
+
"Bug Tracker": "https://github.com/ugurturkerkebeci/volatouch/issues",
|
|
18
|
+
"Source Code": "https://github.com/ugurturkerkebeci/volatouch",
|
|
19
|
+
},
|
|
20
|
+
packages=find_packages(include=["volatouch", "volatouch.*"]),
|
|
21
|
+
package_data={
|
|
22
|
+
"volatouch": ["web/**/*", "web/*"],
|
|
23
|
+
},
|
|
24
|
+
include_package_data=True,
|
|
25
|
+
classifiers=[
|
|
26
|
+
"Development Status :: 5 - Production/Stable",
|
|
27
|
+
"Intended Audience :: Developers",
|
|
28
|
+
"Intended Audience :: End Users/Desktop",
|
|
29
|
+
"License :: OSI Approved :: MIT License",
|
|
30
|
+
"Operating System :: Microsoft :: Windows",
|
|
31
|
+
"Programming Language :: Python :: 3",
|
|
32
|
+
"Programming Language :: Python :: 3.8",
|
|
33
|
+
"Programming Language :: Python :: 3.9",
|
|
34
|
+
"Programming Language :: Python :: 3.10",
|
|
35
|
+
"Programming Language :: Python :: 3.11",
|
|
36
|
+
"Programming Language :: Python :: 3.12",
|
|
37
|
+
"Topic :: System :: Hardware",
|
|
38
|
+
"Topic :: Multimedia :: Graphics :: Capture",
|
|
39
|
+
],
|
|
40
|
+
python_requires=">=3.8",
|
|
41
|
+
install_requires=[
|
|
42
|
+
"fastapi>=0.100.0",
|
|
43
|
+
"uvicorn[standard]>=0.22.0",
|
|
44
|
+
"websockets>=11.0",
|
|
45
|
+
"mss>=9.0.0",
|
|
46
|
+
"opencv-python>=4.8.0",
|
|
47
|
+
"pynput>=1.7.6",
|
|
48
|
+
],
|
|
49
|
+
entry_points={
|
|
50
|
+
"console_scripts": [
|
|
51
|
+
"volatouch=volatouch.cli:main",
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import sys
|
|
3
|
+
import uvicorn
|
|
4
|
+
from volatouch.config import config, LOCAL_IP
|
|
5
|
+
|
|
6
|
+
def main():
|
|
7
|
+
parser = argparse.ArgumentParser(
|
|
8
|
+
prog="volatouch",
|
|
9
|
+
description="Volatouch: Zero-Latency Mobile Air Control & Remote Trackpad for PC over local Wi-Fi."
|
|
10
|
+
)
|
|
11
|
+
parser.add_argument("--host", default=config.host, help=f"Host interface to bind (default: {config.host})")
|
|
12
|
+
parser.add_argument("--port", type=int, default=config.port, help=f"Port to listen on (default: {config.port})")
|
|
13
|
+
parser.add_argument("--version", action="version", version="%(prog)s 1.0.0")
|
|
14
|
+
args = parser.parse_args()
|
|
15
|
+
|
|
16
|
+
uvicorn.run("volatouch.main:app", host=args.host, port=args.port, log_level="warning", access_log=False)
|
|
17
|
+
|
|
18
|
+
if __name__ == "__main__":
|
|
19
|
+
main()
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import socket
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
|
|
4
|
+
def get_local_ip() -> str:
|
|
5
|
+
"""Attempts to find the LAN IP address of this machine."""
|
|
6
|
+
try:
|
|
7
|
+
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
8
|
+
# Does not actually create a connection, just gets outbound interface
|
|
9
|
+
s.connect(("8.8.8.8", 80))
|
|
10
|
+
ip = s.getsockname()[0]
|
|
11
|
+
s.close()
|
|
12
|
+
return ip
|
|
13
|
+
except Exception:
|
|
14
|
+
return "127.0.0.1"
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class StreamConfig:
|
|
18
|
+
host: str = "0.0.0.0"
|
|
19
|
+
port: int = 8000
|
|
20
|
+
default_quality: int = 55 # JPEG quality (10-100)
|
|
21
|
+
default_scale: float = 0.70 # Resolution scale (0.3 - 1.0)
|
|
22
|
+
target_fps: int = 60 # Maximum capture rate
|
|
23
|
+
monitor_index: int = 1 # Primary monitor in mss
|
|
24
|
+
|
|
25
|
+
config = StreamConfig()
|
|
26
|
+
LOCAL_IP = get_local_ip()
|