Skip to content

Releases: princesavsaviya/TethrLink

Patch release. Fixes the snap package; the Android app is unchanged from 2.0.0.

Choose a tag to compare

@princesavsaviya princesavsaviya released this 25 Aug 18:03
  • Snap: H.264 now works. The package shipped without x264enc and
    h264parse — the gnome platform provides neither — so building the pipeline
    failed at connect time and the client dropped back to scanning. Both plugins
    are now bundled. JPEG was unaffected.
  • Launcher no longer picks up the working directory. python3 -m puts the
    current directory first on sys.path, so running tethrlink from a folder
    containing a server/ package imported that instead of the installed code.

Hardware encoding is still unavailable in the snap — VA-API needs a driver
stack the gnome platform doesn't provide. The .deb and from-source installs
use hardware encoding normally.

TethrLink 2.0.0 — touch input

Choose a tag to compare

@princesavsaviya princesavsaviya released this 19 Aug 23:07

Upgrading from 1.0.0? Uninstall it first. This release is signed with a
different key, so Android will refuse to install over the old version —
you'll see "App not installed" with no further explanation. Uninstalling
loses no data you'd miss; TethrLink keeps no state on the tablet.

Your tablet stops being a screen you look at and becomes one you use.

Touch input

The tablet can now drive your PC's pointer. Off by default — something that can drive your desktop should be a choice you make, so enable it in the server window. The setting is remembered, and can be toggled while a client is connected.

Gesture Effect
Tap Left click
Drag Press, move, release
Long press Right click
Two-finger drag Scroll

Timings come from Android's own ViewConfiguration, so they match every other app on the tablet and honour accessibility settings.

Two things worth knowing going in:

  • There is no hover. Every touch clicks. That's inherent to driving a pointer by absolute position — tooltips and hover-triggered menus won't open from touch.
  • It can't reach your laptop's own screen. Input goes through GNOME's RemoteDesktop API and is scoped to the virtual display by the platform itself.

Press Back on the tablet to reveal the disconnect overlay while streaming.

Who the server will talk to

The server now serves only peers reachable over a USB-attached network interface, plus loopback. Wi-Fi and container bridges are refused. This mattered less when reaching the port only meant seeing your screen; with input, it would mean controlling the machine.

The tether subnet is detected at runtime rather than assumed. An earlier version hardcoded 192.168.42.0/24, the AOSP default, and broke for every device that hands out something else. TETHRLINK_TETHER_SUBNET overrides it.

There is still no authentication. Over a cable that's a reasonable boundary; any future transport that isn't a cable has to add pairing first.

Also since 1.0.0

  • Hardware H.264 with runtime encoder negotiation — NVENC, VA-API and QSV candidates are tried hardware-first and accepted only after genuinely encoding a frame at the real capture size. The winner is cached against a fingerprint of your GStreamer install, so a driver upgrade re-probes automatically. Falls back to software encoding when nothing works.
  • Display geometry derived from both ends — the virtual monitor takes its height from your PC and its aspect ratio from the tablet, so the shared edge is fully traversable and nothing is stretched. A 1920×1080 PC with a 2960×1848 tablet gives 1730×1080.
  • Frames drop before encoding, never after, so a dropped frame lowers the frame rate instead of corrupting the stream until the next keyframe.
  • A constant frame rate is manufactured downstream, so a static screen doesn't stall the pipeline.
  • Rebuilt landing page and a README rewritten against the source.

Requirements

  • GNOME on Wayland for the virtual display and for touch. X11 sessions fall back to JPEG at the PC's own resolution and get video only — the server window says so rather than claiming otherwise.
  • Python 3.10+, GStreamer 1.20+ with the PipeWire, base, good and ugly plugin sets, GTK4 and Libadwaita.
  • Android 5.0+ (API 21) with USB tethering.

Install

Snap:

sudo snap install tethrlink

Or grab tethrlink_all.deb below:

sudo apt install ./tethrlink_all.deb

Then install tethrlink.apk on the tablet. Both halves are needed — the app doesn't work alone.

Known limitations

  • One client at a time; a second device gets a busy signal.
  • An idle session still costs about half a core, because holding a constant frame rate means running the pipeline even when nothing changes.
  • The frame rate is pinned per connection; changing it takes effect on the next one.
  • The process can crash on exit after an H.264 session, during GStreamer/NVENC teardown. It happens after streaming has ended and doesn't affect the session.

No end-to-end latency figure is quoted. Earlier documentation cited one; it wasn't reproducible, so it's been withdrawn rather than repeated.

TethrLink v1.0.0

Choose a tag to compare

@princesavsaviya princesavsaviya released this 20 Apr 03:30

TetherLink v1.0.0 — First Public Release

Turn your Android tablet into a wired second monitor for Linux over USB.
No Wi-Fi. No cloud. ~47 ms end-to-end latency.


What's included

  • GTK4 + Libadwaita desktop app — system tray, live stats, display arrangement
  • Mutter ScreenCast virtual display — independent screen space, not a mirror
  • Dual codec — JPEG and H.264, switchable at runtime with hot-reload FPS/quality
  • UDP auto-discovery — Android app finds the server automatically, no IP to type
  • USB-only transport — direct 192.168.42.x subnet, ~40 Mbps @ 45 FPS

Installation

Linux (.deb)

sudo dpkg -i python3-tetherlink_1.0.0-1_all.deb
sudo apt-get install -f