Skip to content

About

Make your Android phone work with your Mac like an iPhone: screen mirroring, calls, SMS, files, clipboard and notifications over local Wi-Fi. No cloud.

Topics

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

5 Commits

Folders and files

Repository files navigation

Mac Connect icon

Mac Connect

Make your Android phone work with your Mac the way an iPhone does.

Mirror and control the phone, take calls, read and send texts, move files, browse your gallery, share the clipboard, and control the Mac from the phone. Everything travels over your own Wi-Fi. No cloud, no accounts, no tracking.

License: MIT macOS 13+ Android 8+ Swift Kotlin Vibe coded with Claude

Features · How it works · Install · Build from source · Architecture · Protocol


What is this?

Mac Connect is two apps that talk directly to each other on your local network:

  • Mac app: a menu-bar and window app in Swift and SwiftUI, for macOS 13 and later.
  • Android app: a companion app in Kotlin, for Android 8.0 (API 26) and later.

They find each other with mDNS (Bonjour), pair once with a QR code, and then exchange everything over a single TCP connection using Protocol Buffers. Your messages, calls, files, screen and clipboard never leave your network, because there is no server in the middle.

Apple's Continuity and Microsoft's Phone Link were the inspiration. This one is open, free, and runs entirely on hardware you own. It is vibe coded with Claude: I decided what it should do and tested it on a real Mac and phone every day, and Claude wrote the Swift and Kotlin.

Features

Screen mirroring and control

  • Live H.264 mirror of the phone screen on the Mac.
  • Control it with your mouse and keyboard: click to tap, click-drag to swipe, two-finger scroll, and type into text fields.
  • A right-click menu for Back, Home, Recents and Notifications, directional swipes, Wake Screen and Lock Phone.
  • Type your lock-screen or app-lock PIN from the Mac keyboard.
  • The phone screen stays awake while you use it, with its backlight near minimum, and closing the mirror stops capture. You watch on the Mac, so the phone's display never burns in.
  • Opening the mirror on the Mac asks for Touch ID.

Calls

  • A phone view on the Mac with Contacts, Recents (your real call history) and a Dial Pad.
  • Type numbers straight from the Mac keyboard.
  • An incoming-call pop-up on the Mac with Answer and Decline, and a ringtone.
  • Place calls from the Mac, mute, and hang up.

Find My Phone

  • A Find Phone tile in the menu bar makes the phone ring at full volume, even on silent, with a full-screen Stop button over the lock screen. It stops by itself after a minute.

Messages

  • Read and reply to SMS from the Mac in real time, with contact names.

Files

  • Browse the phone's storage like Finder, with Quick Look previews (Space), image and video thumbnails, and New Folder, Rename and Delete.
  • Drag files in and out between Finder and the phone, or use ⌘C and ⌘V.
  • Send files both ways, AirDrop style. Drop files on the Mac's send window and they land in the phone's Downloads. Share from any Android app to Mac Connect and they land in the Mac's Downloads and open in Finder.

Gallery

  • The phone's photos and videos on the Mac, in folders (All Media, Videos, Camera, Screenshots, WhatsApp and more).

Notifications

  • Phone notifications appear on the Mac with the real app name and icon, and respect macOS Focus and Do Not Disturb.
  • An on/off switch in the menu bar, and one sound per app every 30 seconds, so a busy group chat does not ding nonstop.

Clipboard

  • Copy on one device, paste on the other, including images, both ways.

Media

  • Control phone playback from the Mac, and Mac playback (Music, Spotify, or anything that listens to media keys, such as YouTube in a browser) from the phone.

Control the Mac from the phone

  • Volume, brightness, Wi-Fi, Bluetooth, lock, sleep, and a find-my-Mac sound.
  • Live Mac battery on the phone and live phone battery on the Mac.

Always connected

  • Pair once. After that the two reconnect on their own whenever they are on the same Wi-Fi, like AirPods, without scanning the QR code again. The Mac searches hard for a couple of minutes, then retries now and then to save battery, and reconnects the moment it wakes.
  • Bluetooth fallback. When Wi-Fi cannot carry the link, notifications, calls and SMS keep flowing over Bluetooth LE, and it switches back to Wi-Fi on its own.
  • Disconnect means disconnect. Press it and the Mac stops looking until you press Connect.

How it works

┌──────────────┐        mDNS discovery (_androidbridge._tcp)        ┌──────────────┐
│   Mac app    │  ◀───────────────────────────────────────────────▶ │ Android app  │
│  (SwiftUI)   │                                                     │   (Kotlin)   │
│              │        TCP + Protocol Buffers (one socket)          │              │
│  features ◀──┼────────────  envelope.oneof routing  ──────────────┼──▶ bridges   │
└──────────────┘                                                     └──────────────┘
        ▲                                                                    ▲
        └──────── QR pairing (one time): keys exchanged over TCP ───────────┘
  • Pairing. The Mac shows a QR code with its IP addresses and a port (47291). The phone scans it, connects, and the two exchange device IDs and public-key fingerprints over TCP.
  • Discovery and reconnect. The phone advertises itself over mDNS and the Mac browses for it. If mDNS is quiet, the Mac dials the phone's last known IP directly.
  • Transport. Every message is a protobuf Envelope with a oneof payload, sent length-prefixed over one TCP connection. The schema lives in Shared/proto/messages.proto and is described in docs/PROTOCOL.md.

The full breakdown is in docs/ARCHITECTURE.md, and every feature with its caveats is in docs/FEATURES.md.

Privacy

Everything is peer-to-peer on your LAN. There is no backend, no account and no telemetry. The only data that crosses the wire is what you ask for (a notification, a file you open, the screen while you mirror it), and it goes straight to your other device.

Install

Download both apps from the latest release, or build them from source with docs/BUILDING.md.

  1. Mac. Open MacConnect-x.y.z.dmg and drag Mac Connect to Applications. It runs on Intel and Apple Silicon Macs with macOS 13 or later. The first time you open it, macOS says it cannot check the app for malware, because it is not notarised by Apple. Open System Settings → Privacy & Security, scroll down, and click Open Anyway. You only do this once. Then allow Local Network, Camera, Microphone and, if you want them, Notifications.
  2. Android. Install MacConnect-x.y.z.apk (allow installs from your browser or file manager when Android asks). During onboarding, grant Messages, Contacts, Phone, Photos and Media, Notification access, Accessibility, and "Display over other apps". The in-app privacy screen explains what each one is for.
  3. Pair. Open Mac Connect on the Mac, which shows a QR code. On the phone tap Pair with Mac and scan it. Both devices must be on the same Wi-Fi network.

About sideloading. The Android app uses sensitive permissions (SMS, call log, accessibility) and is installed outside the Play Store, so Google Play Protect may warn about it. That is expected for a self-hosted tool like this.

Limitations

What is not possible, and why:

  • Call audio through the Mac's mic and speakers. Android and macOS block this for non-system apps. You can control calls, not carry their audio.
  • Unlocking the phone with Touch ID from the Mac. Android has no API for it. You can wake the screen and type your PIN from the Mac keyboard instead.
  • Seeing the secure lock screen. Android blocks capture of secure surfaces, so the lock screen shows black in the mirror. Typing the PIN still works.
  • Encryption on the wire. The connection is plain TCP on your LAN, with no TLS yet. It is meant for a trusted home or office network.
  • Bluetooth carries the essentials only. Notifications, calls and SMS work over the Bluetooth fallback. Mirroring, files and the gallery need Wi-Fi.

Project layout

MacApp/            SwiftUI Mac app (XcodeGen project in project.yml)
AndroidApp/        Kotlin Android app (Gradle)
Shared/proto/      messages.proto, the single source of truth for the protocol
docs/              architecture, protocol, features, build guide
scripts/           build_dmg.sh, build_apk.sh, app icon generator

Documentation

Doc What is in it
docs/FEATURES.md Every feature, how it works, and its caveats
docs/ARCHITECTURE.md Project layout, connection model, components
docs/PROTOCOL.md The wire protocol and message catalogue
docs/BUILDING.md Build, sign and package both apps
CONTRIBUTING.md How to contribute
SECURITY.md Reporting security problems

Contributing

Contributions are welcome. Start with CONTRIBUTING.md. The ground rules are simple: nothing leaves the local network, and every protocol change is implemented on both sides.

License

MIT. Free to use, change and share. Built by Hussain Trawadi, vibe coded with Claude.

About

Make your Android phone work with your Mac like an iPhone: screen mirroring, calls, SMS, files, clipboard and notifications over local Wi-Fi. No cloud.

Topics

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages