relay

Introduction: Share your connection. Instantly. Local-only hotspot connection sharing between Android and Windows.
More: Author   ReportBugs   
Tags:
Relay — share your phone's internet with your PC. اینترنت گوشی‌ات را با کامپیوترت به اشتراک بگذار.

Share your phone's internet with your PC.

Click one row. That's the entire setup.


Download for Windows   Download for Android

Always the newest release · all files & notes


CI E2E device lab Release License: GPL v3 Stars

🌍 English · فارسی


Your laptop has no internet. Your phone does. Relay moves it across — over your own Wi-Fi or the phone's hotspot, through an encrypted WireGuard tunnel, with no account, no server, and nothing leaving your two devices.

It is a free, open-source reverse tethering and internet sharing tool for Android → Windows. Every application on the PC goes through the phone — TCP and UDP — and no root is required.


📥 Download

File Who it's for
Windows Relay-Setup-x64.exe Windows 10/11. Installs for you alone.
Windows 32-bit Relay-Setup-x86.exe Only if you know you need it.
Android Relay-android-arm64-v8a Android 8.0+. Almost every phone since 2017.
Android (any) Relay-android-universal Bigger, works everywhere. Use this if the one above says "app not compatible".
Checksums SHA256SUMS.txt sha256sum -c SHA256SUMS.txt

The two Android files are the same app from the same build, differing only in which CPU architectures they carry. If one seems to behave differently, it is an older copy — uninstall and reinstall.

Windows warns on first run because the installer isn't code-signed yet — choose More info → Run anyway. Android says "App not installed"? Every cause I have seen is on this page.


🚀 Setup, in about five seconds

On your phone

  1. Turn on your hotspot — or put the phone and the PC on the same Wi-Fi.
  2. Open Relay and tap Start Sharing.
  3. The screen shows a QR code and a two-digit number.

On your PC

  1. Open Relay. Your phone is already in the list — click it.
  2. Tap Allow on the phone.

That is the whole thing. The PC is now on your phone's connection, and the window shows what it is carrying: live download and upload speed, totals, tunnel latency, and how long you have been connected.

No camera on the laptop? The two digits work on their own. Prefer the QR? It is still there.


✨ Everything Relay does

Sharing

One WireGuard tunnel TCP and UDP, so games, calls and installers are shared — not only the browser
Every application Nothing to configure per-app; the whole machine goes through the phone
No root On either device
Live statistics Download and upload speed, totals, tunnel latency and connection duration, read from the adapter
Honest state "Connected" means a real WireGuard handshake completed, not that an adapter exists
Follows a moving phone When the phone's DHCP lease changes, the tunnel is re-pointed instead of dying
Reconnects Bounded automatic recovery when the hotspot drops (ADR-0007)

Pairing

One click Phones already sharing appear on the PC's first screen
Two-digit code For a laptop with no camera
QR code Point the webcam at the phone
You approve it The phone asks before handing out keys, showing the requesting computer's address

On the phone

Quick Settings tile Start and stop from the notification shade, with the pairing code in the subtitle
Home screen widget The code, big enough to read while you're looking at the laptop
Long-press shortcut Start Sharing straight from the launcher icon
First-run setup Walks through notifications, battery exemption, the tile and the widget — and adds them for you where Android allows it
Themed icon Follows your wallpaper palette on Android 13+

On the PC

Lives in the tray With minimise and close controls, and Alt-Tab as a way back
Start with Windows A switch in Advanced, using the per-user key — no elevation
Connect notification When the tunnel comes up
Diagnostic report One button, copies what a bug report needs — and nothing is uploaded

Updates

Relay checks GitHub for a newer release and offers it. The download is checked against the SHA256SUMS.txt published in that same release, and nothing that fails is kept or installed — a rejected download is deleted rather than left on disk. That verification is the reason updating is allowed to be this automatic: Relay carries your whole connection, so replacing itself has to mean replacing itself with exactly the bytes the release published.

Android still shows its own install prompt. That is a floor the platform sets for any sideloaded app, not a choice made here.

Both

English and Persian throughout, right-to-left correct, with every user-facing string enforced by tests.


🔒 Nothing leaves your devices

This is the part I care most about, so it is a rule rather than a preference:

  • No accounts, no servers, no telemetry, no analytics. There is nothing to sign up for, and nowhere for your data to go.
  • The tunnel is WireGuard. Its keys are minted per pairing and destroyed when sharing stops.
  • Keys are never broadcast. The phone announces only enough to be found. The keys travel over a short exchange that you approve on screen, with the requesting computer's address shown.
  • Nothing outlives the process. Relay 2.0 changes no system-wide setting, so a crash cannot strand your machine in a broken state.

A change that adds a network call to anything but your own phone needs a very good reason and a written decision record. That rule is enforced in CLAUDE.md and in the ADRs.


🧪 How it's tested

Every commit installs the real app on real Android images (API 30–36) and drives it through its own UI: start sharing, show a QR, let a laptop pair by code, answer the prompt, stop. The Windows client runs against a live phone over adb. The real installer is installed, launched and uninstalled. The tunnel is brought up on a real WinTun adapter, and a real WireGuard handshake is verified across it.

Then the published APK is installed on Android 11 through 16 — because a release nobody can install is not a release.

What hardware still has not proved is written down in docs/testing.md rather than hidden. A pipeline that skipped its only meaningful test is also green, so the test names that matter are pinned and CI fails if one silently skips.


🗺️ What's next

✍️ Signed Windows installer 🔨 Next — it is the SmartScreen warning that stops people
🧩 Split tunnelling / per-app routing 🔨 Next — the tunnel is all-or-nothing today
📵 Sharing a phone that is itself on a VPN 🔨 Detected and explained, not yet solved — why
🐧 Linux client 💭 Wanted, and the best place to contribute — #74
🍎 macOS client 💭 Later
🌐 IPv6 💭 Later — the tunnel is IPv4 today
👥 More than one PC per session 🚫 Not planned — one peer per session by design (ADR-0009)
☁️ Accounts, servers, telemetry 🚫 Never

Known limitation: if the phone's own VPN captures Relay's UID, the tunnel's traffic is swallowed by that VPN. Relay detects this and says so, but cannot fix it from inside the app. The detail is written down.

Not yet proven on hardware: what CI cannot reach is listed in docs/testing.md rather than hidden.

The full picture, with reasoning: ROADMAP.md


🛠️ For developers

Two apps and one shared contract.

android/   Kotlin + Compose            windows/   .NET 8 + WinUI 3
wg/        WireGuard endpoint (Go)     shared/    the cross-platform contract
docs/      architecture, ADRs, testing, errors

There is no local build step. CI is the build system (ADR-0004) — push a branch and the pipeline builds it, tests it on real devices, and can cut a release. You do not need Android Studio, the .NET SDK or Go installed to contribute.

git clone https://github.com/Mahdi-mortazavi/relay.git
cd relay
git switch -c my-change
# edit, commit, push — CI builds and tests it for you

Three things that are easy to break by accident, worth knowing before your first PR:

  1. Change /shared first. The wire format, the state machine and the pairing rules live there, and both platforms are asserted against it. Editing one platform to match the other is how the two apps drift.
  2. Every user-facing string exists in English and Persian. This is enforced by tests, not by review.
  3. Green is not the same as tested. If you add a test that matters, add its name to the guard, so a run that silently skipped it cannot pass.

Start with docs/architecture.md and the ADRs — every significant decision is written down together with the reasoning that produced it. CONTRIBUTING.md has the rest, and issues that are a good place to start are labelled good first issue.


👋 Meet the developer

Mahdi Mortazavi

Mahdi Mortazavi · مهدی مرتضوی

Full-Stack Developer × Product Builder × Problem Solver

📍 Iran


I'm Mahdi. I don't build demos — I build the thing I needed, then keep working on it until it is good enough to hand to someone else.

Relay is exactly that. It began as my own frustration with a laptop that had no internet and a phone that did. Now it runs a device lab on every commit, ships on two platforms, and tells you the truth about what it cannot do yet. That last part is the standard I hold my work to — I would rather write down a limitation than let you discover it.

If Relay is useful to you, a ⭐ genuinely helps. If it breaks, tell me — I read everything.


💬 Let's talk

Telegram Community

Telegram   Email

GitHub   Website

🚀 Startup Legend — my community, where I share what I am building, what broke, and what I learned fixing it.


Made in Iran 🇮🇷 · GPL-3.0

"WireGuard" is a registered trademark of Jason A. Donenfeld.

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools
AI Daily Digest