Skip to content

Navigation Menu

Sign in
Sign up

Repository files navigation

WinPad

Use your iPad as a second monitor for Windows over Wi-Fi — free, forever, no subscription.

An open-source, self-hosted alternative to Duet Display and Astropad: turn any iPad into a low-latency wireless extended display for your Windows PC, at your iPad's native resolution and refresh rate, with zero recurring cost.

License: MIT Platform Python Free forever Stars


WinPad turns your iPad into a real wireless second monitor for your Windows PC — no cable, no subscription, no recurring fee, ever. A small Windows sender captures your screen, hardware-encodes it with your GPU's own H.264 encoder (NVENC), and streams it over WebRTC directly into Safari on the iPad. There's nothing to install on the iPad itself: the receiver is just a web page, added to the Home Screen once for a fullscreen, chrome-free experience from then on.

It was built for one demanding use case — an extra monitor for PC gaming, where every millisecond of latency matters — but it works just as well as a free wireless second display for coding, streaming, or general desktop work.

Why WinPad exists

Commercial tools like Duet Display and Astropad solve this problem well, but they're closed-source, paid (often subscription-based), and built around a proprietary USB protocol. Building a fully USB-based alternative turned out to run into a hard wall:

  • Compiling and signing any native iOS/iPadOS app — even for personal use — requires a Mac with Xcode. There was only a Windows PC and an iPad available, no Mac in the loop.
  • Raw USB accessory data transfer on iPadOS requires Apple's MFi (Made for iPhone) licensing program — which is exactly what commercial tools like Duet Display pay for, and isn't available to an independent, open-source project.

The consequence: the iPad side can't be a native app at all. It has to run in Safari, which means the connection has to travel over a network socket, not the USB data pipe — i.e. Wi-Fi, using WebRTC. Once that constraint was accepted, it turned into an advantage: no App Store, no install step, no MFi fee to pass on to anyone — just a URL, opened once in Safari, that keeps working forever.

Why you might want this

  • It's free, and it stays free. Self-hosted, MIT-licensed, no account, no license key, no server costs, no subscription — not now, not later.
  • It's genuinely low-latency. Hardware H.264 (NVENC) straight from the GPU's own frame buffer, tuned for real-time delivery — roughly 30–60ms glass-to-glass on a healthy home Wi-Fi network, far below the 100ms+ typical of general-purpose wireless display tools.
  • The highest quality your iPad and Wi-Fi can actually deliver. Extend mode targets your iPad's exact native resolution and refresh rate (up to 120Hz on ProMotion models) with no letterboxing, hardware-decoded via VideoToolbox on the iPad side.
  • No app to install on the iPad. The receiver is a page in Safari. Add it to your Home Screen once and it behaves like a fullscreen app from then on — every time, indefinitely, with no update to manage.
  • True extend, not just mirror. With a virtual display driver, Windows treats your iPad as a real second desktop — its own space, not a copy of your main screen.
  • It finds itself. mDNS advertising means you bookmark winpad.local once and it keeps working even after your router hands your PC a new IP.

How it works

Windows PC iPad
┌─────────────────────────────────────────┐ Wi-Fi ┌──────────────┐
│ DXGI Desktop Duplication (screen grab) │ │ │
│ │ │ │ Safari │
│ ▼ │ │ (WebRTC │
│ NVENC / hardware H.264 encode │ WebRTC │ <video> │
│ │ │─ ─ ─ ─ ─ ─▶│ fullscreen)│
│ ▼ │ │ │
│ aiohttp + aiortc (signaling + transport) │ │ │
└─────────────────────────────────────────┘ └──────────────┘
  • Mirror mode streams your existing primary display.
  • Extend mode streams a second, independent desktop created by a virtual display driver — the iPad becomes genuinely extra screen space, not a copy of your main monitor.
  • The cursor is composited back in manually (DXGI capture is blind to the hardware cursor overlay), and codec negotiation is steered toward H.264 so iPadOS decodes it in hardware via VideoToolbox instead of falling back to software VP8.

Supported iPad models

Extend mode ships with a native, no-letterbox resolution profile for every current iPad, picked from a dropdown in the control panel:

iPad model Screen size Native resolution Max refresh
iPad Pro 13" (M4) 13.0" 2752 ×ばつ 2064 120Hz (ProMotion)
iPad Pro 11" (M4) 11.0" 2420 ×ばつ 1668 120Hz (ProMotion)
iPad Air 13" (M2) 12.9" 2732 ×ばつ 2048 60Hz
iPad Air 11" (M2) 10.86" 2360 ×ばつ 1640 60Hz
iPad (10th/11th gen) 10.9" 2360 ×ばつ 1640 60Hz
iPad mini (A17 Pro) 8.3" 2266 ×ばつ 1488 60Hz

Only the two Pro models get a 120Hz option — they're the only ones with a ProMotion panel; the others are physically capped at 60Hz, so streaming faster than that wouldn't be visible anyway. Any other iPad (or Android tablet) still works via the generic ×ばつ1440 / ×ばつ1080 profiles, just without an exact native-resolution match.

Requirements

  • Windows 10/11 PC with an NVIDIA GPU (NVENC). Other GPUs can fall back to software encoding, at a real latency/quality cost.
  • An iPad (or any Safari-capable device) on the same Wi-Fi network.
  • Python 3.11+.
  • For Extend mode only: a virtual display driver — this project is built and tested against VirtualDrivers/Virtual-Display-Driver (free, open-source, signed).

Quick start

cd sender
python -m venv .venv
.venv\Scripts\pip install -r requirements.txt
.venv\Scripts\python server.py

The console prints a URL (e.g. http://winpad.local:8765) and a QR code — open it in Safari on the iPad, on the same Wi-Fi network, then Add to Home Screen for a fullscreen, chrome-free view.

Prefer a GUI over a terminal? Double-click sender/WinPad.bat instead — it opens a small control panel (mode picker, resolution picker for Extend mode, live log, Start/Stop, a Donate button) and minimizes to the system tray when closed, so an active stream isn't interrupted by the window being in the way.

⚠️ Security note

There's no authentication by default — anyone who can reach the printed URL on your LAN can connect and see your screen. This is a deliberate trade-off for a same-room/same-home tool, not an oversight, but it means:

  • Only run this on a trusted private network (home Wi-Fi, not a coffee shop or office guest network).
  • Keep the Windows Firewall rule scoped to the Private network profile (the setup prompts for this on first run).
  • Don't port-forward this to the public internet.

FAQ

Can I really use an iPad as a second monitor for free? Yes. WinPad is MIT-licensed and self-hosted — there's no subscription, no license key, and no server that could start charging later. You run it on your own PC, forever, at no cost.

Does this need a USB cable? No. It runs entirely over your existing Wi-Fi network using WebRTC. USB is not required (Apple's MFi accessory licensing, required for USB-based tools, isn't available to an independent open-source project — see Why WinPad exists).

How much latency should I expect? Roughly 30–60ms glass-to-glass on a healthy home Wi-Fi network, thanks to hardware H.264 encoding (NVENC) on the PC and hardware decoding (VideoToolbox) on the iPad. That's well below what most general-purpose wireless display tools achieve.

Do I need an NVIDIA GPU? It's required for the hardware encoding path this project is tuned for. Other GPUs can fall back to software encoding, but expect higher latency and lower quality.

Will this work on Android tablets (Galaxy Tab, etc.) or other devices? Yes — the receiver is just a web page using standard WebRTC APIs, so it also works well on Android tablets like the Samsung Galaxy Tab line (and any other device with a modern RTCPeerConnection-capable browser), not just iPad. Chrome on Android is the best-tested non-Apple path; other Chromium-based tablet browsers should work too. iPad/Safari is still the primary, most-tested target and the only one with dedicated native-resolution profiles in the dropdown (see the table above) — other devices connect fine but use the generic ×ばつ1440 / ×ばつ1080 profiles instead of an exact per-model match.

Is my screen exposed to the internet? No — by design, this only works on your local network, and there's no authentication (see the security note above). Don't port-forward it.

A note on this release

This is v1.0.0, the first public release — it's had solid testing on the exact hardware/network path described above (NVIDIA GPU, iPad, VirtualDrivers/Virtual-Display-Driver), but hasn't been run against every GPU/tablet/driver combination out there yet. If you hit an error, please open an issue with your GPU, device, and the error/log output — reported issues get fixed in the next update.

Roadmap

  • Mirror mode: stream the primary display end-to-end over WebRTC
  • Hardware H.264 encode (NVENC) with cursor compositing
  • Extend mode via a virtual display driver
  • mDNS auto-discovery, auto-reconnect, system tray control panel
  • Cross-platform sender (currently Windows-only — DXGI/virtual-display APIs are Windows-specific, so this needs a real per-OS capture backend)
  • Touch/Pencil input passthrough back to the PC
  • Resolution/refresh-rate auto-negotiation from the iPad's real panel size

Contributing

Issues and PRs are welcome — this started as a personal project, so expect some rough edges outside the exact hardware/network path it was built and tested on (NVIDIA GPU, VirtualDrivers/Virtual-Display-Driver, iPad Safari). Reports of what works (or doesn't) on other GPUs/drivers are especially useful.

Support this project

WinPad is free forever and always will be — but if it saved you the price of a commercial alternative, consider buying the author a coffee. There's also a Donate button built into the sender's control panel.

License

MIT — do what you want with it.


Generated by Mehdi Bazzi

About

Free, open-source wireless second monitor for Windows using an iPad -- a self-hosted Duet Display / Astropad alternative over Wi-Fi.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /