Free your AI gimbal webcam from its vendor software.
Aperio is a lightweight background daemon and GUI helper that replaces the required vendor companion app for AI motorized-gimbal webcams. It automatically aims your camera at a saved startup position and enables AI tracking whenever an application opens the camera — with no vendor software running, no telemetry, and no background bloat.
AI gimbal webcams (EMEET, OBSBOT, Insta360 Link, etc.) require the manufacturer's companion app to be installed and running before the camera's pan/tilt/tracking features work. These apps are resource-heavy, auto-update without asking, and run background processes at all times.
Aperio talks directly to the camera hardware over the vendor HID command channel, replacing all of that with a single silent background process and a simple one-time setup GUI.
| Camera | Notes |
|---|---|
| EMEET Pixy | Full support — AI tracking, auto privacy, startup position |
These cameras use motorized gimbals and companion apps with a similar design.
They may respond to the same HID command set but have not been tested.
Run research/diag.py to check compatibility on your hardware.
| Camera | |
|---|---|
| OBSBOT Tiny 2 | |
| OBSBOT Tiny 2 Lite | |
| OBSBOT Tiny 4K | |
| OBSBOT Meet 4K | |
| Insta360 Link | |
| Insta360 Link 2 |
If you get it working on any of the above, open a PR with the output of
research/diag.pyand the camera model.
- Windows 10/11
- Python 3.10+ — only needed for
aperio.py(the setup GUI) hidapiPython package:pip install hidapi- Rust toolchain — only needed if building
aperio.exefrom source
Option A — download a release (recommended)
Grab the latest aperio-vX.X.X-windows-x64.zip from the
Releases page and extract
everything into a folder (e.g. C:\aperio\).
Option B — build from source
cd daemon
cargo build --release
copy target\release\aperio.exe ..\
Run aperio.py once to aim the camera and save your settings:
python aperio.py
- Drag the joystick to pan/tilt the camera to your preferred position
- Or type coordinates directly (Pan ±150°, Tilt ±90°)
- Toggle AI Tracking — camera follows your face when in use
- Toggle Auto Privacy — lens parks down when no app is using the camera
- Toggle Flip image — 180° rotation for cameras mounted upside-down (hanging)
- Toggle Mirror image — horizontally mirror the video
- Toggle Local API server — control the camera from your own apps (off by default)
- Click Save, then close — the position is also programmed into the camera itself as its power-on default, so the lens rises already aimed at it when it wakes (no visible correction move)
install.bat
This registers aperio.exe as a Windows scheduled task that starts at logon
and runs silently in the background. It also puts the aperio command on your
PATH, so from any new PowerShell or cmd window you can reopen the setup GUI
with just:
aperio
(The Windows installer from the Releases page does the same.)
To remove everything run uninstall.bat.
The daemon watches the Windows CapabilityAccessManager webcam consent
registry for changes using zero-overhead event notification (no polling).
- App opens camera → the daemon immediately redirects the rising lens to the saved position (one continuous motion — no wake-at-center-then-slew), re-aims once the unpark settles, reapplies flip/mirror (the firmware reverts orientation to its own stored value on every wake), and enables Follow mode. Save also programs the position into the camera as its power-on default, so even a plain power-on comes up aimed correctly
- All apps close camera → daemon parks lens to Privacy (if Auto Privacy is on), after a 5-second grace period — apps that release and reopen the camera while renegotiating the stream (e.g. Windows Camera switching photo/video mode) see an untouched device instead of one that is busy parking. It drops the camera to Standard before parking: a camera parked in Follow wakes with the AI already hunting for a subject (a fast pan sweep) before any correction can land
Nothing is sent to the camera while idle — vendor HID commands reset the camera's privacy timer, so any keepalive would prevent it from ever sleeping.
Aperio can expose a small HTTP API so your own applications and scripts can
drive the camera. It is off by default — enable the Local API server
toggle in the setup GUI (aperio) and save. The daemon then listens on
127.0.0.1:4750 (loopback only; nothing is reachable from the network).
| Endpoint | Method | Description |
|---|---|---|
/ |
GET | Endpoint index (JSON) |
/status |
GET | Daemon info, camera presence, saved settings (JSON) |
/move?pan=X&tilt=Y |
POST | Absolute move in degrees (either param optional) |
/move_rel?pan=X&tilt=Y |
POST | Relative move in degrees |
/mode?value=follow|standard|privacy |
POST | Set device mode |
/flip?value=on|off |
POST | Flip the image 180° (upside-down mounting) |
/mirror?value=on|off |
POST | Mirror the image horizontally |
/home |
POST | Return to the saved startup position |
/shutdown |
POST | Turn the API server off (persists until re-enabled) |
Pan is clamped to ±150°, tilt to ±90°. Examples:
curl http://127.0.0.1:4750/status
curl -X POST "http://127.0.0.1:4750/move?pan=30&tilt=-10"
curl -X POST "http://127.0.0.1:4750/mode?value=follow"
curl -X POST http://127.0.0.1:4750/home
All settings toggles apply immediately — the daemon watches its config
directory, so flipping the API server on or off (in the GUI or via
POST /shutdown) takes effect within a second, no restart or camera event
needed. Click the ? next to the toggle in the GUI for a quick reference
of the endpoints — handy when wiring up your own joystick, stream deck
buttons, or OBS scripts.
| File | Purpose |
|---|---|
aperio.py |
Setup GUI — set startup position, toggle settings, save |
aperio.exe |
Background daemon (build from daemon/) |
daemon/ |
Rust source for the daemon |
install.bat |
Register daemon as a logon task + add the aperio command to PATH |
uninstall.bat |
Remove the scheduled task, aperio command, and PATH entry |
research/ |
Protocol research, diagnostic tool, per-camera data |
Config files are created by aperio.py on first save and live alongside the exe:
| File | Content |
|---|---|
start_pos.txt |
Startup pan/tilt in degrees |
last_track.state |
AI tracking on/off (1/0) |
auto_privacy.state |
Auto privacy on/off (1/0) |
joystick_invert.state |
Invert joystick on/off (1/0) |
image_flip.state |
Image flip 180° on/off (1/0; absent = never touch flip) |
image_mirror.state |
Horizontal mirror on/off (1/0; absent = never touch mirror) |
api_server.state |
Local API server on/off (1/0, default off) |
pip install hidapi
# List all HID devices to find your camera's VID and PID
python research/diag.py --list
# Run the read-only diagnostic against your camera
python research/diag.py --vid 0xXXXX --pid 0xXXXX
diag.py is completely read-only. It queries firmware versions, serial
numbers, motor positions, and device state without moving the camera or
changing any settings. If your camera responds to the command sweep it is
a strong indicator that full Aperio support is achievable.
research/ contains the reverse-engineering work behind Aperio, organized
per camera. See research/README.md for how to test your own camera.
research/
├── README.md how to test your camera + how to contribute
├── diag.py read-only diagnostic for any AI gimbal camera
└── EMEET Pixy/ confirmed working — full protocol reference
├── REpixy.md
├── usb_descriptors.txt
├── cmd_headers.txt
├── emeetlink_strings.txt
└── studio_symbols.txt
This software communicates directly with camera hardware over undocumented vendor protocols recovered through reverse engineering. It is provided as-is, with no warranty of any kind.
By using Aperio you accept full responsibility for any outcome, including but not limited to camera malfunction, firmware corruption, or permanent hardware damage. The author(s) are not responsible for bricked devices, voided warranties, or any other damage resulting from the use of this software.
Read the safety notes in research/EMEET Pixy/REpixy.md before sending any
commands beyond the documented safe set.
Apache 2.0 — see LICENSE and NOTICE.
Any derivative work or integration that builds on the protocol research in this repository must retain attribution to the original author.