Privacy-first, open-source viewer for cheap USB endoscopes that ship with untrusted vendor apps.
The full privacy policy is in docs/privacy-policy.md: no permissions, no network, no data collected.
First supported device: USB 2CE3:3828 / 0329:2022 endoscopes. Verified on hardware in the i4season-yuv
personality (single interface, YUYV); the useeplus personality (dual interface, MJPEG) is implemented
from public protocol documentation and has not been exercised on a device here.
Phase 1 = Windows dev bench. See docs/superpowers/specs/ for the design and docs/windows-setup.md
for the one-time WinUSB driver step.
.\gradlew.bat :core:test # protocol tests
.\gradlew.bat :desktop:probe --args="--list" # what libusb can see
.\gradlew.bat :desktop:run # the viewer
Protocol documentation reimplemented from: hbens/geek-szitman-supercamera (CC0), echase/ProbeView (MIT), MAkcanca/useeplus-linux-driver (GPL-3, reference only), jmz3/EndoscopeCamera, NinesLastGoal/supercamera_WIN10.
.\gradlew.bat :desktop:run --args="--replay core/src/test/resources/fixtures/i4season-yuv-320x240.upkt"
| Driver | USB IDs | Layout | Picture |
|---|---|---|---|
i4season-yuv |
2CE3:3828, 0329:2022 | one interface FF/F0/01 | 320x240 YUYV, ~11 fps (verified on hardware) |
useeplus |
2CE3:3828, 0329:2022 | interfaces FF/F0/00 + FF/F0/01 | 640x480 MJPEG (from public docs; untested here) |
uvc-bulk |
any | USB Video Class, bulk streaming endpoint | MJPEG or YUY2 at the camera's default frame (unit-tested only; no UVC hardware yet; isochronous cameras are refused with a message) |
Phase 1 (Windows dev bench) accepted 2026-09-09 against an i4season "su4p-002" (2CE3:3828, firmware 5.0.13).
Phases 2, 3a and 3b followed; next is launch prep (see docs/next-steps.md).
.\gradlew.bat :android:assembleDebug # builds; fails if any dependency adds the INTERNET permission
C:\platform-tools\adb.exe install -r android\build\outputs\apk\debug\android-debug.apk
Plug the endoscope into the phone; Android offers to open USB Scope. Photos go to Pictures/USB Scope and clips to
Movies/USB Scope through MediaStore, so the app requests no system permissions at all. (The trust screen reports
"Permissions requested: 0". The merged manifest does contain one app-private signature permission injected by
AndroidX for its own broadcast receivers — it is defined by the app, granted only to the app, invisible to every
other app, and is not a system permission; the count excludes it and says so in a footnote.) Debug builds add a
developer sheet — replay the bundled capture without hardware, log per-second frame timing under the tag
ScopeViewModel, copy diagnostics — reached by a long-press on the version line in About. Requires the Android SDK
(compileSdk 37, targetSdk 36, minSdk 29); see docs/dependencies.md.
Phase 2 accepted 2026-09-10 on a Galaxy Z Fold 7. Notes: docs/phase2-notes.md, then docs/phase3b-notes.md.
- Live view — full screen, black letterbox. A status chip (connection dot, state, fps) top-left, a REC badge with elapsed time top-right, and a translucent sheet of eight controls along the bottom: snapshot, record, rotate, mirror, denoise, stats, settings, about. The sheet fades after four seconds without a touch while streaming and comes back on a tap; the REC badge never fades. On a Fold-open or tablet window the sheet becomes a rail down the side. A dismissable tips card explains the cable button and where files land on first launch.
- Settings — denoise and its strength, sharpening and its strength, the cable button's double-press window, haptics, keep screen on while streaming, the stats overlay, the devices whose rotation and mirror the app has remembered (with "Forget"), and "Show tips again". Everything persists across restarts.
- About & privacy — the permission count, the source link, the MIT licence, attribution to the prior reverse-engineering projects, version and build id.
- Temporal denoise (toggle in both apps): adaptive frame blending that removes sensor grain when the probe is still and passes moving detail through. Snapshots save what is on screen.
- Optional sharpening (Settings on Android, a checkbox on desktop; off by default): a mild luma unsharp mask
applied after denoise. What the camera actually delivers, why files are native 320x240 and never upscaled,
and what sharpening does and does not do:
docs/image-quality.md. - Cable button: one press takes a photo, two within the window (configurable, default 1.5 s) start or stop a clip.
- Snapshot and recording feedback: shutter flash, a "Saved" toast with a thumbnail, a spinner while the encoder starts, a REC timer.
- Per-device orientation memory: rotate or mirror once and that device comes up that way next time.
- Material 3 with dynamic colour on Android 12+, light and dark. The launcher icon is Anthony's design (see
art/). - About & privacy screen (Android) and About dialog (desktop): permissions the app does not have, source link, MIT license, attribution to the prior reverse-engineering projects, version and build id.
- Free and open source. A donation link in About opens your browser; the app itself still requests no permissions.