A slow, cheap Android projector made fast, an Apple TV–style home screen, and an iPhone app that works as a remote, a mouse and a picture-control panel.
Built for an Allwinner H713 projector (HTC/Hotack firmware, Android 11, 1 GB RAM, reports itself as "ADT-3"). The same board ships under many brand names. If yours is Allwinner H713 with UI_Veng.projector firmware, this should apply almost as is.
Measured on the projector over ADB:
- Out of memory at idle. About 360 MB free and 275 MB already in swap with nothing open. The stock launcher used ~100 MB, a screensaver that wasn't even showing ~87 MB, and six screen-mirroring services ~75 MB.
- The brightness setting did nothing. Android's brightness doesn't reach the lamp on this board. The lamp is driven by a vendor service (
vendor.aw.homlet.tvsystem.tvserver@1.0::ITvServer), and it was already at 100. - The picture was shrunk. Screen Zoom was at 84%, so only about 1472×834 of the 1920×1080 panel was in use.
- The audio driver dies on sleep.
android.hardware.audio.serviceaborts when the projector suspends, and the speaker stays silent (Bluetooth still works) until a reboot.
On the projector (projector/)
- Debloat: 44 packages disabled with
pm disable-user(telemetry, factory test apps, OEM app store, updaters, mirroring stack, unused AOSP services). Nothing is uninstalled.restore.shre-enables all of it. - Launcher: the open-source CleanYourTV launcher with a theme tuned for this chip (
theme/config.json): cinematic top shelf, glass dock, app-colour glow, lifted tiles, spring focus, with reduced motion and no wallpaper so it stays smooth. - Screensaver fix: points the screensaver at the launcher's clock, so the projector never suspends and the audio driver never dies.
Smoothness, measured (dumpsys gfxinfo while moving along the dock):
| Setup | Frames missing 60 fps | Median frame |
|---|---|---|
| Every effect on | 76% | 27 ms |
| This theme | 22% | 11 ms |
On the iPhone (ios/ProjectorRemote/)
A SwiftUI app that talks to the projector directly over ADB on your Wi-Fi. No server or companion app is needed.
- Swipe mode, like the Siri Remote's clickpad: swipe to move, tap the middle for OK, tap or hold an edge to step or keep going.
- Mouse mode: a trackpad with Android's real mouse pointer. Tap to click, two fingers to scroll, two-finger tap to go back.
- Keyboard that types into search boxes letter by letter.
- Picture: lamp, brightness, contrast, saturation, tint, sharpness, colour temperature, noise reduction, dynamic contrast and backlight, all 7 picture modes, and an Accurate Colour preset. Changes apply live as you drag.
- Shortcuts: HDMI inputs, launch Netflix / YouTube / Prime / Hotstar, a sleep timer, and a power button that shuts down cleanly instead of suspending (see the audio bug above).
Why it's fast: instead of running input keyevent (a new Java process on the projector per press, about half a second on this chip), the app registers a virtual Bluetooth-style keyboard, mouse and media remote through Android's built-in hid tool over one long-lived ADB stream. A press is a few bytes on an open connection. Holding a key repeats natively, and Android shows its own pointer. Picture sliders work the same way: a small helper (projector/pq-helper/) stays running while the Picture panel is open and reads commands from the stream.
Memory: the remote costs the projector about 17 MB while the app is open, and the picture helper another 17 MB only while its panel is open. Both stop when the app goes to the background.
The app screenshots are from the iOS Simulator in the app's debug-only demo mode (-demo, plus -mode Mouse or -demoSheet keyboard|picture|settings), because the projector wasn't at hand. Everything else was measured on the real device.
- ADB client in Swift (
ADBClient.swift): the CNXN/AUTH/OPEN/WRTE protocol overNetwork.framework, withTCP_NODELAYand one write in flight per stream, coalescing anything written meanwhile. - RSA sign-in (
ADBKey.swift): a 2048-bit key in the iOS Keychain, the token signed as a SHA-1 digest with PKCS#1 v1.5, and the public key encoded in adb's ownadbkey.pubformat (mincryptRSAPublicKeywithn0invandR² mod n). It was verified byte for byte against a realadbkey.pub. - Virtual remote (
HIDRemote.swift): one HID descriptor with three reports (keyboard, 3-button mouse with wheel, consumer control). OK is sent as consumer usage0x41(KEY_SELECT, i.e.DPAD_CENTER), because TV apps such as Netflix ignoreENTER. - Lamp and picture (
Backlight.java): run withapp_process, borrowing the vendorITvServerclasses from the projector's own settings APK. PQ types: 1 brightness, 2 contrast, 3 saturation, 4 hue, 5 sharpness, 6 backlight, 7 temporal NR, 8 spatial NR, 9 dynamic contrast, 10 black extension, 11 gamma, 12 colour temperature (0–2), 13 dynamic backlight.
- Settings → About → press OK on Build seven times → Developer options → turn on USB debugging (and network/ADB debugging if listed).
- From a computer on the same Wi-Fi (
brew install --cask android-platform-tools):Readadb connect <projector-ip>:5555 # accept the prompt on the projector, tick "Always allow" grep -vE '^\s*(#|$)' projector/debloat.txt | while read -r p; do adb shell pm disable-user --user 0 "$p" </dev/null; done adb shell settings put secure screensaver_components com.gathin.tvhome/.ClockDream
debloat.txtfirst and comment out anything you use. It disables the built-in screen mirroring and the OEM updaters, for example. - Build and install the CleanYourTV launcher as its README describes, then push
theme/config.jsonwith itstools/theme.sh.
Undo everything: projector/restore.sh <projector-ip>:5555.
Needs Xcode and XcodeGen.
cd ios/ProjectorRemote
# set DEVELOPMENT_TEAM in project.yml to your Apple team ID
xcodegen generate && open ProjectorRemote.xcodeprojRun it on your iPhone, allow Local Network access, enter the projector's IP in Settings, and tick Always allow on the projector's prompt.
To rebuild the picture helper after changing it: projector/pq-helper/build.sh, then paste the printed base64 into ProjectorPQ.swift.
- 4K isn't possible. The panel has exactly one mode, 1920×1080 at 60 Hz, with no HDR. "4K" on the box means it accepts 4K over HDMI and scales it down.
- Netflix and Prime stream at about 480–540p on this projector. It has no hardware DRM (
liboemcrypto.sois absent, so Widevine L3), and those services cap L3 devices. YouTube isn't affected. For full-HD Netflix, plug in a certified streaming stick and switch to it with Inputs. - Network ADB on port 5555 is unencrypted. Anyone on your Wi-Fi could try to connect, though the projector still asks you to approve each new device. Keystrokes from the app's keyboard also travel in the clear, so don't type passwords through it: use the projector's own on-screen keyboard for those. This firmware also runs SELinux in permissive mode. Keep it on a network you trust.
- Launcher: CleanYourTV by Gathin23 (MIT). This repo only configures it.
- The rest, debugging and measurements: Shaaz Khan, with Claude Code.
MIT, see LICENSE.








