Agentero
에이전트를 연결해 로컬 Vault에 연구 컨텍스트를 보관·Zotero에서 무결점 이동·읽고 이해·재활용
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Your Android phone on your Mac, over your own Wi-Fi: files, notifications, calls, clipboard, photos and screen mirroring. No account, no cloud.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Unison is a pair of native apps: a Mac menu-bar app and an Android app. You pair them once by scanning a QR code. After that they find each other on your local network and stay connected in the background. Send files either way, see and answer your phone's notifications and calls on the Mac, share the clipboard, browse your photos, and mirror and control your phone's screen.
Get it: the Mac app is a free download from venu005.github.io/unison. The Android app is coming soon to Google Play.
It's built by one person (developed on a Nothing Phone (3) running Android 17 and a MacBook Air running macOS 26). The Mac app is sandboxed, and the Android app is being prepared for Google Play.
| Status | |
|---|---|
| Pairing by QR code (or manual entry with fingerprint check), forget & re-pair on either side | ✅ |
| Always-on connection over local Wi-Fi with auto-reconnect (Wi-Fi drops, sleep/wake, reboots) | ✅ |
| Phone battery level and charging state in the Mac menu bar | ✅ |
| File transfer, both ways: resumable, SHA-256 checked, up to 3 at once | ✅ |
| Notifications mirrored to the Mac: reply, action buttons, dismiss both ways, per-app mutes | ✅ |
| Clipboard: Mac → phone automatic, phone → Mac in one tap, Mac history | ✅ |
Calls on the Mac: answer, decline, hang up, number pad and tel: links (audio stays on the phone) | ✅ |
| Photos: browse the phone's photos and videos on the Mac, preview, save, drag out | ✅ |
| Screen mirroring with phone audio, and remote control from the Mac's mouse and keyboard | ✅ |
| Small wins: ring my phone, media controls, open links on the other device | ✅ |
| "Share → Send to phone" from Finder | Parked |
From the Mac:
From the phone:
Receiving:
~/Downloads/Unison on the Mac and Download/Unison on the phone.Reliability:
*.macdroid-part until then. (1), (2), … Android phone (always the client) Mac (the server, advertised as _macdroid._tcp)
───────────────────────────────── ──────────────────────────────────────────────
finds the Mac via NSD / Bonjour ─────────────────────────▶ BonjourAdvertiser
OkHttp, mutual TLS 1.3, pinned:
WSS /v1/ws (control messages, JSON) ─────▶ ConnectionHub
POST /v1/pair (only while pairing is open) ──▶ PairingManager
HEAD/PUT/GET /v1/files/{id} (file bytes, resumable) ──▶ TransferManager
transfer.offer/accept/finish/result/…) travel as JSON over a WebSocket. File bytes go over HTTPS. Uploads resume with HEAD + Content-Range; downloads resume with Range.protocol/PROTOCOL.md, with JSON fixtures that both the Swift and the Kotlin test suites decode and re-encode.| Mac | macOS 14 or later |
| Android | Android 10 (API 29) or later; on Android 17 the app asks for the local network permission first |
| Network | Both devices on the same local network |
Toolchain (what the project is developed with):
brew install xcodegen)The Gradle wrapper is committed.
cd mac
xcodegen generate # creates MacDroid.xcodeproj (not committed)
xcodebuild -project MacDroid.xcodeproj -scheme MacDroid -configuration Debug -derivedDataPath build build
open build/Build/Products/Debug/Unison.app
Unison lives in the menu bar. Open it again (or press ⌘O in the popover) to show its window.
Builds are signed with a self-signed identity, "MacDroid Self-Signed". Create it once per Mac with scripts/make-signing-cert.sh. With it, keychain access ("Always Allow") survives rebuilds and updates.
Create android/local.properties with sdk.dir=/path/to/android/sdk, then:
cd android
./gradlew :app:assembleDebug
ANDROID_SERIAL=<device> ./gradlew :app:installDebug
# Mac core: protocol, pairing, server, transfer engine (Swift Testing)
cd mac/MacDroidCore && swift test
# Android: core library and app unit tests, plus a debug build
cd android && ./gradlew :core:test :app:testDebugUnitTest :app:assembleDebug
# End to end: the real Swift server against the real Kotlin client.
# It pairs, then sends 24 MiB each way, cuts the connection mid-file,
# and checks both files resume and match byte for byte.
./scripts/cross-platform-test.sh
On-device tests (Keystore TLS, MediaStore part files) live in android/app/src/androidTest. Run them with am instrument as described in the developer guide. Gradle's connectedDebugAndroidTest uninstalls the app afterwards, which loses your pairing.
All builds are expected to pass with no warnings.
mac/
MacDroidCore/ Swift package with all testable Mac logic: protocol, TLS identity, pairing,
Bonjour, Hummingbird HTTPS/WebSocket server, connection hub, transfer engine
MacDroid/ SwiftUI app (menu-bar popover + window); views stay thin
project.yml XcodeGen spec
android/
core/ Pure Kotlin/JVM: protocol, pinned mTLS client, pairing, connection manager,
transfer client and engine
app/ Android glue and Jetpack Compose UI (Material You)
protocol/ PROTOCOL.md and the shared JSON fixtures both test suites use
scripts/ Cross-platform test and icon rendering
design/icon/ App icon source art (SVG)
docs/handoff/ Living project docs: status, architecture, decisions, dev guide, changelog
docs/superpowers/ Design specs, implementation plans and follow-up lists
The site lives in website/ and is published at https://venu005.github.io/unison/; download the Mac app from Releases. Mac releases (Unison.dmg) are built with scripts/make-release.sh. See the developer guide.
Unison is free, with no ads and no account. If it saves you time, you can leave a one-time tip:
MIT © 2026 Venu005