Control a Windows desktop from an Android phone over the local network — a Monect-style remote: touch trackpad, keyboard, media keys, screen mirroring, casting and file transfer. No cloud, no relay — the phone talks directly to a small server running on the PC.
Pairing and settings — find the PC on the LAN, then tune how the trackpad feels
Control — the four ways to drive the PC by hand, behind one tab
Monitor — the PC's desktop, live
Transfer — push things across, or go and fetch them
Deck — what the machine is running, and how hard it is working
Browser and Assistant
Real captures of one running build — a paired phone over adb, and the tray
window straight off the PC. The phone's status bar is cropped so the set frames
identically; the shared folder, the share thread and the assistant conversation are
staged; and the LAN addresses, the Windows username and the phone's own name are
redrawn as neutral stand-ins. Nothing else is retouched. Re-shooting them is in
docs/development.md.
- Drive the PC by hand — a precision trackpad (multi-finger gestures, momentum, fine-control gain curve), a keyboard, media keys, and a TV-style D-pad remote for the couch.
- See the screen — live MJPEG mirroring at ~14.5fps, per-monitor, pinch to zoom to 4×, tap to click where you looked.
- Watch the machine — a live resource dashboard drawn as an instrument panel: CPU per core, memory, a minute of history, network throughput, every drive, and what's using the most CPU right now. The PC only samples itself while that screen is open.
- Play and cast — what the PC is playing shows up with cover art and a real scrubber; send a link or a local file to the PC, a Roku or a DLNA television.
- Browse the web — an in-app browser that blocks ads, trackers and popups as you go, auto-declines cookie prompts from the major consent-banner vendors, and hands any video it finds straight to the cast button.
- Move things across — the phone's system share sheet and the PC's
Ctrl+Alt+Vpush links, images and files either way, onto the receiving device's clipboard before the notification lands. - Browse and transfer files — list, download and upload against a shared folder on the PC.
- Make it yours — light and dark are the same instrument under different lighting, and Settings → Colour swaps the accent between four pairs. Every one of them is checked against WCAG on both themes, so the picker can't produce a screen you can't read.
- Ask the assistant — one conversation shared by the phone and the PC, which can also act on the PC (media keys, shortcuts, typing, power) with every action approved separately. Needs agent-platform — see below.
Every v* tag builds both halves and attaches them to a GitHub
release:
PortalRemote-Setup-<version>.exe (the installer), PortalRemote.exe (the same app as
one portable file) and PortalRemote-<version>.apk. All three are self-contained — no
.NET needed on the PC.
- Run
PortalRemote-Setup-<version>.exeon the PC. It installs for you alone — no admin prompt — leaves a Start-menu entry, and starts Portal Remote when you sign in, so the phone can still find the PC after a reboot. It opens the window above and drops a tray icon. - Install the APK on a phone on the same Wi-Fi and open it.
- Tap the PC in the discovered list and click Allow on the PC — or scan the QR code, which pairs without the prompt.
Both halves update themselves from those releases, and neither phones home otherwise — the only request is to GitHub's public release API, when you ask.
Building from source instead: docs/development.md.
Take the installer unless you have a reason not to. PortalRemote.exe on its own is the
same program and runs fine from wherever you put it, but it is a file you have to
remember: nothing starts it after a reboot until you tick Start Portal Remote when I
sign in in the window, and that setting records the path it was ticked at — move or
delete that copy afterwards and the app quietly stops coming back. The installer puts it
somewhere stable first and registers that.
It installs to %LOCALAPPDATA%\Programs\Portal Remote, not Program Files, and that is
deliberate: the app replaces its own .exe when it updates itself, which a program running
as you cannot do inside Program Files. Uninstall from Settings → Apps. Your config
and pairing token live in %APPDATA%\portal-remote and are left behind on purpose, so
reinstalling does not make every paired phone scan a new code.
Expected, on both halves. Neither download is signed by a certificate authority, so Windows and Android each say so in the strongest words they have.
- PC — SmartScreen shows Windows protected your PC and names an unknown publisher. More info → Run anyway. Defender may also quarantine the download first: the exe is a compressed self-extracting bundle of the whole .NET runtime, which is a shape installers and packers share, and unsigned files in that shape get flagged on reputation alone.
- Phone — Install unknown apps has to be allowed for whatever app you downloaded the APK with, because it did not come from Play.
Before clicking through either, check the download against SHA256SUMS.txt on the same
release — it is attached to every tag and covers every file on it, and is what tells a
real download apart from a tampered one:
Get-FileHash PortalRemote-Setup-0.6.0.exe -Algorithm SHA256The fix for the PC prompt is a code-signing certificate, not a code change. The release
workflow already signs both the exe and the installer when WINDOWS_CERT_BASE64 and
WINDOWS_CERT_PASSWORD are set as repository secrets, and ships them unsigned when they
are not. Note that an OV certificate quiets SmartScreen only once the signed builds
accumulate reputation; an EV certificate clears it from the first download.
Everything above works on its own. The assistant is the one feature with an outside
dependency: it is backed by agent-platform
— agent-platformd, a small Rust server that holds the model provider — and until that is
running on the PC, the assistant says Not running and does nothing else.
Portal Remote installs it for you. In the window, next to Assistant, press Set up:
- It fetches the newest Windows server build from agent-platform's GitHub releases.
- Unzips it into
%APPDATA%\portal-remote\agent-platform— no installer, no elevation. - Starts it and waits for it to answer on
http://127.0.0.1:18410.
That path is remembered, so afterwards the same button just says Start. Already
running your own agent-platformd? Point AgentPlatform.BaseUrl (and ExePath, if you
want the button to start yours) at it in %APPDATA%\portal-remote\config.json and Portal
Remote leaves it alone.
The phone never talks to agent-platform directly and never sees its token — the PC holds it and reaches the daemon over loopback. What the model provider does with a conversation is agent-platform's business, not this app's: docs/security.md.
android/ Kotlin + Jetpack Compose client
server/ .NET 8 / WinForms tray app + embedded Kestrel web server
installer/ — the Inno Setup script the release workflow packages it with
docs/ design notes, status, security model, and the screenshot assets above
| Doc | What's in it |
|---|---|
| docs/features.md | How each surface works and why it's shaped that way — mirroring, control, share, now playing, casting, pairing |
| docs/status.md | Phase-by-phase status, what's next, and what still needs hardware to verify |
| docs/security.md | The trust model — read this before pointing anything at it |
| docs/development.md | Running, testing and packaging both halves from source |
| docs/process.md | What live verification actually found, bug by bug |
| docs/design-system.md | Shared tokens, motion spec and per-screen component guidance |
| docs/phase4-casting.md · phase5-share.md · phase7-assistant.md | Per-phase plans |
Status in one line: pairing, trackpad/keyboard/media, files and mirroring are done and verified live; casting, quick share and the assistant are built but only partly exercised against real hardware — see docs/status.md.
Security in one line: LAN-only, one shared bearer token, and holding that token is the practical equivalent of sitting at the PC — see docs/security.md.

















