relay
Share your phone's internet with your PC.
Click one row. That's the entire setup.
Always the newest release · all files & notes
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
- Turn on your hotspot — or put the phone and the PC on the same Wi-Fi.
- Open Relay and tap Start Sharing.
- The screen shows a QR code and a two-digit number.
On your PC
- Open Relay. Your phone is already in the list — click it.
- 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:
- Change
/sharedfirst. 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. - Every user-facing string exists in English and Persian. This is enforced by tests, not by review.
- 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 · مهدی مرتضوی
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
🚀 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.
