Skip to content

Releases

Tandem 0.6.2

Choose a tag to compare

@saharshbaiju saharshbaiju released this 02 Nov 07:15

Security hardening for the computer side, contributed by @Photon6000 in #1. Nothing changes in how you pair or use Tandem, and the protocol is the same, so phones and computers on 0.6.x keep working together. Updating both is still recommended.

Fixes

  • Your USB phone can't be locked out by another program. Every phone on USB connects from 127.0.0.1. Before, five wrong pairing attempts from anything on that address (another program, or an old phone with an outdated key) locked the real phone out for a minute. Local addresses are no longer locked out. The 100-bit pairing key still makes guessing hopeless.
  • One device on your Wi-Fi can't block pairing. Connections still proving who they are used to share 8 slots, so one machine could take them all. Now each device gets 4, there are 32 in total, and 8 more are kept for phones that paired in the last hour. A connection that sends nothing is closed after 2 seconds instead of 6.
  • A paired phone can't flood the computer's memory. The daemon now reads at most 256 KB at a time and disconnects a phone that sends more than 5000 messages a second. A normal phone sends about 100 to 1200.
  • One phone can't take every finger on the shared touchscreen. Each phone can use up to 5.
  • Cleaner logs. Text sent by a phone that hasn't paired yet no longer ends up in the log, where it could confuse the TUI's client count.
  • The app refuses oversized messages while pairing. It checks the size before allocating any memory.

None of these let anyone see your screen or control your computer. Encryption and pairing were never affected.

Tested on the merged code: a harness running the real daemon passed 10 of 10 checks (5 of 10 on 0.6.1), and the app paired and streamed on an emulator.

Install

Phone (Android 8+): download Tandem.apk below on the phone and open it. It installs over 0.6.x or 0.5.x without pairing again.

Computer (Hyprland, or GNOME on Wayland):

curl -fsSL https://raw.githubusercontent.com/saharshbaiju/tandem/main/install.sh | bash

Files

File What it is
Tandem.apk / Tandem-0.6.2.apk The phone app (identical files; tap either one on the phone)
Tandem-0.6.2-debug.apk Tandem (debug): installs next to the app, for logs and testing
tandem-linux.tar.gz The computer side; install.sh fetches it for you
SHA256SUMS Checksums

Tandem 0.6.1

Choose a tag to compare

@saharshbaiju saharshbaiju released this 01 Nov 06:08

Hotfix for 0.6.0: the app closed as soon as you pressed Connect. Please update the phone app. The computer side is unchanged from 0.6.0.

Fix

  • 0.6.0 raised the priority of the video threads to keep latency low, but asked for it through the wrong Android call, which every phone rejects with an error. The app crashed the moment the stream started. The threads now get their higher priority the correct way.

Everything else in 0.6.0 applies: no freeze when dragging a window onto the phone, your monitors left exactly as they are, lower latency.

Install

Phone (Android 8+): download Tandem.apk below on the phone and open it. It installs over 0.6.0 or 0.5.x without pairing again.

Computer (Hyprland, or GNOME on Wayland), if you're still on 0.5.x:

curl -fsSL https://raw.githubusercontent.com/saharshbaiju/tandem/main/install.sh | bash

Files

File What it is
Tandem.apk / Tandem-0.6.1.apk The phone app (identical files; tap either one on the phone)
Tandem-0.6.1-debug.apk Tandem (debug): installs next to the app, for logs and testing
tandem-linux.tar.gz The computer side (same as 0.6.0); install.sh fetches it for you
SHA256SUMS Checksums

Tandem 0.6.0

Choose a tag to compare

@saharshbaiju saharshbaiju released this 01 Nov 05:39

Stability and latency release. Installs as an update over Tandem 0.5.x: no need to pair again. Update both the phone app and the computer side (run the install command again).

Fixes

  • The picture no longer stops when you drag a window onto the phone. On Hyprland the recorder released a burst of buffered duplicate frames after the phone screen had been idle, which pushed the phone behind until it froze. That is gone. A phone that falls behind now skips stale video and resumes from the latest keyframe straight away, and the app can ask the computer for a keyframe whenever its decoder needs one.
  • Your monitors stay exactly as they are. On some setups Tandem changed the main monitor's scale, resolution, refresh rate or position, and moved it to "auto" when disconnecting. Tandem now only ever touches its own virtual monitor, on old and new Hyprland configs (legacy and Lua), rotated screens and multi-monitor layouts. It also stopped taking over workspaces 1–10. On GNOME, existing monitors are re-sent exactly as they were.
  • The encoder restarts by itself if it crashes mid-session. Phones stay connected.
  • Reconnects reliably. A brief network error no longer stops the app with a false "update Tandem" message. A phone that drops off Wi-Fi is noticed within seconds, and the app reconnects when the network changes.

Lower latency

  • The app shows each frame the moment it is decoded. It used to wait for the next frame, so everything was a frame late.
  • Uses each phone's low-latency decoder mode where available, a low-latency Wi-Fi lock, and the display's refresh rate.
  • The computer forwards frames immediately, never queues seconds of video, and uses a smaller encoder buffer (about 2 frames) on every encoder.

Works on more machines

  • More encoder fallbacks: i965 for older Intel, OpenH264 where x264 isn't packaged (Fedora, openSUSE).
  • Streams from the x264 software encoder decode correctly on every phone.
  • The app picks a decoder that supports the stream's size and frame rate, and recovers from decoder errors by itself.
  • Finds your Hyprland session even when started from ssh or systemd. Listens on IPv6 too, and moves to another port if one is taken.

Install

Phone (Android 8+): download Tandem.apk below on the phone and open it.

Computer (Hyprland, or GNOME on Wayland), to install or update:

curl -fsSL https://raw.githubusercontent.com/saharshbaiju/tandem/main/install.sh | bash

Files

File What it is
Tandem.apk / Tandem-0.6.0.apk The phone app (identical files; tap either one on the phone)
Tandem-0.6.0-debug.apk Tandem (debug): installs next to the app, for logs and testing
tandem-linux.tar.gz The computer side; install.sh fetches it for you
SHA256SUMS Checksums

Tandem 0.5.1

Choose a tag to compare

@saharshbaiju saharshbaiju released this 27 Oct 07:37

A new look for the phone app. Installs as an update over Tandem 0.5.0: no need to pair again.

What's new

  • OLED black. The app is always pure black, in the website's palette: black surfaces (those pixels are off), white text and a white main button, grey cards. It no longer follows wallpaper colours or light mode.
  • A cleaner connect screen. "Tandem" in ASCII, the same lettering as the splash and the website, with just the tagline beside the connect card: no logo tile, no "Not connected" chip.
  • Nothing over your desktop. The "Live" indicator is gone while streaming; a small pill appears only while connecting or reconnecting, when the picture may be frozen.
  • Fix: with Enter address manually open on a landscape phone, the connect card was taller than the screen and cut off Scan again. It now scrolls.

The computer side is unchanged from 0.5.0.

Install

Phone (Android 8+): download Tandem.apk below on the phone and open it.

Computer (Hyprland, or GNOME on Wayland), if you don't have Tandem yet:

curl -fsSL https://raw.githubusercontent.com/saharshbaiju/tandem/main/install.sh | bash

Coming from Screen Extender (amVD 0.4 or older)? See the 0.5.0 notes: Tandem is a separate app, and you pair once with the new QR code.

Files

File What it is
Tandem.apk / Tandem-0.5.1.apk The phone app (identical files; tap either one on the phone)
Tandem-0.5.1-debug.apk Tandem (debug): installs next to the app, for logs and testing
tandem-linux.tar.gz The computer side (same as 0.5.0); install.sh fetches it for you
SHA256SUMS Checksums

Tandem 0.5.0

Choose a tag to compare

@saharshbaiju saharshbaiju released this 27 Oct 03:05

amVD / Screen Extender is now Tandem: your Android phone or tablet as a real, low-latency second monitor for Linux.

Install

Computer (Hyprland, or GNOME on Wayland):

curl -fsSL https://raw.githubusercontent.com/saharshbaiju/tandem/main/install.sh | bash

Then open a new terminal, run tandem and choose Start Tandem.

Phone (Android 8+): download Tandem.apk below (the same file as Tandem-0.5.0.apk) on the phone and open it, then scan the QR code from the terminal.

Coming from Screen Extender (amVD 0.4 or older)

  • Tandem is a new app (package io.github.saharshbaiju.tandem), so it installs next to Screen Extender instead of replacing it. Uninstall Screen Extender.
  • Re-run the install line above. It removes the old amvd install; the command is now tandem. Settings, the pairing key and the certificate move over to ~/.config/tandem.
  • Pair again: scan the new QR code once. 0.4 apps can't connect to 0.5 computers, and the other way round.

What's new

  • Encrypted, paired connection. The video and touch input travel over TLS, and the phone pins the computer's certificate from the QR code. A pairing key proves both sides (HMAC), so another device on the network can't watch your screen or send touches. Details: docs/SECURITY.md.
  • No more main-screen frame drops on NVIDIA (Hyprland). Capture now goes through xdg-desktop-portal-hyprland, and frames stay on the GPU all the way to NVENC. Before, Hyprland copied every frame into RAM, which made the laptop's own screen stutter while streaming. In testing, Hyprland's main-thread load while streaming dropped from 28.6% to 20.6%, the same as idle.
  • Safer disconnect. The capture session is closed before the virtual monitor is removed, including after a crash.
  • A new look. An ASCII "T" app icon, and a launch splash taken from the website: the wordmark in characters, rippling open onto the connect screen.
  • Open source under GPL-3.0, with a credit that copies keep (see NOTICE).

Files

File What it is
Tandem.apk / Tandem-0.5.0.apk The phone app (identical files; tap either one on the phone)
Tandem-0.5.0-debug.apk Tandem (debug): installs next to the app, for logs and testing
tandem-linux.tar.gz The computer side; install.sh fetches it for you
SHA256SUMS Checksums

amVD 0.4.1

Choose a tag to compare

@saharshbaiju saharshbaiju released this 26 Oct 18:26

Install

PC (Ubuntu / Fedora / Arch), re-run to update:

curl -fsSL https://raw.githubusercontent.com/saharshbaiju/tandem/main/install.sh | bash

Phone: download amVD-0.4.1.apk on the phone and open it.

"App not installed" / "package conflicts with an existing package"?
Your phone has an older Screen Extender signed with a different key (a test
build from before 0.4.0). Android won't let one key's app replace another's:
uninstall Screen Extender once, then install this APK. Later updates
install over it normally. (amVD-0.4.1-debug.apk is a separate app,
Screen Extender (debug), which is why it installed when the normal one didn't.)

Fixes

  • python gi [missing] even after installing python3-gobject (Fedora) and
    _curses.error: setupterm: could not find terminfo database (Arch): both
    happened when another python3 (miniconda, pyenv, a venv) came first on
    PATH. amvd, start-extender.sh and the installer now always use the
    system /usr/bin/python3 (override with AMVD_PYTHON=…).
  • Hyprland: pressing d (disconnect) no longer risks freezing the
    compositor. Capture is fully stopped before the virtual monitor is removed.

Files

File
amVD-0.4.1.apk the app (release key)
amVD-0.4.1-debug.apk debug build, installs next to the app, for testing
amvd-linux.tar.gz PC side (fetched by install.sh)
SHA256SUMS checksums

amVD 0.4.0

Choose a tag to compare

@saharshbaiju saharshbaiju released this 26 Oct 18:25

Touch input — the phone is now a touch monitor

Tap, drag, scroll and pinch on the phone to control what's on it. Touches go through a virtual touchscreen, so your computer's mouse pointer stays where it is.

  • Only paired phones can control the desktop. The QR code now carries a pairing key; a phone must scan it before it can send touches. Configure → Paired phones → forget all revokes every phone. (Video works as before for any phone that connects.)
  • Hyprland: one-time setup for /dev/uinput (a udev rule). The installer offers it, or press t in the live view when it says Touch: needs one-time setup.
  • GNOME (Ubuntu / Fedora): nothing to set up — touches go through Mutter's RemoteDesktop API.
  • Taps act like a touchscreen: double-tap ≈ double-click, touch-and-hold opens context menus, dragging scrolls in browsers.

Downloads

File What
amVD-0.4.0.apk The phone app (signed release).
amVD-0.4.0-debug.apk Debug build for testing: installs next to the normal app as Screen Extender (debug).
amvd-linux.tar.gz The computer side, used by the installer.

Updating the computer: re-run
curl -fsSL https://raw.githubusercontent.com/saharshbaiju/tandem/main/install.sh | bash

Updating the phone: install amVD-0.4.0.apk. If you have a pre-0.3 build (0.2) it was signed with a different key — uninstall it once first. Then scan the QR again to enable touch.

amVD 0.3.1

Choose a tag to compare

@saharshbaiju saharshbaiju released this 26 Oct 18:24

PC-side fixes for "the phone won't connect". The Android app is unchanged (same signed 0.3.0 APK).

Why a phone can't connect — now shown in amvd

  • While waiting for the phone, the live view shows connection checks: USB cable, firewall, Wi-Fi.
  • Firewalls (ufw, firewalld, nftables, iptables) are detected without root; press f to open port 5000. Arch's stock nftables config blocks everything but SSH.
  • USB tethering (no USB debugging needed) is detected by driver. If the tether link gets no IP address (Hyprland setups with only iwd or systemd-networkd), press u to fix it.
  • USB debugging that hasn't been accepted on the phone is flagged.
  • The installer offers to open the firewall port.

Hyprland on Intel

  • A hardware encoder that hangs without output now falls back to x264 after 4 s, instead of leaving the phone on a black screen.
  • The Dependencies screen suggests the VA-API driver for your GPU (intel-media-driver / libva-mesa-driver).

Update: re-run

curl -fsSL https://raw.githubusercontent.com/saharshbaiju/tandem/main/install.sh | bash

amVD 0.3.0

Choose a tag to compare

@saharshbaiju saharshbaiju released this 26 Oct 18:24

Use an Android phone as a real, low-latency second monitor for Linux.

Install

Computer (Ubuntu 22.04+, Fedora 36+, Arch; GNOME on Wayland or Hyprland):

curl -fsSL https://raw.githubusercontent.com/saharshbaiju/tandem/main/install.sh | bash

Open a new terminal and run amvd → Start extender.

Phone (Android 8+): download amVD-0.3.0.apk below and install it. Then tap Scan QR code and scan the terminal.

If you installed an earlier debug build, uninstall it first: this release is signed with a new key.

What's new

  • Fixed the "connects, then disconnects by itself" loop
  • Ubuntu and Fedora (GNOME) support via Mutter's virtual monitor
  • Pair by scanning a QR code in the terminal; the USB cable works automatically when USB debugging is on
  • Redesigned Material 3 app with a water-ripple connect transition
  • Hyprland: the video encoder follows the GPU the compositor renders on (NVENC / VA-API), with an x264 fallback
  • One-line installer with an amvd command

SHA256SUMS lists the checksums of the files below.