Your Mac, PC, Linux box, Android phone and iPhone, working as one desk.
One mouse and keyboard for every computer. Screens, files, clipboard, notifications, cameras, calls and texts, shared.
Free and open source. No account, no cloud, and on iPhone not even an app to install.
Intel Macs, Windows on ARM, .deb, Arch, NixOS and everything else: all downloads · iPhone without an app: TwinDesk Web
What's new in 3.0 · iPhone and iPad · Computers · Android · AirPlay · Every app · How it compares · Get started · Website
You probably own more than one computer. A work laptop and a gaming PC. A MacBook and the Windows machine you can't give up. A Linux box under the desk. And a phone that's never more than a metre away. Each one is great on its own. Together they're a mess: two keyboards, files emailed to yourself, a phone you keep picking up, the same tab opened three times.
TwinDesk turns all of them into one desk.
Push the mouse off the edge of your Mac's screen and it carries on onto the PC, keyboard and all. Copy on one, paste on the other. Drag a file across the edge and drop it there. Open the PC's apps in windows on your Mac. Turn a tablet into a second screen. Answer your phone's calls from the computer, use its camera in your video calls, and drive the computer from the couch with it. Walk to another device and ReZume brings the tab, the video or the document you were on with you.
It's one app on every computer, so a Mac and a PC pair exactly like two Macs. Phones are full peers,
not notification mirrors. And an iPhone, an iPad or any device with a browser joins by typing
twindesk.local.
|
🔀 Any combination |
📡 Anywhere |
🔒 Yours alone |
⚡ Built for speed |
|
🍎 macOS |
🪟 Windows |
🐧 Linux
|
🤖 Android
|
📱 iPhone and iPad |
🍺 Homebrew on macOS:brew install --cask inukaasith/twindesk/twindesk
Update with brew upgrade --cask twindesk: TwinDesk opens again by itself if it was running, so a Mac you drive only through it gets its mouse back. The tap follows every release.
Already on 2.5? The in-app updater picks the right file. Update every device you pair: 3.0 still talks to 2.5, and the new features switch on when both sides have 3.0.
Every file and older version is on the releases page.
⚠️ First launch: the apps aren't code-signed how to allow them on macOS, Windows, Android and iPhone
TwinDesk is free and has no paid Apple Developer ID or Windows code-signing certificate, so macOS and Windows don't know who made it and ask once before opening it. The source is all here.
🍎 macOS
The easiest way is Homebrew, which installs it ready to open:
brew install --cask inukaasith/twindesk/twindesk
From the .dmg instead:
- Drag TwinDesk into Applications and open it. macOS says it can't verify TwinDesk: click Done (not Move to Bin).
- Open System Settings › Privacy & Security, scroll down to Security and click Open Anyway next to "TwinDesk was blocked". Enter your password, then click Open Anyway again.
You do this once; updates open normally. If macOS says TwinDesk is damaged and can't be opened, it isn't: run this in Terminal, then open it again:
xattr -dr com.apple.quarantine /Applications/TwinDesk.app🪟 Windows
- If the browser warns that the file isn't commonly downloaded, choose Keep (in Edge: ⋯ › Keep › Show more › Keep anyway).
- When the installer shows Windows protected your PC (SmartScreen), click More info, then Run anyway.
On Windows 11 with Smart App Control on, unsigned apps are blocked with no Run anyway button. The only way past it is turning it off (Windows Security › App & browser control › Smart App Control settings), and on many Windows 11 versions it can't be turned back on without reinstalling Windows.
🤖 Android
- Open the downloaded .apk. Android asks to allow your browser or Files app to install unknown apps: tap Settings, turn on Allow from this source, go back and tap Install.
- If Play Protect warns about an unrecognised developer, tap More details › Install anyway.
The full app (notifications, texts and Accessibility) is easiest installed by the computer over wireless debugging (Phone page › Notifications from the phone): Android then lets you turn those on. Installed by hand, Play Protect may block it, and Android 13 and later grey out notification access and Accessibility as a restricted setting: open Settings › Apps › TwinDesk, tap ⋮ › Allow restricted settings, then turn them on.
📱 iPhone and iPad
The IPA is unsigned: AltStore, SideStore or another signing tool signs it with your own Apple ID (how). The first time, iOS may ask you to trust your Apple ID as a developer in Settings › General › VPN & Device Management. TwinDesk Web needs none of this.
|
🌐 TwinDesk Web |
📱 iPhone and iPad app |
🤝 Phone to phone |
|
🪟 Glass look |
📺 AirPlay on Windows and Linux |
🌍 Five languages, every app |
Also new: Tailscale when devices aren't on the same network, mouse and keyboard over Bluetooth for crowded Wi-Fi, the phone keyboard as a real USB keyboard, pens (an Apple Pencil, a stylus or a drawing tablet) with pressure and tilt in screen viewers, 4K screens, idle links that let laptops and phones sleep, and a round of security hardening. The full list is in the 3.0.0 release notes.
| 🌐 TwinDesk Web | 📱 The app | |
|---|---|---|
| Install | Nothing. Safari, then Add to Home Screen if you like | AltStore, SideStore or any signing tool, with your Apple ID |
| Best for | Trying TwinDesk in ten seconds, a borrowed iPad, any laptop or tablet | Everyday use: background link, USB, Bluetooth, Share Screen |
| Connects over | Same Wi-Fi | Wi-Fi, USB cable (to a Mac), Bluetooth |
| The computer's screen | ✅ mirror or extend, touch, Apple Pencil | ✅ mirror or extend, touch, Apple Pencil |
| Files, clipboard, notifications, remote, camera, microphone | ✅ | ✅ |
| The iPhone's own screen on the computer | through AirPlay | ✅ Share Screen, or AirPlay |
| Photos on the computer, Shortcuts, Back Tap, Lock Screen media | Shortcuts | ✅ |
Every TwinDesk computer can serve the iPhone app's little sibling straight to a browser. It works on an iPhone, an iPad, a Chromebook, a friend's laptop, anything with a modern browser.
- On the computer, open TwinDesk › TwinDesk Web and switch it on. A pairing code and a QR code appear. (Mac, Windows and Linux, in one-to-one and Multi-device mode.)
- On the iPhone, on the same Wi-Fi, open Safari and type
twindesk.local. Or just point the Camera at the QR code. - Enter the code once. That's the pairing. The computer shows the browser in its sidebar as one more device.
- Optional, recommended: Share › Add to Home Screen. TwinDesk then opens like an app, connects by itself, and the computer's notifications arrive as real alerts through Web Push, sent by your own computer with no server in between.
What you get in the browser:
- Receive screen: the computer's screen, mirrored or as an extra display, with touch, a touchpad mode, keyboard, sound and the Apple Pencil as a pen on an iPad.
- Files both ways, and Drop: a chat-like place for notes, links and photos.
- Clipboard both ways, the computer's notifications, Ring, Lock and Sleep.
- Remote: trackpad and keyboard, a gamepad (or a real one on the computer), the phone's camera and microphone on the computer.
- Send screen through the computer's AirPlay receiver, and Shortcuts actions.
- Several computers on the network? The pairing page lists them all to pick from.
A native SwiftUI app with every page of the Android app. On the computer, an iPhone is a phone like any other.
- The computer's screen on the iPhone or iPad, mirrored or as a second display, with touch, a touchpad mode and the Apple Pencil as a pen, pressure, tilt and eraser included.
- Share Screen: the whole iPhone screen in a window on the computer, every app, like presenting in a video call.
- Files both ways, Send to Computer in the share sheet, and the computer's folder in Files.
- Photos on the computer: its Photos page shows the iPhone's photos and videos, newest first.
- Clipboard both ways, the computer's notifications, its sound on the iPhone, the iPhone's camera and microphone on the computer.
- Remote (touchpad and keyboard, gamepad, voice typing) and Media with the computer's Now Playing on the Lock Screen.
- Wi-Fi, USB cable or Bluetooth. Off screen the session moves onto Bluetooth, and back to Wi-Fi when you open TwinDesk.
- Shortcuts and Back Tap: send the clipboard, send files, show the computer's screen, lock it, play or pause.
- iPhone gets a tab bar (Liquid Glass on iOS 26), iPad gets a sidebar with two columns, drag and drop and keyboard shortcuts.
TwinDesk isn't on the App Store yet (that's what sponsoring pays for), so you install the IPA with your own Apple ID:
- Install AltStore or SideStore on the iPhone.
- Tap Add to AltStore (or SideStore) above on the iPhone, or add this source by hand:
https://raw.githubusercontent.com/InukaAsith/TwinDesk/main/altstore.json - Install TwinDesk from the source. It updates from there when a new version is out.
With a free Apple ID, apps installed this way have to be refreshed every 7 days; AltStore and SideStore do it for you in the background. Needs iOS or iPadOS 16 or later.
A Mac and a Windows PC. Two Macs. A gaming PC and a Linux laptop. Pair any two computers and they behave like one: one mouse and keyboard, one clipboard, files that go where you drag them, and each other's screens, apps, cameras and speakers whenever you want them. Every feature has its own page and its own switch, and nothing runs until you turn it on.
Push the pointer off the edge of your screen and keep working on the other computer, as if they were one. Your keyboard follows the pointer, and so do Caps Lock, media keys, volume and brightness. Trackpad gestures (Spaces swipes, pinch to zoom, show desktop) carry over. Each computer's own trackpad takes its pointer back, shake the mouse to find the pointer, and a double-tap of the hotkey brings everything home.
- Where the other computer is: drag the screens on the Mouse page to match your desk.
- Cursor lock keeps the pointer on the computer it's on: Scroll Lock (F14 on a Mac), the Mouse page, or the tray and menu bar.
- Over Bluetooth on busy Wi-Fi (new in 3.0, off by default): the pointer and keys ride Bluetooth while screens, files and the clipboard stay on Wi-Fi.
Hold Right Ctrl (Right Command on a Mac), grab a window and drag it past the edge of the screen. It moves to the other computer and keeps working there. Let go of it on the way back and it returns to where you grabbed it.
Open a Windows app on your Mac (or a Mac app on your PC) and it gets a window of its own, with its own Dock icon or Start-menu pin. No full remote desktop, just the app you need, next to your own.
Extend your Mac onto a PC or another Mac with a real virtual display, or mirror it. Or bring the other computer's screen into a window and control it from there.
- Low-latency H.264 or H.265, hardware encoding with a fallback, up to 4K.
- Fastest, Smooth or Steady playback, a frame-rate cap, and optional frame generation.
- Pens (new in 3.0): a stylus, a drawing tablet or an Apple Pencil over Sidecar draws on the other computer with pressure, tilt and eraser. Real multitouch on Windows.
- Linux: Extend on GNOME and X11, and a guide for KDE Plasma on Wayland.
Drag files across the screen edge and drop them anywhere, or copy with ⌃⌥C and
paste with ⌃⌥V (Ctrl+Alt+C/V on Windows and Linux), into a folder or straight
into the app in front. Send from the macOS Share menu or Explorer's Send to, or share a folder
that shows up as a network drive on the other side. Big and small, files move on fx2.
Need a shell? ssh twindesk opens one on the other computer, no passwords needed.
Copy on one computer and paste on the other, instantly or when you switch over. Pictures go too, up to 10 MB: take a screenshot with Win+Shift+S on the PC and paste it on the Mac. Entries from password managers are skipped, and a Recent list keeps the last few things you copied.
Show the other computer's camera in a window, or send it to a webcam every app can pick: TwinDesk Camera in Zoom, Teams, Meet or the browser. A computer shares its camera only when you allow it, and a popup there says who is watching. The same works with a phone's camera.
Hear one computer's sound on the other, and use one computer's microphone on the other, each way on its own switch. See one computer's notifications on the other as native notifications. Wake a sleeping computer with Wake-on-LAN.
| Page | What it's for |
|---|---|
| Overview | The other computer at a glance: Ring, Lock, Sleep, Bluetooth, Do not disturb, volume, its clipboard and a drop zone |
| Connection | Nearby devices, pairing by code or QR, Bluetooth and Wi-Fi Direct |
| Share screen / Receive screen | Extend or mirror onto the other computer, or see and control its screen |
| Apps | The other computer's apps in windows of their own |
| Mouse / Keyboard | The screen layout, cursor lock, the hotkey, shortcuts that follow the pointer |
| Clipboard / Notifications / File Sharing | Each way on its own switch, with Recent, per-app rules and shared folders |
| Audio / Camera | Sound and microphone both ways, the camera in a window or as TwinDesk Camera |
| ReZume | Continue the other computer's tab, video or document here |
| TwinDesk Web / AirPlay & SMB | Phones and browsers with no app, AirPlay mirroring and a folder for the Files app |
| Multi-device | TwinDesk Mesh: every device at once |
| General | Appearance (Glass or Simple, light or dark, accent), language, Tailscale, permissions, engines in use |
Your laptop, your desktop, the Linux box in the corner and your phone, all connected at once, each talking straight to the others with no hub in between.
- One mouse, every screen. Line your devices up on the map once, and the pointer goes from the PC to the Mac to the Linux laptop to the phone.
- One clipboard. Copy on any of them, paste on any other. The newest copy wins.
- One notification pool. Your phone buzzes, and every computer shows it.
- Pair once, join all. A new device paired with one computer meets the rest by itself.
Mesh is in beta: what's in and what's still coming
Turn it on in the Multi-device page, and off again any time with everything as you left it. Connecting just two devices? You won't need it. Still coming to Mesh: the Camera, ReZume, pictures on the clipboard, and files dragged to more than one device at a time. The phone connects to one computer at a time, and Linux joins over the same Wi-Fi only. Mesh uses the tdv2 lane in Node. See docs/mesh.md.
AirPlay used to stop at Apple TVs and Macs. With TwinDesk 3.0, a Windows PC and a Linux box are AirPlay receivers too. Open Control Center on an iPhone or iPad, tap Screen Mirroring, and your PC is in the list, right next to the Apple TV. Pick it, and the whole iPhone screen appears on the computer, with its sound. A Mac mirrors to it the same way.
- No app on the iPhone. It's the AirPlay already built into iOS, iPadOS and macOS.
- Screen and sound, for presenting, demos, a game on the big screen, or a video from any app.
- Video or music only: tap AirPlay in Photos, Safari, Music or YouTube and pick the computer.
- On a Mac, macOS has its own AirPlay Receiver; the page shows where to switch it on and the three taps on the iPhone.
- Pairs with everything else: with the iPhone app or TwinDesk Web, mirroring is how the iPhone shares its screen; the TwinDesk app can also do it with Share Screen.
Plus SMB for the Files app. The same page shares a folder on the computer that an iPhone or iPad adds in Files › ⋯ › Connect to Server, so the computer's files sit right next to iCloud Drive.
Most phone links stop at notifications and a file drop. In TwinDesk your Android phone or tablet is a full peer: it pairs like a computer and gets the same features, plus its calls, texts, photos, files, apps and camera. On the computer, the phone's Overview is one tap from everything: customizable Shortcuts (show its screen, send files, notifications, apps), Quick actions (Wi-Fi, Bluetooth, Do not disturb, torch, ring mode and volume), its battery, signal, network and storage, the latest clipboard and its most-used apps.
Answer, decline and make your phone's calls from the computer. When it rings, a small window shows who's calling with Answer and Decline. With Bluetooth, the computer becomes the phone's headset, so you talk and listen right there. Read and reply to your texts, WhatsApp, Instagram and Telegram on Messages, pictures included.
Open single Android apps in windows of their own, side by side with your desktop apps. Pin them to the Dock or the Start menu and use them like any other app, with your mouse and real keyboard. Mirroring shows the whole phone in a window instead, with touch, mouse, keyboard and its sound. Install .apk files on the phone straight from the computer.
Browse the phone's photos and videos, open any of them big, save or remove one or many. Phone Files browses the phone's whole storage: save, upload, rename, delete, or just drop files on the page. Shared folders work both ways. On a Mac, Mount puts the phone in Finder like any drive.
The phone's back or front camera in a window on the computer or as the TwinDesk Camera webcam in any video call, and the phone as a microphone for the computer.
Push the pointer past the screen edge and it carries on onto the phone. Type in any Android app with your real keyboard. New in 3.0: the phone keyboard as a real USB keyboard, so every symbol and accent in the phone's own layout comes out right.
- Touchpad and keyboard for the couch or a presentation, with the keys a phone keyboard lacks.
- Gamepad, laid out like an Xbox controller. Its buttons press the keys you choose, or turn on Real gamepad and the computer sees an actual controller (Windows and Linux).
- A Bluetooth gamepad for any computer, the Mac included, with no TwinDesk and no driver there.
Turn a tablet or phone into an extra monitor. Extend for more desktop space, or Mirror to show what's on your screen. Use touch as the mouse, or switch on touchpad mode.
- Files. Send to computer or Copy to computer from any Android app's share menu; from the computer, the Share menu, Send to, a drag across the screen edge or ⌃⌥C / Ctrl+Alt+C.
- Clipboard. Text and pictures both ways, the phone's screenshots included.
- Notifications. The phone's on the computer as native notifications, per app, and the other way around.
- Media. What's playing on the phone, with play, pause, skip and seek on the computer, and the computer's Now Playing on the phone.
- Sound. The phone's sound on the computer, or the computer's on the phone.
| On the computer | On the phone |
|---|---|
| Overview with Shortcuts and Quick actions, Connection | Overview with the computer's Ring, Lock, Sleep and volume, Connect |
| Messages, Calls, Photos, Apps | Screen: be the computer's second screen, or see its screen |
| Mirroring, Share screen | Files: send, copy and receive |
| Mouse, Keyboard, Remote | Remote: touchpad, keyboard, gamepad |
| Clipboard, Notifications, File Sharing, Phone Files, Mount | ReZume, Clipboard, Notifications, Sound, Media, Camera |
| Audio, Camera, ReZume | General: name, theme and accent, language, background, permissions |
Android to Android, iPhone to iPhone, Android to iPhone. Pair two phones like a computer, then share the clipboard, notifications, files both ways, photos, messages and screens. Either phone can host, and a phone-to-phone session takes the computer's place while it lasts.
You were reading something on the PC. You sit down at the Mac. A button is already waiting in the Dock: Continue. Click it and the same page is open, the video is at the same second, the document is ready to edit.
- Web pages, read straight from the browser's address bar, opened in your default browser.
- Videos at the same moment: YouTube, Vimeo, Twitch, Dailymotion or a video file.
- Documents three ways: a Preview copy, Edit the original live (save on the Mac, it's saved on the PC), or the app's own Window streamed across.
- Phone ↔ computer: the phone's tab or app on the computer, and Open on computer in the share sheet.
- Off until you turn it on, and a document's path never leaves the device.
How ReZume reads what you're doing, and what it never sends
| From | What | How it's read |
|---|---|---|
| Windows | Browser tab | The address bar through UI Automation, else the browser's own files |
| Windows | Document | Windows' Recent list matched to the window title; else the app's command line, PotPlayer's and VLC's lists, or Store apps (Photos, Media Player) by the app in their frame |
| Mac | Browser tab | Safari and Chromium browsers through Apple Events (asked once per browser); Firefox from its session |
| Mac | Document | The front window's document; for VLC, IINA and others, Spotlight's most recently used file of the name in the title |
| Linux | Browser tab | The address bar through AT-SPI (X11 and Wayland), else Firefox's session or Chromium's history |
| Linux | Document | recently-used.xbel and KDE's recent documents matched to the window title, or VLC's list |
| Phone | Tab or app | TwinDesk's Accessibility (full app), or wireless debugging when that's off |
- Off until you turn it on, one switch for the pair. Until then nothing is read and nothing is asked.
- A document's path never leaves the device. Only its name and size do, and the file goes only to the side that asked for it.
- Edit shares only that one file (and the lock and temporary files the app makes beside it), over WebDAV inside TLS with the session's own certificate and a secret path. It's unmounted when the session ends.
- Preview copies live in a cache folder that's emptied when TwinDesk quits.
- Only
httpandhttpsaddresses are ever opened. - Allowlists: every app ReZume has met is listed with a switch, how often it was sent and when. New apps can start allowed or blocked.
The full design is in docs/rezume.md.
- tdv2: every mouse move travels on its own encrypted UDP lane, in native Rust inside the helper. A lost packet never holds back the next one, a move never waits behind a file, and nothing is allocated per move, so no garbage collector ever pauses your pointer.
- fx2: files move in a process of their own, in parallel ranges, hashed while they stream. 10,000 small files went from a PC to a Mac in under 48 seconds.
- Quiet when idle: with nothing in use, links stop pinging every second so laptops and phones can sleep, and every engine starts only when it's needed.
- Always compatible. Older TwinDesk, Bluetooth, or a firewall that blocks UDP? Everything falls back by itself. General › Advanced › Engines in use shows what this session runs on.
tdv2 in detail: the wire, the crypto and the guarantees
Why. Until 2.5 every mouse move rode the same TLS-over-TCP stream as everything else. On Wi-Fi, one lost packet holds back every byte behind it until it's resent (head-of-line blocking), so the pointer stuttered for 20–300 ms whenever the air got busy or a file was on its way. On top of that, each move was turned into JSON in the helper, parsed by Node, and garbage-collected.
The lane. When both sides have 2.5, the session negotiates a UDP lane next to it (il: {v: 1}
in hello and welcome). Each move is one small authenticated packet:
'T''L' | ver | type | seq u64 | AES-256-GCM(body) | 16-byte tag
MOVE: route, move number, last event number, running total x, y
- Exact under loss. Each MOVE carries the running total, not a delta, so a lost packet costs nothing: the next one puts the pointer exactly where it belongs. The last move is sent again at +8 ms and +24 ms so the pointer always lands where you stopped.
- Clicks never overtake moves. Clicks and keys are numbered, fenced to the moves before them and sent on both the lane and the reliable session; the receiver applies them in order, exactly once.
- Secure. Per-session keys from HKDF-SHA256, AES-256-GCM, a 64-packet replay window as in WireGuard. Anything that doesn't authenticate is dropped.
- Follows you. The peer's address is the last authenticated packet's, so the lane follows a switch between Wi-Fi and cable.
- Prioritised. Voice-class DSCP marking (a qWAVE flow on Windows), and Windows' Wi-Fi low-latency mode while you drive.
Native. native/tdfast (Rust, C ABI) is linked into the Swift helper on the Mac, the C helper
on Linux and loaded by the C# helper on Windows. Moves go from the input hook to the socket and
from the socket into the OS's input without touching JavaScript. The helpers, Node's fallback lane,
Multi-device and the Android app allocate nothing per move, and the Windows helper runs with the
sustained-low-latency GC mode.
Fallback. No lane (an older app, Bluetooth, UDP blocked) means input stays on the session exactly as before. General › Advanced › Input protocol lets you pick UDP (tdv2), the default, or TCP (tdv1). The old and new protocols side by side: docs/protocol.md.
fx2 in detail: the file engine
- Its own process. A "TwinDesk Files" utility process runs its own HTTPS server, so reading, hashing and writing never block the window, the clipboard or input.
- Parallel ranges. A large file is fetched as several byte ranges at once.
- Verified while streaming. Every range is hashed on the way and the hashes travel with
file.end, so a received file is checked without being read again. - Small files fast. Up to 16 files in flight, asynchronous writes with backpressure on every receiver, and no O(n²) queue scans.
- Hardened. A file stops at the size it was offered with, a full disk fails cleanly, and a sender can't choose the name of a temporary file.
- Negotiated as
fx2in hello and welcome. An early failure falls back to the previous HTTPS path, then to chunks on the session. Bluetooth, Wi-Fi Direct and older apps keep working.
You never have to choose. TwinDesk uses the same network when there is one, moves a phone onto the USB cable when you plug it in, and falls back to Bluetooth when the Wi-Fi goes: on a train, or in a café whose guest Wi-Fi blocks devices. When a screen or a big file needs more than Bluetooth, TwinDesk brings up a direct Wi-Fi link for as long as it's needed. Away from home, devices on the same Tailscale network find each other too.
What works over which link
| Same Wi-Fi | USB cable | Bluetooth | + Wi-Fi Direct or hotspot | |
|---|---|---|---|---|
| Session, clipboard text, notifications | ✅ | ✅ | ✅ | ✅ |
| Mouse and keyboard, remote | ✅ | ✅ | ✅ | ✅ |
| Calls and texts | ✅ | ✅ | ✅ | ✅ |
| Screens, apps, cameras, files, photos, clipboard pictures | ✅ | ✅ | moves to Wi-Fi Direct | ✅ |
Terminal between computers (ssh twindesk) |
✅ | — | on Wi-Fi Direct | ✅ |
Who can turn up over Bluetooth is up to you: Bluetooth with phones (on) and Bluetooth with computers (off until you want it), on the Connection page.
The same TwinDesk runs on Mac, Windows and Linux. The phone apps and TwinDesk Web connect to any of them. The iPhone and iPad app and TwinDesk Web are new in 3.0.
✅ yes · ◐ partly · ✗ no · — doesn't apply
What each app can do
| Mac | Windows | Linux | Android | iPhone and iPad | TwinDesk Web | |
|---|---|---|---|---|---|---|
| Get it | .dmg | installer | .deb, AppImage, Arch, Nix | .apk | .ipa, sideloaded | nothing to install: a browser, or add it to the Home Screen |
| Connecting | ||||||
| Same Wi-Fi | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| USB cable | ✅ phones | ✅ Android | ✅ Android | ✅ | ◐ to a Mac | ✗ |
| Bluetooth | ✅ | ✅ | ✅ | ✅ | ✅ | ✗ |
| Wi-Fi Direct or hotspot | ✅ | ✅ | ✅ | ✅ | ✗ | ✗ |
| Several devices at once (Mesh) | ✅ | ✅ | ◐ same Wi-Fi only | ◐ one computer at a time | ◐ one computer at a time | ◐ one computer at a time |
| Phone to phone | — | — | — | ✅ | ✅ | — |
| Mouse and keyboard | ||||||
| Shares its mouse and keyboard | ✅ | ✅ | ✅ | — | — | — |
| The pointer carries onto it | ✅ | ✅ | ✅ | ✅ | ✗ | ✗ |
| Drag windows to another computer | ✅ | ✅ | ◐ Xorg | — | — | — |
| Remote: touchpad, keyboard and gamepad | — | — | — | ✅ | ✅ | ✅ |
| Real gamepad on the computer | — | — | — | ✅ | ✅ | ✅ |
| Bluetooth gamepad, no TwinDesk on the computer | — | — | — | ✅ | ✗ | ✗ |
| Screens and apps | ||||||
| Shows its screen on another device | ✅ | ✅ | ✅ | ✅ | ✅ | ◐ not in Safari on iPhone |
| Extends onto another device | ✅ | ✅ | ◐ GNOME, X11 | — | — | — |
| Sees and controls a computer's screen | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Apple Pencil as a pen on the computer | — | — | — | — | ✅ iPad | ✅ iPad |
| Its apps in windows on another computer | ✅ | ✅ | ◐ Xorg | ✅ | ✗ | — |
| Files and clipboard | ||||||
| Clipboard, text and pictures | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Send files both ways | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Drag files across the screen edge | ✅ | ✅ | ◐ out of Linux on Xorg | ✅ | ✗ | ✗ |
| Shared folder | ✅ | ✅ | ✅ | ✅ both ways | ◐ the computer's, in Files | ◐ the computer's |
| Its photos and files on the computer | — | — | — | ✅ | ◐ photos, the app's files | ✗ |
| Drop: messages and files, like a chat | — | — | — | ✗ | ✗ | ✅ |
Terminal (ssh twindesk) |
✅ | ✅ | ✅ | — | — | — |
| Camera and sound | ||||||
| Its camera as a webcam on a computer | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Its microphone on a computer | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Plays a computer's sound | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Its sound on the computer | ✅ | ✅ | ✅ | ✅ | ◐ through AirPlay | ✗ |
| Phone and more | ||||||
| Calls answered on the computer | — | — | — | ✅ | ✗ | ✗ |
| Texts, WhatsApp, Instagram, Telegram | — | — | — | ✅ | ✗ | ✗ |
| Its notifications on the computer | ✅ | ✅ | ✅ | ✅ | ✗ | ✗ |
| The computer's notifications here | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ when added to the Home Screen |
| Media controls | ✅ | ✅ | ✅ | ✅ both ways | ◐ the computer's, on the Lock Screen | ✗ |
| ReZume | ✅ | ✅ | ✅ | ✅ | ✗ | ✗ |
Most of the ✗ on iPhone and iPad come from iOS itself: an app there can't read other apps' notifications, handle calls or texts, or be driven by another device's mouse.
Most tools do one part of this: a shared mouse and keyboard, a phone link, a second screen or file sending. TwinDesk does all of them in one app, on every platform. These tables were made in November 2026. If something here is out of date or wrong, please open an issue and it will be fixed.
✅ yes · ◐ partly · ✗ no · — not confirmed
Computer to computer
| TwinDesk | Synergy 3 | Deskflow | ShareMouse | Mouse without Borders | Universal Control | |
|---|---|---|---|---|---|---|
| Platforms | Mac, Windows, Linux | Mac, Windows, Linux | Mac, Windows, Linux | Mac, Windows | Windows | Mac, iPad |
| Linux on Wayland | ✅ | ◐ | ✅ | ✗ | ✗ | ✗ |
| Mouse and keyboard across the edge | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Trackpad gestures and media keys carry over | ✅ | ✗ | ✗ | ✗ | ✗ | ✅ |
| Shared clipboard, text | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Shared clipboard, pictures | ✅ | ◐ | ◐ | — | ✅ | ✅ |
| Drag files across the edge | ✅ | — | ✗ | ✅ | ✅ (small files) | ✅ |
| Drag windows to the other computer | ✅ | ✗ | ✗ | ✗ | ✗ | ✗ |
| The other computer's apps in windows of their own | ✅ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Extended display and remote screen | ✅ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Camera as a webcam on the other computer | ✅ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Sound and microphone between computers | ✅ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Notifications from the other computer | ✅ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Shared folders and a terminal | ✅ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Wake-on-LAN | ✅ | ✗ | ✗ | — | ✗ | ✗ |
| Three or more computers | ✅ (Mesh, beta) | ✅ | ✅ | ✅ | ✅ (up to 4) | ✅ (up to 3) |
| Works without a shared network | ✅ Bluetooth, Wi-Fi Direct | ✗ | ✗ | ✗ | ✗ | ✅ |
| At the login and lock screen | ✗ | ✅ | ✅ | ✅ | ◐ | ✗ |
| Works with Barrier and Input Leap | ✗ | ✗ | ✅ | ✗ | ✗ | ✗ |
| Input travels over | UDP (tdv2), TCP fallback | TCP | TCP | TCP | TCP | Apple's own |
| Account or licence | none | licence | none | licence | none | Apple ID |
| Price | free | paid | free | free and paid | free | free |
Phone to computer
| TwinDesk | Phone Link | KDE Connect | Apple Continuity | scrcpy | LocalSend | |
|---|---|---|---|---|---|---|
| Computers | Mac, Windows, Linux | Windows | Linux, Windows, Mac | Mac | Mac, Windows, Linux | all |
| Phones | Android, iPhone and iPad | Android, iPhone (fewer features) | Android, iPhone (fewer features) | iPhone, iPad | Android | all |
| Notifications | ✅ both ways | ✅ | ✅ both ways | ✅ | ✗ | ✗ |
| Answer calls, talk through the computer | ✅ | ✅ | ◐ alerts, mute | ✅ | ✗ | ✗ |
| Texts | ✅ SMS, WhatsApp, Instagram, Telegram | ✅ SMS | ✅ SMS | ✅ iMessage, SMS | ✗ | ✗ |
| Phone screen mirroring and control | ✅ | ✅ some phones | ✗ | ✅ not in the EU | ✅ | ✗ |
| Phone apps in windows of their own | ✅ | ✅ some phones | ✗ | ✗ | ◐ | ✗ |
| Photos | ✅ | ✅ | ◐ | ✅ iCloud | ✗ | ✗ |
| The phone's whole storage | ✅ | ◐ | ✅ | ✗ | ✗ | ✗ |
| Send files both ways | ✅ | ✅ | ✅ | ✅ AirDrop | ◐ | ✅ |
| Clipboard | ✅ text and pictures | ✅ | ✅ text | ✅ | ✅ | ✗ |
| Phone as a webcam | ✅ | ✅ | ✗ | ✅ | ✅ | ✗ |
| Phone as a microphone | ✅ | ✗ | ✗ | ✅ | ◐ | ✗ |
| Tablet as a second screen | ✅ | ✗ | ✗ | ✅ Sidecar, iPad | ✗ | ✗ |
| Phone as touchpad, keyboard or remote | ✅ | ◐ | ✅ | ✗ | ✗ | ✗ |
| Phone as a gamepad, or a real controller | ✅ | ✗ | ✗ | ✗ | ✗ | ✗ |
| The computer's mouse carries onto the phone | ✅ | ✗ | ✗ | ✅ iPad | ◐ in its window | ✗ |
| Media controls | ✅ | ✅ | ✅ | ◐ | ✗ | ✗ |
| USB, Bluetooth, Wi-Fi Direct | ✅ all three | ◐ | ◐ | ✅ | USB, Wi-Fi | ✗ same network |
| Setup | an app; wireless debugging for screen, apps and camera | built into Windows | an app | built in | USB debugging | an app |
| Account | none | Microsoft account | none | Apple ID | none | none |
- Download TwinDesk for each computer and your phone (above). On an iPhone you can skip this: use TwinDesk Web.
- Open it on both. They find each other on the same network, over Bluetooth, or over a USB cable for a phone.
- Pair once by comparing a code or scanning a QR code (on a USB cable, just click Allow). From then on they connect by themselves.
- Turn on what you want. Every feature starts off and isn't even loaded until you switch it on.
For an Android phone's screen, apps and camera in windows, TwinDesk walks you through turning on wireless debugging once (details). Files, clipboard, calls and photos work without it.
| Pair | What you get |
|---|---|
| Mac ↔ Windows PC, Mac ↔ Mac, PC ↔ PC | Every computer feature |
| Linux ↔ Mac, PC or Linux | Every computer feature (a few differences) |
| Android ↔ Mac, Windows or Linux | Every phone and tablet feature (Real gamepad on Windows and Linux) |
| iPhone or iPad ↔ Mac, Windows or Linux | The app's features, or TwinDesk Web with no app |
| Any browser ↔ Mac, Windows or Linux | TwinDesk Web: screen, files, clipboard, notifications, remote |
| Phone ↔ phone | Clipboard, notifications, files, photos, messages and screens (more) |
| All of them at once | TwinDesk Mesh (beta) |
TwinDesk only talks to devices you've paired with, directly over your own network, Bluetooth, a direct Wi-Fi link or a cable. There are no accounts, no telemetry and no cloud relay. Your calls, texts, photos and camera go straight from the phone to your computer and nowhere else. Pairing locks out an address that keeps guessing wrong. The only internet request is an update check against GitHub's public releases, which you can turn off.
Free code signing on Windows provided by SignPath.io, certificate by SignPath Foundation.
Only the Windows installers built from this repository by the Build Windows GitHub Actions workflow, on GitHub-hosted runners, are signed. Every signing request is approved by hand.
- Committers and reviewers: @InukaAsith (outside contributors send pull requests, which he reviews before merging)
- Approvers: @InukaAsith
This program will not transfer any information to other networked systems unless specifically requested by the user or the person installing or operating it (see Privacy above: the only automatic request is the update check against GitHub's releases, which can be turned off).
Everything below is for the curious and for people building TwinDesk themselves.
X11 and Wayland, shared folders, Extend, virtual camera and gamepad
On Linux, TwinDesk runs on both X11 and Wayland. On Wayland, the mouse and keyboard go through evdev and uinput (the Setup screen grants access once), screens are captured through the desktop portal, and the clipboard goes through wl-clipboard. A few things work a little differently:
-
Input access on Wayland. Reading
/dev/inputmeans reading every key typed, so it goes to TwinDesk's helper alone: Setup's Fix installs a setgidinputcopy of the helper (the NixOS module a wrapper) and never adds your account to theinputgroup. General › Input access › Remove undoes it. Details and the manual undo are in docs/nixos.md. -
Shared folder. Sharing uses Samba. The first time, one password prompt installs it if it's missing and adds a network-only account. The other computer's folder is connected with GVFS and shows in the file manager's sidebar.
-
Copy and paste files. Ctrl+Alt+C copies what's selected in the file manager in front (or files you already copied), and Ctrl+Alt+V pastes into the file manager window in front (else Downloads). Right-click › Send to works in Nautilus, Nemo, Caja, Dolphin and Thunar.
-
Dragging files across the edge. Files dragged in from the other computer are dropped into the folder under the pointer, or the desktop. On Wayland, they go to the file manager window in front. Dragging files out of Linux needs an Xorg session.
-
Extend. On GNOME (Wayland) it uses Mutter's own virtual monitor; pick "Virtual remote monitor" when the desktop asks which screen to share. On X11 it switches on a spare output of the graphics driver (not available on NVIDIA's driver). That needs a small helper, which the .deb installs; with the AppImage, Share screen › TwinDesk virtual display › Install puts it in once, with your password.
-
Apps and ReZume windows. Opening this computer's apps on the other side needs an Xorg session.
-
Virtual camera and gamepad. TwinDesk Camera is a v4l2loopback device, and Real gamepad a uinput controller ("TwinDesk Gamepad"); each asks for your password once, the first time it's turned on.
-
Bluetooth and Wi-Fi Direct. Bluetooth LE goes through BlueZ, and direct Wi-Fi links through NetworkManager, hosted beside the computer's own Wi-Fi where the adapter allows (2.4 GHz groups for a phone).
-
The input lane. If firewalld blocks inbound UDP, the tdv2 lane never comes up and input stays on the session, as in 2.4.
-
Android phone. Everything in Android works on Linux too. The package carries adb; the Setup screen's firewall fix opens mDNS (5353/udp) so the phone's wireless debugging is found.
the phone app page by page, and wireless debugging
Install TwinDesk on the phone, open it next to TwinDesk on the computer and pair from Connect › Nearby, or scan the computer's QR code. The phone needs Android 10, and Android 11 for everything that goes through wireless debugging.
Tabs at the bottom on a phone (Overview, Connect, Screen, Files, More), a sidebar on a tablet. Every page names the computer it's connected to:
| Page | What it does |
|---|---|
| Overview | The computer you're connected to, its TwinDesk version, Ring, Lock, Sleep and its volume |
| Connect | Connect, Disconnect and Switch, nearby computers to pair with, QR pairing, Bluetooth, and the wireless debugging card until that's set up |
| Screen | Use the phone as a screen for the computer: Mirror, or Extend the desktop onto it, with touch or touchpad mode |
| Files | Send files, copy them to paste on the computer, and see where the computer's files land |
| ReZume | Continue the computer's page or document here, and send this phone's to the computer |
| Mouse | The computer's mouse on the phone across the screen edge, Full (ADB) or Limited control |
| Keyboard | The computer's keyboard types on the phone, every key as a key, so any layout works |
| Remote | The phone as the computer's touchpad and keyboard, or as a gamepad |
| Calls, Messages, Photos | What the computer may use: calls, texts and the gallery |
| Clipboard, Notifications, Sound, Camera | Each way on its own switch |
| General | The phone's name, the theme and accent, background running, and the permissions TwinDesk uses |
And outside the app:
- Share sheet: Send to computer, Copy to computer and Open on computer in every app's Share menu.
- Quick Settings tiles: Send clipboard and Wireless debugging.
- The ongoing notification shows what's connected, with Exit.
- The computer can install the full app over wireless debugging (Phone page › Notifications from the phone): Play Protect blocks downloaded apps that read notifications or texts, or use Accessibility, so the download leaves those out and the computer adds them. Settings and pairing stay.
Files, the clipboard and notifications work right away. The phone's screen, its apps in windows, touch, your mouse and keyboard on the phone and its sound go through wireless debugging, which TwinDesk pairs with once:
- Until it's paired, a card on Connect (on the computer and on the phone) walks you through it. Open Developer options › Wireless debugging › Pair device with pairing code on the phone and type the 6-digit code on the computer, or on the phone in TwinDesk's notification.
- After that TwinDesk switches wireless debugging on by itself when it needs it, follows it to its new port every time it restarts, and keeps the pairing from expiring. Phones that switch it off on every Wi-Fi change or screen lock (MIUI, HyperOS) get it switched back on as soon as they're unlocked. Wireless debugging only runs while USB debugging is on too, so TwinDesk turns both on.
- Xiaomi, Redmi and POCO also need Developer options › USB debugging (Security settings) for touch, mouse and keyboard. Without it the screen shows but input is refused.
- Limited control works without wireless debugging, through TwinDesk's Accessibility in the full app.
- On a Mac, the phone in Finder. Turn it on in the Mount page and click Mount: the phone shows under Locations like any server.
the Electron app, the native helpers, the Rust lane and the links between devices
Each computer runs an Electron app, which handles the window, pairing, the link and the state machines. Next to it runs a small native helper for everything the OS keeps to itself: capturing and injecting input, virtual displays, gestures, window capture and native drag and drop. Inside each helper, tdfast (Rust) runs the tdv2 input lane.
| Folder | What's in it |
|---|---|
mac/ |
macOS app (Electron) |
mac-helper/ |
macOS helper (Swift): virtual display, event tap, input injection, audio, apps, SMB |
windows/ |
Windows app (Electron) and installer |
windows-helper/ |
Windows helper (C#): hooks, SendInput, Raw Input touchpad, window capture, native drag |
linux/ |
Linux app (Electron) |
linux-helper/ |
Linux helper (C): XInput2 / XTest on X11, evdev / uinput on Wayland, XRandR, window list, XDND edge strip |
native/tdfast/ |
The tdv2 input lane (Rust, C ABI), linked into every helper |
android/ |
Android app (Kotlin, Jetpack Compose); the computers drive the phone through adb and scrcpy's server |
ios/ |
iPhone and iPad app (SwiftUI, iOS 16+): the app, the Share Screen broadcast extension and the share extension, built in CI into an unsigned IPA |
web/ |
TwinDesk Web, the browser client each computer serves at twindesk.local (a PWA with Web Push) |
shared/ |
Used by every app: the wire protocol, the input lane, fx2, ReZume, the Bluetooth pipe and Wi-Fi Direct links, the phone hub, shared folders, frame generation and icons |
The link between two devices is one TLS session wherever it runs: on the local network, through
a phone's USB cable (adb), or through Bluetooth LE (a GATT pipe of TwinDesk's own,
shared/blepipe.js). When a session on Bluetooth needs bandwidth, shared/netlink.js brings up a
Wi-Fi Direct group or joins a phone's hotspot, moves the session onto it, and takes it down
again once nothing needs it.
Beside the session run the tdv2 UDP lane for input (shared/inputlane.js, native/tdfast),
fx2 for files (shared/fx2-engine.js in its own utility process) and WebRTC for screens,
cameras and sound. Each is negotiated in hello and welcome and falls back by itself.
Ports: TCP 47800 (the session and files), UDP 47801 (discovery), and the input lane and fx2 on ports the two sides agree on per session.
what runs in Chromium, what doesn't, and what it costs
"Electron app" often means "a browser tab that eats a gigabyte". TwinDesk uses Electron for what Chromium is genuinely best at, and keeps everything else out of it.
What Electron does here
- The windows you click around in: the pages, the sidebar, settings. One codebase draws the same app on Mac, Windows and Linux, which is why a Mac and a PC pair exactly like two Macs.
- Media. Chromium's WebRTC stack gives TwinDesk hardware H.264/H.265 encoding and decoding, low-latency screen streaming, cameras and sound on every OS, battle-tested by billions of video calls. Writing that natively three times would be slower to ship and less reliable.
- The session logic (pairing, the link, state machines) in Node, shared with every platform.
What Electron doesn't do
- Input never touches JavaScript. Mouse moves go from the OS's input hook to the network and back
into the other OS through a small native helper (Swift on Mac, C# on Windows, C on Linux) and
tdfast, a Rust core. Nothing is allocated per move, so no garbage collector can stall your pointer. - Files move in a separate utility process (fx2), started only when a transfer needs it.
Why it stays light
- Nothing loads until you turn it on. Every feature is off on a new install, and a feature that's off isn't even required into memory.
- Windows that aren't needed go away. Hidden helper windows (popups, viewers, the HUD) are closed after 30 seconds of not being needed, instead of keeping a renderer alive all day.
- Event-driven, not polling. Idle links don't ping every second, and timers run only while something needs them. In the tray on a Mac, TwinDesk measured about 0.3% CPU for the app and 0% for its helper.
- It starts fast: compiled code is cached on disk, and each window loads English plus its own language only.
What it costs. On a MacBook Air, with the window open and an Android phone connected, all of TwinDesk's processes together used 147 MB (resident memory, measured while writing this). Most of that is Chromium itself, the same engine your browser and chat apps already keep in memory, and it doesn't grow with how long TwinDesk runs.
Want to see what your session uses? General › Advanced › Engines in use lists the input lane, the file engine and the connection in use right now, and why a faster one isn't, if it isn't.
macOS, Windows, Linux, NixOS, Android and GitHub Actions
You need Node.js 18+ on every platform, and Rust for the native input lane (without cargo the helpers build without it and Node's lane is used).
xcode-select --install # Swift compiler for the helper
rustup target add aarch64-apple-darwin x86_64-apple-darwin
cd mac
npm install
npm run build:helper
npm start # run from source
npm run dist && npm run dmg # build TwinDesk.app and TwinDesk-<version>-<arch>.dmg in mac/dist/The disk image is named after the app inside it: TwinDesk-3.0.0-arm64.dmg for Apple Silicon,
TwinDesk-3.0.0-x64.dmg for Intel. Keep arm64 and x64 in the names on a release: the in-app
updater picks the one for each Mac by them. npm run dist:x64 && npm run dmg (or npm run dmg:intel) builds the Intel app from an Apple Silicon Mac, cross-compiling the helpers and tdfast.
On first launch, TwinDesk asks for Screen Recording, Accessibility and Input Monitoring (once; after that the General page shows each permission's status).
npm run dist signs the app with a certificate of its own, made the first time in
~/.twindesk-signing (keep a backup). macOS keeps permissions per signature, so with the same
certificate they carry over when an update is dragged into Applications.
cd windows
npm install
npm run build:helper :: .NET Framework's csc.exe, and tdfast.dll with cargo
npm start
npm run dist :: NSIS installer in windows\dist\
npm run dist -- arm64 :: the Windows on ARM installer (or `x64 arm64` for both)For the arm64 lane, rustup target add aarch64-pc-windows-msvc. The installer adds the firewall
rules (for every network profile, and one for the helper's input lane). The Setup screen, shown
once, offers to fix the firewall if something changed and to install the optional Virtual Display
Driver for Extend.
sudo apt install build-essential libx11-dev libxi-dev libxtst-dev libxext-dev libxrandr-dev libxfixes-dev
cd linux
npm install
npm run build:helper
npm start
npm run dist # AppImage and .deb in linux/dist/The Setup screen walks you through the rest. On Wayland that means input access (one admin
prompt, then log out and back in once). Extend on GNOME Wayland uses Python 3 with GObject and
GStreamer's PipeWire plugin (python3-gi, gstreamer1.0-pipewire), which GNOME desktops already have.
TwinDesk includes a flake.nix with package, dev shell, and NixOS module support:
nix run github:InukaAsith/TwinDesk # run directly
nix develop # development environment{
programs.twindesk = {
enable = true;
user = "yourusername"; # adds to input/uinput groups for Wayland KVM
};
}See docs/nixos.md for full options (firewall, Wi-Fi Direct capability wrappers, virtual displays, and more).
linux/scripts/vm-test.sh runs it in a Parallels Desktop Linux VM: it
copies this checkout into the VM, builds the helper, starts TwinDesk in the VM's desktop session and
drives it from the Mac.
linux/scripts/vm-test.sh start # sync, build and (re)start it in the VM
linux/scripts/vm-test.sh shot linux.png # screenshot of its window
linux/scripts/vm-test.sh logcd android
./gradlew assembleRelease # JDK 17+; app/build/outputs/apk/{standard,full}/release/standard is the build people download. full adds notification access, the SMS permissions
(Messages) and the Accessibility service, which Play Protect blocks in downloaded apps; the computers
install it over wireless debugging, so npm run dist on each platform bundles the newest
android/dist/*-full.apk.
Build Android, Build Linux, Build Windows and Build AUR (Actions tab › Run workflow)
make the standard and full APKs, the AppImage and .deb, the x64 and arm64 installers with the
native lane, and the Arch package. Set the ANDROID_KEYSTORE secret to the key the Android app is
signed with (base64 -i ~/.android/debug.keystore): the APKs then install over existing ones, and
the Linux and Windows builds carry the full Android app.
Build Windows signs the installers through SignPath: set the
SIGNPATH_API_TOKEN secret to the SignPath CI user's API token and pick the signing policy
(test-signing, release-signing, or none for unsigned) when running the workflow. Alternatively,
to Authenticode-sign with a certificate of your own, set WIN_CSC_LINK to a base64-encoded
code-signing .pfx and WIN_CSC_KEY_PASSWORD to its password (run with signing none). When
WIN_CSC_LINK is set, the build fails if signing can't complete instead of publishing an unsigned
installer.
TwinDesk is better for everyone who sent a pull request:
- @ari7hkm: pairing lockout (#138) and the DPAPI-sealed passphrase (#139)
- @Southertly: Simplified Chinese (#110) and Windows fixes (#106–#109)
- @cashflowbeatz: session, input and transfer fixes (#117)
- @Ahmedcodedk: Wayland fixes (#113, #120)
- @VighneshKunjir: safer received files (#78–#80)
- @hughesyadaddy (#129), @GlazeCookie (#95), @iiiiiuri (#85), @AmriteshKhare (#76), @jayden99236 (#71)
- @DevPsycho-07: the phone as a remote (#44), screenshots across the clipboard (#45), phone window controls (#46) and phone fixes (#43)
- @benzntech: the phone's camera (#48), Developer ID signing and notarization (#40) and the Mac's downloads (#39)
- @atse25029-collab: WhatsApp and Instagram in phone windows (#42) and the arrow-keys swipe (#82)
- @philopaterwaheed: Cursor lock (#49)
- @ghustanov: wireless debugging's auto-off (#31) and the Mac helpers' Info.plist (#30)
- @m-uvex: the Nix flake and NixOS module (#37)
- Erdoğan Yeşil (@erdodo): the mesh TwinDesk Mesh is built on (#29), and #8 and #9
- @Jay-Prajapati01: signed Windows installers (#13)
And thanks to everyone who reports problems and shares ideas in the issues.
TwinDesk is free software, licensed under the GNU General Public License v3.0. Copyright © 2026 inukaasith.
Parts are adapted from DeskPad (MIT). See THIRD_PARTY_NOTICES for details.
The AirPlay receiver (Windows and Linux) is adapted from UxPlay and the projects it builds on; see THIRD_PARTY_NOTICES. AirPlay, Apple TV, iPhone, iPad and Mac are trademarks of Apple Inc. TwinDesk is not affiliated with or endorsed by Apple.


























